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))
相同。减法或比较时,直接进行计算。没有预先将负数转换为正数。
如果 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))
相同。减法或比较时,直接进行计算。没有预先将负数转换为正数。