资源描述
2020/8/15,第章循环程序设计,1,8086/8088和ARM核汇编语言程序设计,第章 循环程序设计,2020/8/15,第章循环程序设计,2,.1 循环程序结构,.2 循环程序设计,第章 循环程序设计,2020/8/15,第章循环程序设计,3,循环程序一般由三个部分组成: 循环初始化部分 :循环初始化部分。一般要进行地址指针、循环次数及某标志的设置,相关寄存器的清零等操作。 循环体:是要求重复执行的程序段部分,对应于要求重复执行的操作。 循环控制部分:由该部分修改并判断控制循环的条件是否满足,以决定是否继续循环。,.1 循环程序结构,2020/8/15,第章循环程序设计,4,.1 循环程序结构,循环程序有两种结构形式,DO_WHILE循环程序,DO_UNTIL循环程序,2020/8/15,第章循环程序设计,5,.1 循环程序结构,循环控制的方法:, 计数控制法(循环次数已知的循环控制方法) 当循环次数已知时,通常使用计数控制法。 条件控制法(循环次数未知的循环控制方法) 有些情况,循环的次数无法事先确定,但它与其中的某些条件有关。选定某些条件来控制循环,每循环一次,测试一次条件,条件满足,继续循环,不满足,退出循环. 混合控制法(已知循环次数和循环继续的条件),2020/8/15,第章循环程序设计,6,.1 循环程序结构,循环控制的方法-计数控制法,先将循环次数的初值N送入循环计数器,然后,每循环一次,循环计数器减1,直至循环计数器中的内容为0时结束循环。,MOVCX,N ;置初始值部分 LAB: ;工作部分 ;修改部分 DEC CX;控制部分 JNZ LAB,2020/8/15,第章循环程序设计,7,.1 循环程序结构,循环控制的方法-计数控制法,先将循环次数初值N的负数-N送入循环计数器,然后每循环一次,计数器加1,直至循环计数器的内容为0时结束循环。,MOVCX,-N;置初始值部分 LAB: ;工作部分 ;修改部分 INCCX;控制部分 JNZLAB,2020/8/15,第章循环程序设计,8,.1 循环程序结构,循环控制的方法-计数控制法,先将0送入循环计数器中,然后每循环一次,计数器加1,直至循环计数器与循环次数N相等时退出循环。例如:,MOVCX,0 ;置初始值部分 LAB: ;工作部分 INCCX ;修改部分 CMPCX,N ;控制部分 JNZ LAB,2020/8/15,第章循环程序设计,9,.1 循环程序结构,循环控制的方法计数控制法,7.1 统计AX寄存器中为1位数的,并将统计结果放在CL寄存器中。 采用计数控制法,MOVCL,0 ;置循环初值 MOVBX,16 LAB:SALAX,1 ;将AX的内容左移一位,即最高位移到CFJNCLAB1 ;如果CF=0则表示AX的最高位为0,转LAB1 INCCL ;如果CF=1则表示AX的最高位为1,个数加1 LAB1: DECBX ;修改循环次数,未完则转LAB JNZ LAB EXIT:,2020/8/15,第章循环程序设计,10,.1 循环程序结构,7.1 统计AX寄存器中为1位数的,并将统计结果放在CL寄存器中。 采用条件控制法,MOVCL,0 LAB: ANDAX,AX JZEXIT;AX=0时循环结束,转到EXIT SALAX,1;将AX中的最高位移入CF中 JNCLAB;如果CF=0则转LAB INCCL;如果CF=1则CL+1CL JMPLAB;转LAB处继续循环 EXIT:,循环控制的方法条件控制法,2020/8/15,第章循环程序设计,11,.2 循环程序设计,1. 单循环程序设计 所谓单重循环,就是循环体内不再包含循环。,例7.2 已知有几个元素存放在以BUF为首址的字节存贮区中,试统计其中正数的个数,并存放在随后的NUM字节单元中。,2020/8/15,第章循环程序设计,12,.2 循环程序设计,DATA SEGMENT BUFDB 23,56,-6,89,52,-89,-63,5,-12,52,0,89,-8 NUM DB0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR START: PUSHDS XORAX,AX PUSHAX MOVAX,DATA MOVDS,AX MOVCX,NUM-BUF MOVAX,0 LEABX,BUF,2020/8/15,第章循环程序设计,13,.2 循环程序设计,AGAIN: CMPBYTE PTR BX,0 JLELAB1 INCAX LAB1: INCBX LOOPAGAIN MOV NUM,AL RET MAIN ENDP CODE ENDS,2020/8/15,第章循环程序设计,14,.2 循环程序设计,2. 多重循环程序设计,设计多重循环程序时注意下面两点:,(1) 内层循环必须完全包含在外层循环内,(2)在每次通过外层循环进入内层循环时,内层循环的初始条件必须重设。,2020/8/15,第章循环程序设计,15,.2 循环程序设计,例7.4 有一首地址为ADDR的N字数组,编制程序使该数组按照从大到小的顺序排列。,这里采用起泡排序算法,从第一个数开始依次对相邻两个数进行比较,大数在前,小数在后,若次序不对,则两个数交换位置。,数108169032 第一遍101690328 第二遍169032108 第三遍903216108,2020/8/15,第章循环程序设计,16,.2 循环程序设计,开始,COUNT1 N-1,COUNT2 COUNT1,I0,AI=AI+1,AIAI+1,I=I+1,COUNT2COUNT2-1,COUNT1COUNT1-1,COUNT2=0?,COUNT1=0?,结束,Y,N,Y,Y,N,N,2020/8/15,第章循环程序设计,17,.2 循环程序设计,mov cx,count;CX数组元素个数 dec cx;元素个数减1为外循环次数 outlp:mov dx,cx;DX内循环次数 mov bx,offset addr inlp:mov ax,bx;取前一个元素 cmp ax,bx+2;与后一个元素比较 jge next ;前一个大于等于后一个元素,则不进行交换 xchg ax,bx+2;否则,进行交换 mov bx,ax next:add bx,2;下一对元素 dec dx jnz inlp;内循环尾 loop outlp;外循环尾,2020/8/15,第章循环程序设计,18,.2 循环程序设计,为提高效率,可以采用另一种结束外循环的方法:设立一个交换标志,每次进入内循环之前使其置1;在内循环中每做一次数据交换操作就将该标志位置0。在每次内循环结束后,可以测试交换标志,如为0,则再一次进入外循环;如该位为1,则说明上一遍比较没有引起数据交换,数组已经整序完毕,这样就可以结束外循环。 本例流程图见图7.6,2020/8/15,第章循环程序设计,19,.2 循环程序设计,程序清单:,DATA SEGMENT COUNT DW10 ADDR DW 25H,36H,89H,-96H,45H,52H,30H,78H,12H,99H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR START:MOVAX,DATA MOVDS,AX MOVCX,COUNT,2020/8/15,第章循环程序设计,20,.2 循环程序设计,LAB1: MOVBX,1 DECCX JZEXIT PUSHCX LEADI,ADDR LAB2: MOVAX,DI CMP DI+2 ,AX JLE LAB3 XCHGDI+2,AX MOV DI,AX XORBX,BX,LAB3: ADD DI,2 LOOP LAB2 POP CX CMP BX,0 JZ LAB1 EXIT: MOV AH,4CH INT 21H MAIN ENDP CODE ENDS ENDSTART,2020/8/15,第章循环程序设计,21,.2 循环程序设计,设计循环程序应该注意: 使用LOOPZ、LOOPNZ指令实现循环控制时,控制的一个依据是CX减1后的值,另一个依据是前一条影响ZF标志位的指令产生的ZF标志。为了提供后一个依据,必须根据题意在循环工作部分设置合适的影响ZF标志的指令,并且要避免该指令产生的ZF标志被其后的指令所破坏。 在进行循环程序设计时,要根据区分循环工作部分和置循环初值部分各自应作的操作。 尽可能使用带有重复前缀的串操作指令实现循环程序设计,这样的循环程序简洁,而且运行速度快。,
展开阅读全文