根据预期,标志标志和溢出标志不起作用

时间:2010-05-24 11:41:47

标签: assembly overflow flags cmp

假设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。   现在请告诉我为什么会这样?

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) flaghttp://en.wikipedia.org/wiki/Carry_flaghttp://en.wikipedia.org/wiki/Overflow_flag。这意味着签名操作是不正确的。如果它没有签名那么很好。