7

这个问题是关于cmp汇编指令的。我无法理解我的书是如何对SFOF标志进行推理的。

 cmp vleft, vright

根据我的书:对于有符号整数,有三个重要的标志:零(ZF)标志、溢出(OF)标志和符号(SF)标志。如果操作结果上溢(或下溢),则设置上溢标志。如果操作的结果是否定的,则设置符号标志。如果vleft = vrightZF则设置 (就像无符号整数一样)。如果vleft > vright,ZF未设置并且SF = OF. 如果vleft < vright,ZF未设置并且SF != OF. 不要忘记其他指令也可以更改 FLAGS 寄存器,而不仅仅是CMP.

首先,让我们考虑一下这种vleft > vright情况。我的书是这样说的:

如果 vleft > vright,为什么 SF = OF?如果没有溢出,那么差值将具有正确的值并且必须是非负的。因此,SF = OF = 0。但是,如果发生溢出,则差值将不具有正确的值(实际上是负值)。因此,SF = OF = 1。

第一部分我明白了SF = OF = 0。例如,它可以是:

0111 - 0101 = 0111 + 1010 + 1 = 10010 = 7 - 5 = 2

这不会设置OForSF标志。

这种情况也可能是:

1100 - 0101 = 1100 + 1010 + 1 = 10111 = -4 - 5 = 7 (-9 if we had more bits)

这不会设置SF标志(因为答案是肯定的 7)但会设置OF = 1,因此SF != OF。这显然违背了我的书的解释,即它们应该是平等的。

我在这里想念什么?

谢谢!

4

2 回答 2

6

你会把头撞到墙上,对此感到抱歉:)

在您的示例中,-4 不大于 5!所以是的,OFwill be1SFwill be 0,它们不会相等,这意味着 -4 小于 5,这是正确的。

为了说明SF = OF = 1反转操作数的情况:检查是否5 > -4通过做

5 - (-4) = 5 + 4 = 1001b = -7

于 2013-01-04T13:05:36.350 回答
2

当两个操作数具有相同的符号时,您的书关于 OF== (SF!=CF) 是正确的。当操作数的符号不同时,不能有OF。

但是,在 RTL 级别中,OF 标志最常被计算为在符号位计算的进位输入的差异!= 进位输出。

i.e. for 1100-0101 = 1100+1010+1
bit position 0:  c_in=c_0= 1, a_0 = 0, b_0 = 0;  result=1, c_out=0
             1:  c_in=c_1= 0, a_1 = 0, b_1 = 1;  result=1, c_out=0
             2:  c_in=c_2= 0, a_2 = 1, b_2 = 0;  result=1, c_out=0
             3:  c_in=c_3= 0, a_3 = 1, b_3 = 1;  result=0, c_out=1

这里c_in_3 != c_out_3,表示溢出。

于 2013-01-04T10:43:35.863 回答