übertrag / Überlauf und Subtraktion in x86
-
12-11-2019 - |
Frage
Ich versuche, meinen Kopf um Überlauf zu wickeln und Flaggen in x86 zu tragen.
So wie ich es verstehe, können die Flags zum Hinzufügen von vorzeichenbehafteten 2er-Komplementnummern nur auf eine von vier Arten generiert werden (meine Beispiele sind 4-Bit-Zahlen):
- pos+pos = neg (Überlauf)
- 0111 + 0001 = 1000 (7 + 1 = -8)
- pos + neg = pos (tragen)
- 0011 + 1110 = 0001 (3 + -2 = 1)
- neg+neg = neg (übertrag)
- 1111 + 1111 = 1110 (-1 + -1 = -2)
- neg + neg = pos (Überlauf & Übertrag)
- 1000 + 1001 = 0001 (-8 + -7 = 1)
Erzeugt das Subtrahieren von B von A in der x86-Assembly also dieselben Flags wie das Hinzufügen von A und -B ?
Lösung
Hier ist eine Referenztabelle, die helfen könnte.Dies zeigt ein Beispiel für eine mögliche Kombination von in jeder möglichen Kombination der 4 arithmetischen Flags, die sich aus den Hinzufügen- und Unteranweisungen auf X86 ergeben können.'H' ud 'und' d 'Stand für Hex, vorzeichenlose Dezimal- und Unterzeichnung Dezimalrepräsentationen jedes Werts.Beispielsweise sagt die erste Zeile für Sub 0xFF - 0xFE= 0x1 ohne eingestellte Flaggen.
Aber ich denke, die Kurzgeschichte ist, dass Alexs Antwort richtig ist. generasacodicetagpre.
Andere Tipps
Beim Addieren oder Subtrahieren sind alle 4 Kombinationen der Übertrag- und Überlaufwerte möglich.Weitere Beispiele finden Sie in diese Antwort.
Diese Antwort enthält einen Beweis dafür, dass der Übertrag, den Sie erhalten, von A-B
ist die Umkehrung des Übertrags, von dem Sie erhalten A+(-B)
.Der Code durch den ersten Link nutzt diese Eigenschaft aus, um ADC
in SBB
.
Der vorzeichenbehaftete Überlaufkennzeichenwert muss jedoch für beide gleich sein A-B
und A+(-B)
denn es hängt davon ab, ob das Ergebnis das richtige Vorzeichenbit hat oder nicht und in beiden Fällen ist das Vorzeichenbit gleich.