Question

J'essaye d'envelopper ma tête autour de débordements et de transporter des drapeaux dans x86.

Si je comprends bien, pour l'ajout de numéros de complément de 2 signés, les drapeaux ne peuvent être générés que de l'une des quatre manières (mes exemples sont des numéros 4 bits):

  1. pos + pos = neg (débordement)
    • 0111 + 0001 = 1000 (7 + 1 = -8)
  2. pos + neg = pos (transport)
    • 0011 + 1110 = 0001 (3 + -2 = 1)
  3. neg + nég = neg (transport)
    • 1111 + 1111 = 1110 (-1 + -1 = -2)
  4. NEG + NEG = POS (Overflow & Carry)
    • 1000 + 1001 = 0001 (-8 + -7 = 1)

Ainsi, dans l'assemblage x86, la sous-rétraction B de A génère-t-elle les mêmes indicateurs que l'ajout de A et -B?

Était-ce utile?

La solution

Voici un tableau de référence qui pourrait aider. Cela montre un exemple de tous combinaison possible des 4 drapeaux arithmétiques qui peuvent résulter de l'ajout et des sous-instructions sur x86. 'H' 'ud' et 'd' représentent des représentations hexadécimales, décimales non signées et signées de chaque valeur. Par exemple, la première ligne pour Sub dit 0xff - 0xfe = 0x1 sans indice de jeu.

Mais, je pense que la nouvelle est que la réponse d'Alex est correcte.

 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

Autres conseils

Les 4 combinaisons des valeurs de transport et de débordement sont possibles lors de l'ajout ou de la soustraction. Vous pouvez voir plus d'exemples dans Cette réponse.

Cette réponse contient une preuve du fait que le portage que vous obtenez A-B est l'inverse du transport que vous obtenez A+(-B). Le code par le premier lien exploite cette propriété pour tourner ADC dans SBB.

La valeur de l'indicateur de débordement signé doit cependant être la même pour les deux A-B et A+(-B) Parce que cela dépend si le résultat a ou non le bon signe et dans les deux cas, le bit de signe sera le même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top