为什么cmp 0x84,0x30会触发溢出标志?

时间:2011-08-31 18:19:24

标签: x86 assembly

我一直在玩装配一段时间并查看一些代码。 其中AL首先设置为0x84,然后使用cmp AL,0x30。 然后该指令触发溢出标志。

从我读到的内容CMP应该从第一个数字中减去第二个数字然后设置标志,在这种情况下它应该是0x84-0x30,结果是0x54并且没有溢出。

1 个答案:

答案 0 :(得分:18)

如果您将这些值解释为无符号数字,则只会出现溢出 - 如果您将0x84解释为已签名,则肯定会溢出:

  1. 0x84被解释为带符号的8位值是-124
  2. 0x30被解释为带符号的8位值是48
  3. -124 - 48 = -172
  4. -172超出了带符号的8位值(-128到+127)的范围,这就是OF标志设置的原因。您应该检查表示无符号溢出的CF

    来自Intel 64 and IA-32 Architectures Software Developer’s Manual,第2卷的CMP:

      

    通过从第一个操作数中减去第二个操作数,然后以与SUB指令相同的方式设置状态标志来执行比较。

    和SUB:

      

    SUB指令执行整数减法。它评估有符号和无符号整数操作数的结果,并设置OF和CF标志,分别表示有符号或无符号结果中的溢出。 SF标志表示签名结果的符号。