Assembler - Befehl SBC

Moin!

Ich habe eine Frage zur Assemblerprogrammierung:

Ich beschäftige mich erst seit kurzem damit und komm auch soweit zurecht, doch ist mir jetzt nicht ganz klar, was der Befehl SBC genau macht.

Ich habe schon danach gegooglet, bin daraus aber nicht so richtig schlau geworden. Der Befehl führt ja eine Subtraktion durch und berücksichtigt zusätzlich die Carry-Flag. Aber wie genau wird diese berücksichtigt?

Vielen Dank schonmal!

Liebe Grüße
Daniel

… Der Befehl führt ja eine Subtraktion
durch und berücksichtigt zusätzlich die Carry-Flag. Aber wie
genau wird diese berücksichtigt?

Hallo Daniel,

Carry ist in dem Fall Borrow (Unterlauf). Wenn du 18 von 23 subtrahierst, geht ja 3 - 8 nicht und du musst dir 10 von der nächsten Stelle „leihen“ (dann wird Borrow = true), und dann an dieser nächsten Stelle 1 mehr subtrahieren, eben mit SBC, genauso wie der Überlauf bei der Addition mit ADC berücksichtigt wird. In manchen Assemblern kann man auch stattdessen SBB (Subtract with Borrow) verwenden, das ist klarer. Meines Wissens ist Carry und Borrow immer ein und dasselbe Flag.

Gruss Reinhard

OT Nachfrage zu mashinencode Subtraktion

Carry ist in dem Fall Borrow (Unterlauf). Wenn du 18 von 23
subtrahierst, geht ja 3 - 8 nicht und du musst dir 10 von der
nächsten Stelle „leihen“ (dann wird Borrow = true), und dann
an dieser nächsten Stelle 1 mehr subtrahieren, eben mit SBC,

Hallo Namensvetter,

vor jahrzehnten mal gelernt dann nie mehr damit was gemacht, damals hieß es das Subtrahieren keine Cpu kann.

Es wird in dem Fall das Einserkomplement (plus 1) addiert.
Weil das kann der Addierer oder wer das macht.
Die Bitfolge intertieren, dann 1 dazuzählen.
Dies wird dann addiert wie immer, aber die erste Stelle abgeschnitten.

Mal dezimal als Beispiel
Anstatt
23-18 = 5
wird gerechnet 23 -(100-82) =5
also 23 +82 =105 , -100 (erste Stelle weg) =5

Gilt das heutzutage nicht mehr? Oder macht das dieses SBB von sich aus so?

Danke ^ Gruß
Reinhard

vor jahrzehnten mal gelernt dann nie mehr damit was gemacht,
damals hieß es das Subtrahieren keine Cpu kann.
Es wird in dem Fall das Einserkomplement (plus 1) addiert.

Ist mir auch noch geläufig, muss aber trotzdem sehr damals gewesen sein - der Z80 hatte schon die Befehle SUB und SBC (70er Jahre/voriges Jahrhundert). Mit Akku und Register sind die auch in einem Zyklus ausgeführt worden. Intern ist der Algorithmus sicher der gleiche, daher ja auch die Identität von Carry und Borrow.

Heute schreckt kaum noch ein µC vor einer Division zurück.

Gruss Reinhard

Hossa :smile:

Der Befehl SBC macht im Prinzip Folgendes:

SBC dest, soruce      dest= dest - source - !carry

bzw. bei 3 Operanden:

SBC dest, op1, op2      dest= op1 - op2 - !carry

In jedem Fall wird jedoch das negierte(!) Carry-Flag subtrahiert. Ein Unterlauf wird also dadurch angezeigt, dass das Carry-Flag nach der Subtraktion gelöscht ist. Daher musst du vor Beginn einer Subtraktion sicherstellen, dass das Carry-Flag gesetzt ist (SEC).

Die Assembler-Befehle bzw. der Maschinen-Code ist nicht die unterste Befehlsebene einer CPU. Sie sind eigentlich nur aus Kompatibilitätsgründen vorhanden. Auf unterster Ebene repräsentieren alle CPU-Befehle eine Gruppe von sog. Microcode-Befehlen. Dieser Microcode kann bei vielen Prozessoren sogar geändert werden, um kleinere Fehler zu korrigieren. Das BIOS eines PC lädt z.B. den neuen Microcode stets während des POST in den Prozessor.

Warum das negierte Carry-Flag subtrahiert wird, ist klar, wenn man sich überlegt, wie eine Subtraktion auf Microcode-Ebene abläuft:

dest= op1 - op2 - !carry

Zur Subtraktion benötigen wir das Zweierkomplement von op2. Dazu werden alle Bits invertiert und es wird eine 1 addiert:

dest= op1 + ( !op2 + 1 ) - !carry

Ist das Carry-Bit gleich 0, wird am Ende noch eine 1 abgezogen. Ist das Carry-Bit gleich 1, wird nichts mehr abgezogen

  1. Fall: carry=1 => dest= op1 + !op2 + 1

  2. Fall: carry=0 => dest= op1 + !op2

Und jetzt wird klar, wie SBC auf Microcode-Ebene funktioniert:

SBC dest, op1, op2      ADC dest, op1, !op2

Mit anderen Worten, die Bits des letzten Operanden werden invertiert und dann einfach ein ADC durchgeführt…

Viele Grüße

Hase

Aber auch heute gibt es meines Wissens nach kein extra IC sondern nur einen Addierer und nicht mehr fürs Einer- sondern fürs Zweierkomplement,
der die Subtraktion durch die Addition mit einer negativen Zahl abbildet.
http://de.wikipedia.org/wiki/Zweierkomplement#Rechen…

Gruß
VoidZer0