假设AX = 8FFE且BX = 0FFF
现在,如果我们写
Cmp ax,bx
现在,将会发生的事情是,将从目的地(ax)中减去source(bx),并更新相应的标志。由于计算机以2的补码形式表示每个数字,因此8FFE是某个数字的2的补码,同样0FFF是某个数字的2的补码。
在2的补码中,减法是通过加法实现的,所以我们通过将它们转换为二进制来添加这两个数字。
8FFE----------> 1000 1111 1111 1110
0FFF----------> 0000 1111 1111 1111
--------------------------------
1001 1111 1111 1101
现在这是十六进制的9FFD结果。
如您所见,没有发生溢出且符号位为结果的1。
问题:凭借这种想象,应该设置标志标志和溢出标志
应保持0,我在调试器中检查了这一点,但我找到了
与之相反,即符号标志保持为0,溢出标志为1。
现在请告诉我为什么会这样?
答案 0 :(得分:2)
我认为你做错了减法。我的结果是:
8FFE----------> 1000 1111 1111 1110
0FFF----------> 0000 1111 1111 1111
----------------------------------
7FFF----------> 0111 1111 1111 1111
发生的事情是该操作仅从符号位借来。这意味着应该设置OF标志。在这里阅读about assembly CF(Carry) and OF(Overflow) flag,http://en.wikipedia.org/wiki/Carry_flag,http://en.wikipedia.org/wiki/Overflow_flag。这意味着签名操作是不正确的。如果它没有签名那么很好。