X86 cmp-什么';进行此比较后,s标志寄存器的内容

X86 cmp-什么';进行此比较后,s标志寄存器的内容,x86,cpu,X86,Cpu,如果cpu执行以下操作: cmp 0x80000000, 0x80000001 旗帜登记册的内容是什么 我认为过程应该如下所示: 做: tmp=-0x8000000=0x8000000(溢出) 结果=0x8000001+tmp=0x1(溢出) 所以,OF=1,SF=0。。。 然而,这是错误的。我很困惑。执行后(您的代码采用AT&T风格语法): 将设置[CF PF AF SF IF]的eflags寄存器位。这与执行sub$0x80000001,%eax完全相同。在这种情况下,%eax将结果0xf

如果cpu执行以下操作:

cmp 0x80000000, 0x80000001
旗帜登记册的内容是什么

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

做:

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

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

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

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

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

通过计算
-2147483648-(-2147483647)
,没有溢出,因为您没有向下越过
-2147483648
的边界。相反,你往上走了太多,结果你在
-1

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


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

错误。。。我甚至希望它不会编译,因为指令包含两个立即值,这通常是不可接受的(而且无论如何也没有任何意义)@PMF…我不是说它必须直接这样做。。。像“$eax=0x80000001”,然后执行“cmp 0x80000000,$eax”,为什么不在调试器中尝试它?这是帮助您理解溢出(有符号)与进位(无符号)的好指南:@PeterCordes这正是我想要的!非常感谢。但是如果'mov$0x80000001,%eax-cmp$0x80000000,%eax'?@ATlaS:更新您的问题,以明确它是AT&T语法还是Intel语法。e、 g.
cmp-eax,edx;eax=INT_MIN edx=INT_MIN+1
cmp%eax,%edx#eax=INT_MIN edx=INT_MIN+1
,然后有人可以回答您想要的问题。或者按照这个答案给出的逻辑,自己解决。
mov $0x80000000, %eax    # -2147483648
cmp $0x80000001, %eax    # -2147483648 - (-2147483647)