了解程序集中的符号和溢出标志

时间:2013-01-04 10:16:56

标签: assembly x86

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

 cmp vleft, vright

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

首先,让我们考虑vleft > vright案例。我的书中说了以下内容:

  

为什么SF = OF如果vleft&gt; vright?如果没有溢出,则差异将具有正确的值,并且必须是非负的。从而,   SF = OF = 0.但是,如果存在溢出,则差异不会   有正确的价值(事实上是负面的)。因此,SF = OF =   1。

第一部分我理解SF = OF = 0。例如,它可以是:

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

这不会设置OFSF标记。

案件也可能是:

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

这不会设置SF标志(因为答案是肯定的7),但会设置OF = 1,因此SF != OF。这显然与我的书的解释相反,后者说它们应该是平等的。

我在这里缺少什么?

谢谢!

2 个答案:

答案 0 :(得分:5)

你会把你的头撞在墙上,抱歉:)

在您的示例中, -4不大于5 !所以是的,OF将是1SF将是0,它们将不相等,这意味着-4小于5,这是正确的

说明SF = OF = 1案例反转操作数:通过执行来检查是否5 > -4

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

答案 1 :(得分:2)

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

然而,在RTL级别中,OF标志通常被计算为在符号位计算的carry_in!= carry_out的差值。

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,这意味着溢出。