Befehl sbc Assembler

OP #4380324
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ß
#4380343
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
Persönliche Seite #4380358
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.
Gast #4380454
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren