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

Luk*_*son 4 x86 assembly

这个问题是关于cmp装配的指令.我无法理解我的书如何推断SFOF旗帜.

 cmp vleft, vright
Run Code Online (Sandbox Code Playgroud)

根据我的书:对于有符号整数,有三个重要的(ZF)标志:零标志,溢出(OF)标志和标志(SF)标志.如果操作结果溢出(或下溢),则设置溢出标志.如果操作结果为负,则设置符号标志.如果vleft = vright,ZF则设置(就像无符号整数一样).如果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

这不会设置OFSF标记.

案件也可能是:

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

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

我在这里错过了什么?

谢谢!

Jes*_*ter 5

你会在墙上砰的一声,对不起:)

在您的示例中,-4不大于5!所以,是的,OF1SF0,他们将不相等,这意味着-4小于5,这是正确的.

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

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