Hallo,
ich befasse mich gerade mit Assembler Befehlen und finde leider nicht so
viele Beispiele für Befehl sbc im Netz. So wollte ich meine
Beispielrechnung von Profis hier einmal überprüfen lassen.
R16=0x84 = 1000 0100
R17=0x06 = 0000 0110
C=1
sbc R16,R17
Schritt 1: ADD R17, Carry:
0000 0110 + 0000 0001 = 0000 0111
Schritt 2: 2-er Komplement von R17 bilden:
0000 0111 -> 1111 1001
Schritt 3: R16 und 2-er Komplement addieren:
1000 0100
+ 1111 1001
------------
1|0111 1101 = 0x7D
wäre das so richtig?
Gruß
Auch wenn es auf Englisch ist, das entscheidende Dokument zum Thema ist Atmels doc0856.pdf Und da steht bei sbc: "SBC Rd,Rr" "Rd ← Rd - Rr - C" Das Ergebnis ist also r17 - r16 - carrybit, in deinem Beispiel 0x84 - 0x06 - carrybit. Der Wert des Carrybit stammt dabei aus einer vorhergehenden Operation. Es kann also zwei Ergebnisse geben, entweder 0x7E (wenn das Carrybit vorher Null war) oder 0x7D (wenn das Carrybit 1 war). Oliver
SBC ist praktisch bei Miltibyte-Subtraktion, z.B. die 24-Bit Subtraktion R22:20 -= R12:10
1 | SUB R20, R10 |
2 | SBC R21, R11 |
3 | SBC R12, R12 |
Neben dem Carry (C) setzten SUB und SBC auch das Zero-Flag (Z). Das Z ist nach der Operation genau dann gesetzt, wenn das Ergebnis 0 ist. Dazu ist es notwendig, dass SBC das Z-Flag der vorhergehenden Befehle beachtet, denn wenn has MSB des Ergebnisses 0 ist, ist noch lange nicht das Ergebnis selbst 0.
SBC setzt kein Zeroflag, sondern löscht es nur, wenn es gesetzt war und das Ergebnis der Subtraktion != 0 ist. Somit ist Z nach einer Multibyte-Subtraktion nur dann gesetzt, wenn alle Teilsubtraktionen 0 ergaben.
Nur als kleiner Hinweis: Diese exakten Eigenschaften von Subtraktion allgemein und SBC auf AVR im Besonderen gelten nicht universell. Manche anderen Prozessoren handhaben das C-Flag komplementiert und die soeben beschriebene Kumulierung des Z-Flags ist eher selten anzutreffen.
@ A. K. (prx) Wie funktioniert den SBC (oder wie immer der Befehl bei Nicht-AVRs heißt) mit komplementiert-em C-Flag? - Klingt erst mal nach komplett unbrauchbarem Unsinn.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.