如果cpu执行:
cmp 0x80000000, 0x80000001
FLAGS注册的内容是什么?
我认为这个过程应该如下:
做的:
tmp = -0x80000000 = 0x80000000(溢出)
result = 0x80000001 + tmp = 0x1(溢出)
所以,OF = 1,SF = 0 ...... 但是,这是错误的。我很困惑。
答案 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))
相同。在减去或比较时,直接进行计算。没有将负数预先转换为正数。