循环次数cx为0,loop是怎么处理的?
我发现了有这样一道题目:
有如下程序执行后,AX = ()。
assume cs:code
code segment
start:
mov ax, 2
mov bx, 2
mov cx, 0
s:
add ax, bx
loop s
mov ax, 4c00h
int 21h
code ends
end start
根据我现有的认知水平,汇编语言应该是自上而下执行的,而且这个语言属于低级语言,相关的指令应该不具备有判断的能力
例如上面这个程序来讲,程序应该先是执行到add ax, bx 然后才是loop s ,按照我的理解应该是这样,又因为loop指令是先对cx进行减一操作,然后再作判断,cx原本等于0,减一之后立马变为FFFFH,从而又开始执行循环操作
然而执行代码后的结果是ax仍旧为2,loop指令相当于没有执行
让我们看看程序的分步执行
- mov cx, 0:设置cx为0
- add ax, bx:s标号,循环内操作
- loop s:判断循环操作
在这里我们可以关注一下CX的变化过程,首先cx赋值为0,当我们执行操作到loop指令的时候,CX立马跳变为FFFF,然后继续循环
然而,当我直接跳过循环后,发现ax又回到了之前的状态:
所以,汇编语言对于cx为0的情况的处理办法是,存储当前数据,等待到下一次判断循环可以跳出时,恢复到之前的数据
(我的猜想)
23322附:
事实证明,我的猜想是错误的,实际上它没有恢复操作,而是直接重复循环,但是这样执行的结果,对于这道题而言,是没有影响的,根据这个程序的思路,我们用python控制图执行一下:
发现结果为:FFFF0002H,高位溢出,剩下0002H,符合题中情况
这里再次抛出一个疑问?在什么样的情况下,会影响到结果呢?也就是对低十六位产生影响
这里我仅仅找了一个例子,每次循环结果都有所削减的情况这就可能会导致低十六位不为原始数据的情况:
原始数据为10000H,循环每次递减1的情况:
结果为8000H
原始数据为10000H,循环每次递减2的情况:
结果为0000H