这个问题是关于汇编中的cmp
指令。我无法理解我的书如何推理SF
和OF
标志。
cmp vleft, vright
根据我的书:对于有符号整数,有三个重要的标志:零(ZF)
标志,溢出(OF)
标志和标志(SF)
标志。如果操作结果溢出(或下溢),则设置溢出标志。如果操作结果为负,则设置符号标志。如果vleft = vright
,则设置ZF
(就像无符号整数一样)。如果vleft > vright
,ZF
未设置且SF = OF
。如果vleft < vright
,ZF
未设置且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
这不会设置OF
或SF
标记。
案件也可能是:
1100 - 0101 = 1100 + 1010 + 1 = 10111 = -4 - 5 = 7 (-9 if we had more bits)
这不会设置SF
标志(因为答案是肯定的7),但会设置OF = 1
,因此SF != OF
。这显然与我的书的解释相反,后者说它们应该是平等的。
我在这里缺少什么?
谢谢!
答案 0 :(得分:5)
你会把你的头撞在墙上,抱歉:)
在您的示例中, -4不大于5 !所以是的,OF
将是1
而SF
将是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,这意味着溢出。