这个问题是关于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
情况。我的书是这样说的:
如果 vleft > vright,为什么 SF = OF?如果没有溢出,那么差值将具有正确的值并且必须是非负的。因此,SF = OF = 0。但是,如果发生溢出,则差值将不具有正确的值(实际上是负值)。因此,SF = OF = 1。
第一部分我明白了SF = OF = 0
。例如,它可以是:
0111 - 0101 = 0111 + 1010 + 1 = 10010 = 7 - 5 = 2
这不会设置OF
orSF
标志。
这种情况也可能是:
1100 - 0101 = 1100 + 1010 + 1 = 10111 = -4 - 5 = 7 (-9 if we had more bits)
这不会设置SF
标志(因为答案是肯定的 7)但会设置OF = 1
,因此SF != OF
。这显然违背了我的书的解释,即它们应该是平等的。
我在这里想念什么?
谢谢!