2012-01-23 59 views
8

我正试图在x86中进行溢出&进位标志。在x86中的进位/溢出和减法

据我了解,对于除了符号2支的补数的,只能以四种方式之一产生的标志(我的例子是4位数字):

  1. POS + POS = NEG(溢出)
    • 0111 + 0001 = 1000(7 + 1 = -8)
  2. POS NEG + = POS(进位)
    • 0011 + 1110 = 0001(3 + -2 = 1)
  3. NEG NEG + = NEG(进位)
    • 1111 + 1111 = 1110(-1 + -1 = -2)
  4. NEG NEG + = POS(溢出&进位)
    • 1000 + 1001 = 0001(-8 + -7 = 1)

所以,在x86汇编,d o从A中分解B生成与添加A和-B相同的标志?

+0

参见[理解与进位溢出条件/标志有符号与无符号](http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt),而在其他环节[x86标记wiki](https://stackoverflow.com/tags/x86/info)。 –

回答

16

这里有一个可能有帮助的参考表。这显示了的一个示例,每个可能是由x86上的ADD和SUB指令产生的4个算术标志的组合。 'h''ud'和'd'代表每个值的十六进制,无符号十进制和带符号的十进制表示。例如,SUB的第一行表示0xFF - 0xFE = 0x1,没有设置标志。

但是,我认为小故事是Alex的答案是正确的。

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 
+0

您的表格很有帮助,但是127 - -1是128而不是-128。 –

+2

@James - 不,引用x86程序员的参考“一个字节整数的整数值范围从-128到+127” – srking

+0

好吧,你是对的,但表格很棒。 :) –

6

加法或减法时,进位和溢出值的所有4种组合都是可能的。您可以在this answer中看到更多示例。

This answer包含您从A-B得到的进位与您从A+(-B)得到的进位相反的事实。第一个链接的代码利用此属性将ADC转换为SBB

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