5.2.8-循环指令
2、相等或为零循环指令(Loop While Equal or Loop While Zero)
相等或为零循环指令的一般格式:
LOOPE/LOOPZ 标号 这是一组有条件循环指令,它们除了要受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 标号 这也是一组有条件循环指令,它们与相等或为零循环指令在循环结束条件上有点不同。其具体规定如下: (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中。
解: | |||
… | |||
K | DB ?;变量定义 | ||
… | |||
XOR | AX, AX | ||
MOV | CX, K | ||
JCXZ | next | ||
again: | ADD | AX, CX;计算过程: K+(K-1)+…+2+1 | |
LOOP | again | ||
next: | … |
思考题:假设变量K的值为0,并且在循环体的前面没有写指令“JCXZ next”,这时求出的“和”AX的值是什么?