我已经玩了一段时间的汇编并查看了一些代码。其中 AL 首先设置为 0x84,然后使用 cmp AL, 0x30。该指令然后触发溢出标志。
从我读到的 CMP 应该从第一个数字中减去第二个数字,然后设置标志,在这种情况下它应该是 0x84-0x30 结果是 0x54 并且没有溢出。
我已经玩了一段时间的汇编并查看了一些代码。其中 AL 首先设置为 0x84,然后使用 cmp AL, 0x30。该指令然后触发溢出标志。
从我读到的 CMP 应该从第一个数字中减去第二个数字,然后设置标志,在这种情况下它应该是 0x84-0x30 结果是 0x54 并且没有溢出。
如果您将这些值解释为无符号数字,则只有没有溢出 - 如果您将您的符号解释0x84
为有符号,则肯定有溢出:
-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 标志表示签名结果的符号。