111111
精灵王
精灵王
  • 注册日期2010-12-08
  • 发帖数640
  • QQ
  • 火币1103枚
  • 粉丝120
  • 关注75
  • 社区明星
阅读:2836回复:0

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

楼主#
更多 发布于:2013-01-24 14:29

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

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的值是什么?

喜欢0 评分0
游客

返回顶部