cmp - 比较后 FLAGS 寄存器的内容是什么

cmp - What's the content of FLAGS register after do this compare

如果 cpu 做:

cmp 0x80000000, 0x80000001

FLAGS寄存器的内容是什么?

我认为过程应该如下所示:

做:

tmp = -0x80000000 = 0x80000000(溢出)

结果 = 0x80000001 + tmp = 0x1(溢出)

所以,OF = 1,SF = 0... 然而,这是错误的。我很困惑。

执行后(您的代码采用 AT&T 风格的语法):

mov [=10=]x80000000, %eax    # -2147483648
cmp [=10=]x80000001, %eax    # -2147483648 - (-2147483647)

[ CF PF AF SF IF ] 的 eflags 寄存器位将被设置。这与执行 sub [=11=]x80000001, %eax 完全相同。在这种情况下,%eax 将得到结果 0xffffffff,或 -1 作为带符号的 32 位整数。

通过计算-2147483648 - (-2147483647),没有溢出,因为你没有向下越过-2147483648的边界。相反,你向上移动了很多,最终到达 -1.

更新:
如果你交换操作数,那么如果你做 -2147483647 - (-2147483648),你会做一些与以前非常相似的事情:你计算 x -(负数),它向上,而不是向下。因此,-2147483648 也没有向下交叉,也没有溢出。结果是 1.

请注意 x - (negative number) 并不总是与 x + (-(negative number)) 相同。减法或比较时,直接进行计算。没有预先将负数转换为正数。