Forum: Mikrocontroller und Digitale Elektronik Probleme mit dem Carry Flag bei der Subtraktion


von Brian N. (brian602)


Lesenswert?

Hey Leute,

Ich arbeite mich gerade mithilfe eines Skriptes (von meinem Prof) sowie 
eines Buches (Mikroprozessortechnik von Klaus Wüst) in die 
Mikroprozessortechnik ein.

Jedoch sind beim Lösen der Aufgaben, aus dem Buch, einige Fragen 
aufgekommen.

Fragestellung aus dem Buch:
Welche Flags (Carry oder Overflow) werden bei 8-Bit Verarbeitung 
gesetzt, wenn folgende Rechnungen durchgeführt werden.

a) 90d + 200d (Addition)
b) 90d + 40d (Addition)
c) 90d - 110d (Subtraktion)
d) -90d - 60d (Subtraktion)

Das Overflow Flag zu bestimmen, machte mir mit folgendem Hilfsatz (Aus 
dem Skript von meinem Prof) keinerlei Probleme.

Hilfsatz:
Bei 8-Bit Operationen wird das Overflow Flag gesetzt, wenn:
- Ein Übertrag von Bit 6 nacht Bit 7 und kein Übertrag ins Bit 8
- Ein Übertrag nach Bit 8 und kein Übertrag von Bit 6 nach Bit 7 
stattfindet

Meine Lösung:
a) Overflow = 0
b) Overflow = 1
c) Overflow = 0
d) Overflow = 1

Nun zum Carry Flag:
Bei der Addition habe ich ebenfalls keine Probleme, denn im Buch steht:
Das Carry Flag zeigt bei der Addition einen Übertrag aus dem MSB heraus 
auf das (nicht mehr vorhandene) nächst höherwertige Bit an.

a) Carry = 1
b) Carry = 0

Nun zu meinem Problem bei der Subtraktion:
Im Buch steht:
Bei der Subtraktion zeigt es einen Borgen (Ich konnte nirgends 
herausfinden, was ein Borgen ist) von dem nächst höherwertigen Bit auf 
das MSB an. Dies wird beim Umgang mit vorzeichenlosen Zahlen ausgenutzt.

c) Keine Ahnung
d) Ebenfalls keine Ahnung

Jetzt habe ich gelesen, dass bei einer Subtraktion a-b auch ein
Carry-Flag gesetzt wird - und zwar dann, wenn der Subtrahend größer als
der Minuend ist (also b>a).

Wenn das stimmt, würde dies die Aufgabe c) lösen, aber ich wäre immer 
noch bei der d) Planlos.

Was ich mich ebenfalls Frage, ob der Wertebereich etwas mit dem Carry 
bzw. Overflow Flag zu tun hat?
Positiven Zahlen: 0…255
Negative Zahlen: -128…+127

Ich hoffe ihr könnt mir helfen und mir sagen ob ich ansonsten mit meinem 
Vorgehen richtig bin.

Grüße Brian!

: Bearbeitet durch User
von Gustav (Gast)


Lesenswert?

Brian Nikki schrieb:
> Ich konnte nirgends herausfinden, was ein Borgen ist

Ne, oder?

"Borgen" ist ein deutsches Wort. Bedeutet dasselbe wie "Ausleihen".

von Brian N. (brian602)


Lesenswert?

Okay, kannst du sonst noch etwas dazu sagen?
Löst mein Problem mit der Subtraktion nämlich nicht.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Schriftliches Subtrahieren:

  16
-  9
====

Wenn Du die Einerstellen abziehst, musst Du Dir 1 von der Zehnerstelle 
"borgen". Okay, das Ergebnis ist hier positiv, also für Deinen 
Problemfall nicht wirklich relevant.

Aber dasselbe mit dem "Borgen" gilt auch hier:

   6
-  9
====


Verstanden?

von Brian N. (brian602)


Lesenswert?

Und genau dann, wird das Carry Flag gesetzt?

Ü=Übertrag
c)

  90 01011010
-110 10010010
______________
Ü    00100100
______________
 -20 11101100

Warum wird hier das Carry Flag gesetzt?

d)

-90   10100110
-60   11000100
_______________
Ü    100001000
_______________
-150 101101010

Warum wird hier das Carry Flag NICHT gesetzt?

Danke für eure Hilfe.

Grüße Brian

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Lesenswert?

Bei den meisten Prozessoren kannst du folgendermaßen vorgehen:

Betrachte bei der Subtraktion a-b die Operanden a und b als
vozeichenlose Zahlen. Ist dann b>a, wird das Carry-Flag gesetzt, sonst
nicht.

Bei 90-110 ist a=90, b=110 und damit b>a und C=1.

Bei -90-60 ist a negativ. Bei 8-Bit-Zweierkomplementdarstellung
entspricht -90 der vorzeichenlosen Zahl 256-90=166. Also ist a=166, b=60
und damit b≤a und C=0.

Aber Vorsicht: Bei einigen Prozessoren (bspw. dem 6502 und m.W. auch bei
den PICs) wird das Carry-Flag bei der Subtraktion genau andersherum
gesetzt als bspw. beim AVR, nämlich bei b≤a, d.h. wenn kein Borgen
erforderlich ist.

von Amateur (Gast)


Lesenswert?

Das ist z.T. sehr Prozessorspezifisch.

Schau Dir mal die (Atmel-) Befehle: ADD und ADC, sowie ihre Gegenstücke 
SUB und SBC, an. Da ist genau beschrieben, ob und wann die Übertrag- und 
Überlauf-Flags gesetzt werden.
Eine Liste ist unter: http://www.atmel.com/Images/doc0856.pdf zu finden.

von (prx) A. K. (prx)


Lesenswert?

Yalu X. schrieb:
> Aber Vorsicht: Bei einigen Prozessoren (bspw. dem 6502 und m.W. auch bei
> den PICs) wird das Carry-Flag bei der Subtraktion genau andersherum
> gesetzt

Die Logik dahinter: Genau das kommt raus, wenn man nicht wirklich 
subtrahiert, sondern ohne zusätzliche Massnahmen einfach nur das 
Komplement addiert.

"Borgen" ist eine grausame Übersetzung von "borrow", wie der Übertrag 
bei einer Subtraktion in Englisch öfter mal genannt wird. 
Grammatikalisch korrekt wäre wohl "Geborgtes", aber das versteht auch 
niemand.

Die Unterscheidung hat aber einen tieferen Sinn: Wenn im Kontext einer 
Subtraktion von einem "borrow" gesprochen wird, dann ist eindeutig die 
echte Subtraktion gemeint, nicht die Addition des Komplements. Der 
Umkehrschluss funktioniert leider nicht, d.h. der Begriff "carry" wird 
für beide Varianten verwendet.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.