X86 cmp-什么';进行此比较后,s标志寄存器的内容
如果cpu执行以下操作: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
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)