Date: 2014年12月8日 23:04:43
By : BadTudou
关于loop指令的执行过程,王爽在其《汇编语言(第2版)》给出了如下说明:
loop s
① (cx) = (cx)-1
②判断cx中的值,不为0则转至标号s所标识的地址处执行,如果为零则执行下一条指令。
(注:(cx)代表cx寄存器的值)
可以看出,loop语句的执行,主要与cx寄存器的值是否为0有关。这一点,可以理解。存在疑惑的是它的执行过程。例如有如下代码:
① mov ax,2h
② mov cx, 2h
③ s: add ax, ax
④ loop s
执行上面的代码时,其执行顺序是什么?
1.①——>②——>③——>④
2.①——>②——>④——>③
按照顺序1执行,ax的值是8h;
按照顺序2执行,ax的值是4h;
起初,我以为执行顺序是1,因为③属于s标识的一部分,所以程序执行时,首次会先跳过③,直接执行④,然后再根据cx寄存器的值判断是否执行③。结果发现是错的,因为上面的代码执行之后,ax寄存器的值是8h。因此,正确的执行顺序是1.
再回过头来看,《汇编语言》中只谈及loop指令的执行过程,也就是说,其执行过程仅针对loop指令所在的单行语句有效,其有效范围并未包括s标识。如此,便可以解释上面的代码在运行后ax寄存器的值为8h而不是4h。