2010-05-24 83 views
1

假设AX = 8FFE和BX = 0FFF
现在,如果我们写现在符号标志和溢出标志根据预期

Cmp ax,bx 

在这一点上会发生什么事是,源(BX)将不工作从目的地(ax)中减去并且适当的标志将被更新。由于计算机以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

你忘了补充BX。 – starblue 2010-05-24 15:04:46

+0

谢谢先生,我明白你的观点,我现在没有困惑 – 2010-05-24 18:50:10

回答

2

我认为你做了不正确的减法。我的结果是:

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

发生了什么事是操作只从符号位借用。这意味着应设置标志。在这里阅读about assembly CF(Carry) and OF(Overflow) flag,http://en.wikipedia.org/wiki/Carry_flag,http://en.wikipedia.org/wiki/Overflow_flag。这意味着它被签名的操作是不正确的。如果它没有签名,那就好了。

+0

但先生的电脑代表所有的数字在2的补码形式和减法是通过加法实施,所以你为什么减去而不是添加他们证明你的回答 – 2010-05-24 12:18:18

+0

@Zia你拉赫曼: 你是对的。但要记住'a - b = a +( - b)'无论编码如何。如果你计算-b为2的comp:F001并且加上你会得到和我一样的结果 – Andrey 2010-05-24 12:57:10

+0

谢谢你sir非常有用的评论我现在有了这个想法。 – 2010-05-24 18:49:36