PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Carry- und Overflow-Flag


Senior Sanchez
2007-07-27, 14:42:41
Hoi,

Das gehört zu meiner Prüfungsvorbereitung und da ist eine Frage bei mir aufgetaucht.

Angenommen ich addiere zwei binäre Zahlen. Dabei entsteht ein "Übertrag" von 1 vom höchstwertigen Bit zum nächsten, aber nicht existenten Bit. Wann weiß ich, wann das Carry-Flag und wann das Overflow-Flag gesetzt werden muss? Also wie bekomme ich das raus?

Kann es sein das ich das Overflow-Flag genau dann setze, wenn die Vorzeichen meiner Zahlen verschieden sind? Und das Carry-Flag setze ich halt dann, wenn die Vorzeichen gleich sind?

Spasstiger
2007-07-27, 15:37:07
Ich gehe im Folgenden von Zweierkomplementdarstellung aus.

Das carry-flag wird immer dann gesetzt - ungeachtet der Vorzeichen der Summanden -, wenn es an der höchsten Stelle einen Übertrag gibt.
Z.B. $FFFF + $FFFF oder auch $FFFF + $0001 (jeweils hexadezimal interpretiert bei 16-Bit-Addition).

Das overflow-flag wird immer dann gesetzt, wenn der zulässige Wertebereich überschritten wird. Hierbei ist das Vorzeichen der Summanden entscheidend.
Bei 2er-Komplementdarstellung und einer 16 Bit Addition geht der Wertebereich von $8000 (-2^15) über $FFFF (-1) und $0000 (0) bis hin zu $7FFF (+2^15 - 1).
Demnach verursacht z.B. die Addition von $7FFF und $0001 einen overflow, denn $7FFF wäre bereits die größte positive Zahl. Einen carry gibt es dabei aber nicht, denn das Ergebniss der Addition lässt sich mit 16 Bit darstellen.
Genauso gibt es auch im Negativen ein overflow, z.B. bei der Addition von $8000 und $FFFF. Gleichzeitig tritt auch ein carry auf, weil eben 16 Bit zur Darstellung der Summe nicht ausreichen.

Haben die Summanden unterschiedliches Vorzeichen, so kann kein overflow auftreten, da die resultierende Summe dann innerhalb des zulässigen Wertebereichs liegt.
Z.B. ist die Summe von $8000 und $7FFF im Zweierkomplement eben $7FFE (+2^15 - 2). Ein carry tritt aber auf, weil an der höchsten Stelle ein Übertrag entsteht (der für das korrekte Ergebniss im Zweierkomplement aber ohne Belang ist).
Auch bei der Summe von $0000 und $8000, dem anderen Extrem, bleibt man im zulässigen Wertebereich (kein overflow). Ein carry tritt diesmal nicht auf.

Zusammenfassung:
carry und overflow können also zusammen oder auch einzeln auftreten.
Beim carry spielt das Vorzeichen der Summanden keine Rolle.
Beim overflow ist das Vorzeichen der Summanden dagegen entscheidend. Haben die Summanden unterschiedliches Vorzeichen, tritt definitiv kein overflow auf.
Wann in Abhängigkeit vom Wertebereich der Summanden ein carry und/oder ein overflow auftritt, könnte man auch in einer Tabelle zusammenfassen. Aber dazu habe ich jetzt nicht die Muße. ;)
Aber wenn dir danach ist, kannst du ja mal eine solche Tabelle aufstellen und ich werfe dann einen prüfenden Blick darauf.

Falls es dir was bringt, kann ich auch noch nachschauen, wir wir im Fachpraktikum an der Uni das Setzen der flags in der ALU gelöst haben (wir haben einen kompletten Prozessor in VHDL nachgebaut).

Senior Sanchez
2007-07-27, 16:34:34
Ich glaube ich habe es jetzt verstanden :)

Nebenbei habe ich festgestellt, dass eine Folie im Script von meinem Prof falsch ist. Weil ich konnte es mir absolut nicht erklären, wie da angeblich ein Overflow auftreten soll - deshalb habe ich es schnell in Assembler mal geschrieben und mir dann das CCR angesehen ;) Und tatsächlich, KEIN overflow.

Tritt beim Most-significant Bit ein Übertrag auf, haben wir einen Carry. Wenn sich dann noch quasi das Vorzeichen ändert, dann haben wir einen Overflow - richtig?

Vielen Dank schonmal für die Erläuterung

Spasstiger
2007-07-27, 16:51:00
Tritt beim Most-significant Bit ein Übertrag auf, haben wir einen Carry. Wenn sich dann noch quasi das Vorzeichen ändert, dann haben wir einen Overflow - richtig?
Nein, für ein overflow muss kein carry aufgetreten sein.
Führe z.B. eine 16-Bit-Addition mit den Dezimalzahlen 1 ($0001) und 32767 ($7FFF) im Zweierkomplement durch.
Die Summe ist 32786 und somit außerhalb des zulässigen Wertebereich. Es tritt aber kein carry auf, denn $0001 + $7FFF ist einfach $8000 (32768), also 16 Bit breit.

Senior Sanchez
2007-07-27, 16:55:06
Hast ja Recht, danke :)

Ich hatte mich da oben einfach verschrieben.
Ich wollte sagen, dass wenn es nen Übertrag gibt, das dann ein Carry auftritt.
Ändert sich das Vorzeichen, haben wir einen Überlauf. Das "dann noch" war da zuviel ;)

Spasstiger
2007-07-27, 17:23:25
Ändert sich das Vorzeichen, haben wir einen Überlauf.
Ok, jetzt verstehe ich, was du meinst.
Die Vorzeichenänderung alleine ist aber auch kein Beweis für einen Überlauf (overflow).
Es muss dazu noch gelten, dass beide Summanden gleiches Vorzeichen haben.

Senior Sanchez
2007-07-27, 17:26:37
Ok, jetzt verstehe ich, was du meinst.
Die Vorzeichenänderung alleine ist aber auch kein Beweis für einen Überlauf (overflow).
Es muss dazu noch gelten, dass beide Summanden gleiches Vorzeichen haben.

Das impliziere ich mit meiner Aussage ;)
Wenn beide unterschiedliche Vorzeichen haben, dann kann ich keine Vorzeichenänderung zu beiden Summanden haben. Ergo müssen beide Summanden das gleiche Vorzeichen haben und wenn mein Ergebnis dann ein anderes hat, dann habe ich einen Überlauf.

jangirke
2010-12-10, 09:45:58
?:)

Gast
2010-12-10, 14:52:00
Also kann man auch sagen die cpu weiss nicht, ob man mit signed oder unsigned Integer werten arbeitet. Wenn man mit signed arbeitet, ist das carry flag entscheident, wenn man mit unsigned arbeitet das overflow flag.

Gast
2011-01-09, 17:40:29
Also kann man auch sagen die cpu weiss nicht, ob man mit signed oder unsigned Integer werten arbeitet. Wenn man mit signed arbeitet, ist das carry flag entscheident, wenn man mit unsigned arbeitet das overflow flag.

Fast richtig.
Es muss natürlich heißen:
Wenn man mit UNSIGNED arbeitet, ist das CARRY flag entscheident, wenn man mit SIGNED arbeitet das OVERFLOW flag.

Gast12321
2011-02-02, 14:28:28
Fast richtig.
Es muss natürlich heißen:
Wenn man mit UNSIGNED arbeitet, ist das CARRY flag entscheident, wenn man mit SIGNED arbeitet das OVERFLOW flag.

Naja, du meinst wohl eher:

Wenn man mit UNSIGNED arbeitet, ist das CARRY flag entscheident, wenn man mit SIGNED arbeitet das OVERFLOW UND CARRY flag

;-)