我正在尝试解决 x86 中的溢出和进位标志问题。

据我了解,对于有符号 2 的补码的加法,只能通过四种方式之一生成标志(我的示例是 4 位数字):

  1. pos+pos = neg(溢出)
    • 0111 + 0001 = 1000 (7 + 1 = -8)
  2. pos+neg = pos(进位)
    • 0011 + 1110 = 0001 (3 + -2 = 1)
  3. 负+负=负(进位)
    • 1111 + 1111 = 1110 (-1 + -1 = -2)
  4. 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
.

其他提示

加法或减法时,进位值和溢出值的所有 4 种组合都是可能的。您可以在以下位置查看更多示例 这个答案.

这个答案 包含一个事实证明,即您从 A-B 是你得到的进位的倒数 A+(-B). 。第一个链接的代码利用此属性来转动 ADC 进入 SBB.

但是,有符号溢出标志值必须相同 A-BA+(-B) 因为这取决于结果是否具有正确的符号位,并且在两种情况下符号位都是相同的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top