cmp - 执行此比较后,FLAGS寄存器的内容是什么

时间:2015-11-26 14:20:54

标签: x86 cpu

如果cpu执行:

cmp 0x80000000, 0x80000001

FLAGS注册的内容是什么?

我认为这个过程应该如下:

做的:

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

result = 0x80000001 + tmp = 0x1(溢出)

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

1 个答案:

答案 0 :(得分:2)

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

mov $0x80000000, %eax    # -2147483648
cmp $0x80000001, %eax    # -2147483648 - (-2147483647)

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

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

<强>更新
如果您交换操作数,那么如果您执行-2147483647 - (-2147483648),则执行与以前非常相似的操作:计算x - (负数),它向上而不是向下。因此,再次没有-2147483648的向下交叉,并且再次没有溢出。结果是1

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