Übertrag / Überlauf und Subtraktion in x86

9

Ich versuche meinen Kopf um den Überlauf zu wickeln & amp; Tragen Sie Flags in x86.

Wie ich es verstehe, können die Flags nur auf eine von vier Arten erzeugt werden (meine Beispiele sind 4-Bit-Zahlen):

  1. pos + pos = neg (Überlauf)
    • 0111 + 0001 = 1000 (7 + 1 = -8)
  2. pos + neg = pos (Übertrag)
    • 0011 + 1110 = 0001 (3 + -2 = 1)
  3. neg + neg = neg (Übertrag)
    • 1111 + 1111 = 1110 (-1 + -1 = -2)
  4. neg + neg = pos (Überlauf & Übertrag)
    • 1000 + 1001 = 0001 (-8 + -7 = 1)

Also erzeugt die Subtraktion von B aus A in der x86-Assembly dieselben Flags wie das Hinzufügen von A und -B?

    
Robz 23.01.2012, 00:07
quelle

2 Antworten

17

Hier ist eine Referenztabelle, die helfen könnte. Dies zeigt ein Beispiel für jede mögliche Kombination der vier arithmetischen Flags, die aus den Anweisungen ADD und SUB auf x86 resultieren können. 'h' 'ud' und 'd' stehen für hexadezimale, vorzeichenlose dezimale und vorzeichenbehaftete Dezimaldarstellungen für jeden Wert. Zum Beispiel sagt die erste Zeile für SUB 0xFF - 0xFE = 0x1 ohne Flags gesetzt.

Aber ich denke, die kurze Geschichte ist, dass Alex 'Antwort richtig ist.

%Vor%     
srking 24.01.2012, 05:49
quelle
6

Alle 4 Kombinationen der Übertrags- und Überlaufwerte sind beim Addieren oder Subtrahieren möglich. Sie können weitere Beispiele in dieser Antwort sehen.

Diese Antwort enthält einen Beweis dafür, dass der Übertrag, den Sie von A-B erhalten, die Umkehrung der Trage dich von A+(-B) . Der Code nach dem ersten Link nutzt diese Eigenschaft, um ADC in SBB zu verwandeln.

Der vorzeichenbehaftete Überlauf-Flag-Wert muss jedoch sowohl für A-B als auch für A+(-B) gleich sein, weil es davon abhängt, ob das Ergebnis das richtige Vorzeichenbit hat oder nicht, und in beiden Fällen ist das Vorzeichenbit dasselbe.

    
Alexey Frunze 23.01.2012 03:18
quelle