汇编循环指令2
3359 点击·0 回帖
![]() | ![]() | |
![]() | 2、相等或为零循环指令(Loop While Equal or Loop While Zero) 相等或为零循环指令的一般格式: LOOPE/LOOPZ 标号 LOOPEW/LOOPZW 标号 ;CX作为循环计数器,80386+ LOOPED/LOOPZD 标号 ;ECX作为循环计数器,80386+ 这是一组有条件循环指令,它们除了要受CX或ECX的影响外,还要受标志位ZF的影响。其具体规定如下: (1)、(CX)=(CX)-1或(ECX)=(ECX)-1; (不改变任何标志位) (2)、如果循环计数器≠0且ZF=1,则程序转到循环体的第一条指令,否则,程序将执行该循环指令下面的指令。 图5.13 循环指令LOOPE的功能示意图 3、不等或不为零循环指令(Loop While Not Equal or Loop While Not Zero) 不等或不为零循环指令的一般格式: LOOPNE/LOOPNZ 标号 LOOPNEW/LOOPNZW 标号 ;CX作为循环计数器,80386+ LOOPNED/LOOPNZD 标号 ;ECX作为循环计数器,80386+ 这也是一组有条件循环指令,它们与相等或为零循环指令在循环结束条件上有点不同。其具体规定如下: (1)、(CX)=(CX)-1或(ECX)=(ECX)-1; (不改变任何标志位) (2)、如果循环计数器≠0且ZF=0,则程序转到循环体的第一条指令,否则,程序将执行该循环指令下面的指令。 图5.14 循环指令LOOPNE的功能示意图 4、循环计数器为零转指令(Jump if CX/ECX is Zero) 在前面的各类循环指令中,不管循环计数器的初值为何,循环体至少会被执行一次。当循环计数器的初值为0时,通常的理解应是循环体被循环0次,即循环体一次也不被执行。其实不然,循环体不是不被执行,而是会被执行65536次(用CX计数)或4294967296次(几乎是死循环,用ECX计数)。 为了解决指令的执行和常规思维之间差异,指令系统又提供了一条与循环计数器有关的指令――循环计数器为零转指令。该指令一般用于循环的开始处,其指令格式如下: JCXZ 标号 ;当CX=0时,则程序转移标号处执行 JECXZ 标号 ;当ECX=0时,则程序转移标号处执行,80386+ 例5.14 编写一段程序,求1+2+…+k(K≥0)之和,并把结果存入AX中。 解: … KDB ? ;变量定义 … XORAX, AX MOVCX, K JCXZnext again:ADDAX, CX ;计算过程: K+(K-1)+…+2+1 LOOPagain next:… 思考题:假设变量K的值为0,并且在循环体的前面没有写指令“JCXZ next”,这时求出的“和”AX的值是什么? | |
![]() | ![]() |