经典汇编语言教程:5.2.8-循环指令

5.2.8-循环指令

相等或为零循环指令的一般格式:

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、不等或不为零循环指令(LoopWhile 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、循环计数器为零转指令(Jumpif 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,并且在循环体的前面没有写指令“JCXZnext”,这时求出的“和”AX的值是什么?

上页:上一课 下页:下一课

经典汇编语言教程·相关目录

第1章 汇编语言的由来,数据类型第2章 CPU资源和存储器
第3章 操作数的寻址方式第4章 标识符和表达式
第5章 微机CPU的指令系统第6章 程序的基本结构
第7章 子程序和库第8章 输入输出和中断
第9章 宏第10章 应用程序设计
第11章 数值运算协处理器第12章 汇编语言和C语言
汇编语言重要附录Windows API函数大全
版权所有 © 中山市飞娥软件工作室 证书:粤ICP备09170368号