这个问题是关于cmp
装配的指令.我无法理解我的书如何推断SF
和OF
旗帜.
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
这不会设置OF
或SF
标记.
案件也可能是:
1100 - 0101 = 1100 + 1010 + 1 = 10111 = -4 - 5 = 7 (-9 if we had more bits)
这不会设置SF
标志(因为答案是正数7)但是会设置OF = 1
,因此SF != OF
.这显然与我的书的解释相反,后者说它们应该是平等的.
我在这里错过了什么?
谢谢!
你会在墙上砰的一声,对不起:)
在您的示例中,-4不大于5!所以,是的,OF
会1
和SF
会0
,他们将不相等,这意味着-4小于5,这是正确的.
为了说明SF = OF = 1
反转操作数的情况:检查是否5 > -4
通过操作
5 - (-4) = 5 + 4 = 1001b = -7
归档时间: |
|
查看次数: |
8094 次 |
最近记录: |