2017-01-25 1 views
2

Ich weiß, dass die Carry-Flag während SUB gesetzt ist, wenn der Minuend kleiner ist als der Subtrahend und ein Borrow benötigt wird, aber konnte nichts finden, das dies ausführlicher erklären.Wie wird das Carry Flag gesetzt, wenn der Subtrahend größer ist?

Da die Subtraktion eigentlich nur mit Zweierkomplement addiert wird, wie weiß die CPU, dass der Subtrahend größer ist und ein Borrow aufgetreten ist?

Das einzige, was mir einfällt, ist, dass vielleicht das Carry-Flag automatisch während SUB gesetzt wird, wenn der Subtrahend zu seinem Zweierkomplement konvertiert wird. Dann, wenn nicht ein anderer Übertrag stattfindet (wie es während der Addition erfolgen sollte, wenn der Minuend größer als der Subtrahend ist), um ihn wieder auszuschalten, bleibt er eingeschaltet.

Oder bin ich weg?

+3

Sie sind es zu verkomplizieren. Der Prozessor kennt das Zweierkomplement nicht. Die ALU subtrahiert die Operanden, und der resultierende Übertrag geht in das "C" -Flag. Es wird auch das "O" -Flag von einem Übertrag zu dem m.s. Bit. Und das "S" -Flag zum Spiegeln der m.s. Bit. Und das 'Z'-Flag, wenn das Ergebnis' 0 'war. Andere Flags, abhängig vom Prozessor. *Wie wird es gemacht? Das ist keine "Sprach" -Frage. –

+1

Der Übertrag von der Umwandlung wird verworfen, der Ausgabeübertrag ist der negierte Übertrag von der Addition. Einige Architekturen negieren sie nicht, daher erhalten Sie CF = 1, wenn kein Borgen auftritt. – Jester

+0

Subtraktion ist in unsigned getan, so dass Sie nicht über den Typ wissen müssen. Das Übertrags-Flag wird durch die Ausgangsbits –

Antwort

1

Sie scheinen die Übertrags- und Überlaufflags zu verwechseln.
Das Übertragsflag prüft den vorzeichenlosen Überlauf und das Überlaufflag prüft den signierten Überlauf.
Die Funktionsweise ist, dass vor der Subtraktion die (vorzeichenlosen) Zahlen verglichen werden und wenn b> a, dann wird CF gesetzt.
Wenn das Vorzeichen des ersten Operanden geändert wird, wird der Überlauf gesetzt.

Während der Subtraktion ist es der CPU egal, ob die Operanden negativ sind.
Wenn die vorzeichenlose Basis kleiner ist als die vorzeichenlose Zahl, die subtrahiert wird, tritt ein Übertrag auf.

z. (Nur getestet in der CPU-Ansicht von meinem Debugger)

0 - -1 = 1 ->> CF = 1, because 0xFFFFFFFF > 0 
10 - -1 = 11 ->> CF = 1, same reason 
-2 - 4 = -6 ->> CF = 0, because 0x4 < 0xFFFFFFFE 

in signierten arithmetischen Denken Sie daran, diese Ergebnisse korrekt sind, aber in unsigned Arithmetik sie sind * Art und Weise * aus, damit CF = 1.

Das Carry-Flag kennt oder kümmert sich nicht um ein Zeichen, es ist (nur) für einen vorzeichenlosen Überlauf gedacht. Denken Sie daran, dass die CPU nicht wissen kann, ob Sie signierte oder vorzeichenlose Operationen ausführen möchten. Es liegt an der Anwendung, die relevanten Flags zu testen, um die Ergebnisse zu interpretieren. Aus diesem Grund stellt die CPU zwei Sätze von Überlaufflags bereit.

Hier ist eine Liste der häufigsten Flaggen und ihre Funktion:

code | descripton  |name  | When set 
---+++----------------+---------+------------------- 
CF unsigned overflow Carry  If unsigned over-/underflow occurs 
OF signed overflow Overflow If sign bit (MSB) flips 
SF Sign flag   Sign  If MSB is set, i.e. is result is negative 
ZF Zero flag   Zero  If Result is zero 

Keines dieser Fahnen haben viel in der Art von ‚Intelligenz‘.
Sie müssen daran denken, dass diese Flags entworfen wurden, wenn Transistoren knapp waren.

über 2-Komplement
2-Komplement ist so ausgelegt, dass die Addition und Subtraktion nicht über die Umwandlung von positiv zu negativ wissen müssen.
Sie können einfach hinzufügen und subtrahieren, wenn der Operand oder das Ergebnis positiv oder negativ ist.
Die einzigen Vorbehalte beim Überlauf auftreten, die genau das ist, was das Carry-Flag testet.

Wenn Sie einfache Inversion (d. H. Das 1er-Komplement) als negative Zahlen verwenden möchten, benötigen Sie alle Arten von Sicherheitsvorkehrungen für Addition und Subtraktion. Deshalb wird das Zweierkomplement universell verwendet.

Literatur
http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt
Dank Peter

+0

Für das eigene Komplement wird nur die zu subtrahierende Zahl ergänzt. Wenn während des Hinzufügens ein Übertrag vorhanden ist, wird das Ergebnis inkrementiert. Einige ältere Computer (wie die CDC 3000-Serie) verwendeten das eigene Komplement. – rcgldr

Verwandte Themen