资源描述
,单击此处编辑母版标题样式,*,第七章 循环结构程序,7.1 循环结构程序的提出,7.2 循环结构程序的组成,7.3 循环控制指令,7.4 数据串操作指令,7.5 循环程序的控制方法,7.6 单重循环程序举例,7.7 多重循环程序设计,7.8 循环程序的效率,1,7.1 循环结构程序的提出,在许多实际应用问题中,经常遇到某一段操作需反复进行的情况。如下面的例子。,例7.1,设内存DATA1和DATA2开始分别存放50个无符号字数据,编制程序将两个存储区对应字数据求和并存入SUM开始的单元。,利用顺序结构编写求和程序,首先设置源操作数和目的操作数指针,设置存放结果指针,接着从源指针指出的字单元取出数据,与目的指针指出的字单元的数据相加,和存入结果的字单元,然后,修改各地址指针,使之指向下一个字数据,求和,保存结果,.直至50对字数据全部求和后,程序结束。,2,1:;*EXAM7.1.1*,2:SSEG SEGMENT STACK,3:STACK DB 50 DUP(0),4:SSEG ENDS,5:DATA SEGMENT,6:DATA1 DW 15H,36H,45H,27BH,.,7:DATA2 DW 174H,03H,5BCH,390H,26H,.,8:SUM DW 50 DUP(0),9:DATA ENDS,10:CSEG SEGMENT,11:ASSUME CS:CSEG,DS:DATA,12:ASSUME SS:SSEG,13:START:MOV AX,DATA,14:MOV DS,AX,15:MOV AX,SSEG,16:MOV SS,AX,17:MOV SP,SIZE STACK,18:LEA BX,DATA1,19:LEA SI,DATA2,20:LEA DI,SUM,21:MOV AX,SI,22:ADD AX,BX,23:MOV DI,AX,24:ADD BX,2,25:ADD SI,2,26:ADD DI,2,27:MOV AX,SI,28:ADD AX,BX,29:MOV DI,AX,30:ADD BX,2,31:ADD SI,2,32:ADDDI,2,:,315:MOV AX,SI,316:ADD AX,BX,317:MOV DI,AX,318:MOV AH,4CH,319:INT 21H,320:CSEG ENDS,321:END START,3,7.2 循环结构程序的组成,初始化部分,:,为循环程序做好准备,以保证程序能够正常运行。这一部分往往在循环程序的开头,逻辑上先从这部分开始执行。这一部分一般是,设置地址指针的初值、计数器的初值及程序中用到的某些寄存器和某些内存单元的初值,,初始化部分只执行一遍,位于循环体的外面,不参与循环。,工作部分,:,是循环程序的主体,从初始化部分设置的初值开始,动态地反复执行相同的操作。这部分,完成循环程序所要实现的功能,,即需要重复进行的工作。,5,修改部分,:,与工作部分协调配合,,对参加运算的数据或地址指针以及结果单元的地址指针进行恰当的修改,,以保证循环程序在循环的过程中,每次循环都能正确地得到参加运算的数据,并正确地存放运算结果。,控制部分,:,保证循环程序按预定的循环次数或某种预定的条件正常循环,能控制循环程序正常退出循环。,工作部分、修改部分和控制部分合在一起称为,循环体。,1:*EXAM7.1.2*,:.,18:LEA BX,DATA1,19:LEA SI,DATA2,20:LEA DI,SUM,21:MOV CX,50,22:AGAIN:MOV AX,SI,23:ADD AX,BX,24:MOV DI,AX,25:ADD BX,2,26:ADD SI,2,27:ADD DI,2,28:DEC CX,29:JNZ AGAIN,30:MOV AH,4CH,31:INT 21H,6,两种结构,先执行后判断,先判断后执行,相当于C语言中DoWhile结构,相当于C语言中While结构,7,1.LOOP 重复控制指令,2.LOOPZ/LOOPE 条件重复控制指令,3.LOOPNZ/LOOPNE 条件重复控制指令,4.JCXZ CX为零转,注:所有的循环控制指令都是短转移指令,目标地址在-128127之间,7.3 循环控制指令,8,LOOP 指令举例,MOV CX,50,AGAIN:MOV AX,SI,ADD AX,BX,MOV DI,AX,ADD BX,2,ADD SI,2,ADD DI,2,LOOP AGAIN,DEC CX,JNZ AGAIN,10,LEA SI,STR1,LEA DI,STR2,MOV CX,8,AGAIN:MOV AL,SI,MOV AH,DI,INC SI,INC DI,CMP AL,AH,LOOPE AGAIN,JNE STOP,.,.,.,STOP:,12,LOOPNE/LOOPNZ条件循环控制,DSEGSEGMENT,STR1:DBCOMPUTER,CHR:DBM,DSEGENDS,CSEGSEGMENT,ASSUME CS:CSEG,DS:DSEG,START:MOVAX,DSEG,MOVDS,AX,LEASI,STR1-1,MOVCX,8,MOVAL,CHR,AGAIN:INCSI,CMPAL,SI,LOOPNEAGAIN,JEFOUND,.,.,.,FOUND:,CSEGENDS,ENDSTART,14,三条循环控制指令的特点,特点,:,均为短转移指令;,使用,CX,作为循环控制计数器,使用前要对,CX,赋初值;,CX,先减,1,,然后判断,决定转移的去向。,问题:如果CX为0,15,4.JCXZ CX为0转,指令汇编格式:JCXZ 目标地址,操作:如果CX为0,转向目标地址执行,如果CX0,则执行后续指令。,受影响的状态位:没有,JCXZ OK,AND CX,CX,JZ OK,LEASI,STR1,LEADI,STR2,MOVCX,8,JCXZSTOP,AGAIN:MOVAL,SI,MOVAH,DI,INCSI,INCDI,CMPAL,AH,LOOPAGAIN,JNESTOP,.,.,.,STOP:,16,循环指令举例,内存DATA单元存放着9个字节数据,试,统计其中偶数的个数,并将结果在屏幕上显,示。,17,CSEGSEGMENT,ASSUME CS:CSEG,DS:DSEG,START:MOV AX,DSEG,MOV DS,AX,MOV AH,4CH,INT 21H,CSEG ENDS,END START,DSEGSEGMENT,DATADB0B5H,2,45Q,20H,30H,0D3H,1,23,20H,DSEGENDS,LEA SI,DATA ;取有效地址,XOR DL,DL ;计数器清0,MOV CX,9;置循环次数,MOV AL,SI,TEST AL,01 ;结果为0表示为偶数,JNZNEXT;DL加1,否则判断下一个,INC DL,INC SI,LOOPJUDGE,;在屏幕输出DL中的数字,JUDGE:,NEXT:,18,1.计数法,此方法适用于循环次数已知的循环程序,其特点是简单方便。计数法又分为正计数法和倒计数法两种。,(1),正计数,(2),倒计数,20,(1)正计数,将计数器的初值设置为,0,,每执行一遍工作部分,计数器值增,1,,然后与规定的已知循环次数比较,若相等,则退出循环,否则,继续执行循环体。,举例:计算,S=i,i=0,100,MOVAX,0,MOVBX,0,AG:,ADDAX,BX,INCBX,CMPBX,100,JBEAG,21,CSEGSEGMENT,ASSUME CS:CSEG,DS:DSEG,START:MOV AX,DSEG,MOV DS,AX,MOV AH,4CH,INT 21H,CSEG ENDS,END START,DSEGSEGMENT,DATADB0B5H,2,45Q,20H,30H,0D3H,1,23,20H,,COUNT DB 50,RLT DB 0,DSEGENDS,LEA SI,DATA ;取有效地址,XOR DL,DL ;计数器清0,XORCH,CH,MOV CL,COUNT;置循环次数,MOV AL,SI,AND AL,AL ;SF为0表示负数,JNSNEXT;DL加1,否则判断下一个,INC DL,INC SI,LOOPJUDGE,MOV RLT,DL,JUDGE:,NEXT:,23,2.寄存器终值控制法,此方法类似于计数法,用一个寄存器存放初始值,每执行一次循环体该寄存器的值都按某种规律而有所变化,直到该寄存器值达到某一终值退出循环。,与计数法不同之处是,:,1,)寄存器的值本质上不一定是循环的次数,可能是一个操作数的地址,也可能是时间的一种表示或程序中要使用的其他数据。显然,这种控制方法比计数法适用问题更为广泛。,2,)控制寄存器的初值或终值也不一定是,0,或循环计数值;所使用的寄存器也不一定限于,CX,。,例,7.3,内存,DATA,开始存放若干个单字节无符号数,数据末地址为,DTEND,,,编制程序将其中最大数送入,MAX,单元。,24,3.条件控制法,用于循环次数未知的情况。在循环次数未知的程序中,虽然有时循环次数可以通过某种方法求得,但比较麻烦;而有时循环程序的循环次数根本无法求得。例如“,统计查找STR开始,以$结束的字符串中是否存在字母M,”这样的问题。,利用问题本身的结束条件来控制循环结束的方法叫条件控制法,。此方法适用于循环次数未知的情形,比前两种方法更具一般性,因而也稍复杂。LOOP指令对完成此控制方法无能为力,需要用条件转移指令来实现此控制方法。,26,看如下的一种加密方式(替代加密):,A B C D E F G H I J K L M N O P Q R S T,Y Z D M R N H X J L I O Q U W A C B E G,U V W X Y Z,F K P T S V,明文:THIS IS A COMPUTER,密文:GXJE JE Y DWQAFGRB,编写程序,将存在STR开始的内存单元中以$,结束的字符串“THIS IS A COMPUTER$”转换为相,应的密文并存储在原来的位置,并在屏幕上输出,转换的结果。,27,28,循环体:,TRANS:MOV AL,SI,CMP AL,$,JE STOP,CMP AL,JE NEXT,SUB AL,A,XLAT,NEXT:MOV SI,AL,MOV DL,AL,MOV AH,2,INT 21H,INC SI,JMP TRANS,STOP:,控制部分,工作部分,修改部分,30,例7.4,内存DATA字单元存放一个完全平方数,编制程序求其平方根并存入ROOT字单元。,31,
展开阅读全文