x86 中的进位/溢出和减法
-
12-11-2019 - |
题
我正在尝试解决 x86 中的溢出和进位标志问题。
据我了解,对于有符号 2 的补码的加法,只能通过四种方式之一生成标志(我的示例是 4 位数字):
- pos+pos = neg(溢出)
- 0111 + 0001 = 1000 (7 + 1 = -8)
- pos+neg = pos(进位)
- 0011 + 1110 = 0001 (3 + -2 = 1)
- 负+负=负(进位)
- 1111 + 1111 = 1110 (-1 + -1 = -2)
- neg+neg = pos(溢出和进位)
- 1000 + 1001 = 0001 (-8 + -7 = 1)
那么,在 x86 汇编中,从 A 中减去 B 是否会生成与添加 A 和 -B 相同的标志?
解决方案
这是一个可能有所帮助的参考表。这就是X86上的添加和子指令可能导致的4个算术标志的每个可能组合的一个例子。'H''UD'和'D'代表十六进制,无符号小数,每个值的十进制表示。例如,Sub的第一行表示0xFF - 0xFE= 0x1,没有标志设置。
但是,我认为短篇小说是亚历克斯的答案是正确的。
. ADD
A B A + B Flags
--------------- ---------------- --------------- -----------------
h | ud | d | h | ud | d | h | ud | d | OF | SF | ZF | CF
---+------+-------+----+------+-------+----+------+-------+----+----+----+---
7F | 127 | 127 | 0 | 0 | 0 | 7F | 127 | 127 | 0 | 0 | 0 | 0
FF | 255 | -1 | 7F | 127 | 127 | 7E | 126 | 126 | 0 | 0 | 0 | 1
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0
FF | 255 | -1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1
FF | 255 | -1 | 0 | 0 | 0 | FF | 255 | -1 | 0 | 1 | 0 | 0
FF | 255 | -1 | FF | 255 | -1 | FE | 254 | -2 | 0 | 1 | 0 | 1
FF | 255 | -1 | 80 | 128 | -128 | 7F | 127 | 127 | 1 | 0 | 0 | 1
80 | 128 | -128 | 80 | 128 | -128 | 0 | 0 | 0 | 1 | 0 | 1 | 1
7F | 127 | 127 | 7F | 127 | 127 | FE | 254 | -2 | 1 | 1 | 0 | 0
SUB
A B A - B Flags
--------------- ---------------- --------------- -----------------
h | ud | d | h | ud | d | h | ud | d || OF | SF | ZF | CF
----+------+-------+----+------+-------+----+------+-------++----+----+----+----
FF | 255 | -1 | FE | 254 | -2 | 1 | 1 | 1 || 0 | 0 | 0 | 0
7E | 126 | 126 | FF | 255 | -1 | 7F | 127 | 127 || 0 | 0 | 0 | 1
FF | 255 | -1 | FF | 255 | -1 | 0 | 0 | 0 || 0 | 0 | 1 | 0
FF | 255 | -1 | 7F | 127 | 127 | 80 | 128 | -128 || 0 | 1 | 0 | 0
FE | 254 | -2 | FF | 255 | -1 | FF | 255 | -1 || 0 | 1 | 0 | 1
FE | 254 | -2 | 7F | 127 | 127 | 7F | 127 | 127 || 1 | 0 | 0 | 0
7F | 127 | 127 | FF | 255 | -1 | 80 | 128 | -128 || 1 | 1 | 0 | 1