11

我已经玩了一段时间的汇编并查看了一些代码。其中 AL 首先设置为 0x84,然后使用 cmp AL, 0x30。该指令然后触发溢出标志。

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

4

1 回答 1

20

如果您将这些值解释为无符号数字,则只有没有溢出 - 如果您将您的符号解释0x84为有符号,则肯定有溢出:

  1. 0x84 解释为有符号的 8 位值是 -124
  2. 0x30 解释为有符号的 8 位值是 48
  3. -124 - 48 = -172

-172 超出了有符号 8 位值(-128 到 +127)的范围,这就是设置OF标志的原因。您应该检查CF哪个表示无符号溢出。

来自Intel 64 and IA-32 Architectures Software Developer's Manual , Volume 2 for CMP:

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

对于 SUB:

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

于 2011-08-31T18:28:23.967 回答