1

假设 AX=8FFE 和 BX= 0FFF
现在如果我们写

Cmp ax,bx 

现在将发生的情况是,将从目标 (ax) 中减去源 (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。现在请告诉我为什么
会这样?

4

1 回答 1

2

我认为你做错了减法。我的结果是:

8FFE---------->    1000    1111    1111    1110
0FFF---------->    0000    1111    1111    1111
                   ----------------------------------
7FFF---------->    0111    1111    1111    1111     

发生的事情是该操作仅从符号位借来。这意味着应设置 OF 标志。在此处阅读有关程序集 CF(Carry) 和 OF(Overflow) 标志的信息,http ://en.wikipedia.org/wiki/Carry_flag,http : //en.wikipedia.org/wiki/Overflow_flag。这意味着它是签名操作它是不正确的。如果它没有签名,那很好。

于 2010-05-24T11:53:47.440 回答