Forum: Mikrocontroller und Digitale Elektronik Befehl sbc Assembler


von Florian S. (sirius7)


Lesenswert?

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ß

von Oliver S. (oliverso)


Lesenswert?

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

von Florian S. (sirius7)


Lesenswert?

alles klar Oliver, vielen Dank!

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von Mr. Claudius (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von Oldie (Gast)


Lesenswert?

@  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
Noch kein Account? Hier anmelden.