SBC $hhll

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Mnemonic: SBC $hhll
Opcode: $ED
Operand(en): $ll $hh
Anzahl der Bytes: 3
Befehlsgruppe: Arithmetik- und Logikbefehl
Adressierung: absolut
Beeinflusste Flags im Statusregister:
Carry-Flag
Negative-Flag
Overflow-Flag
Zero-Flag
Taktzyklen: 4


Der Assembler-Befehl SBC $hhll subtrahiert vom Inhalt des Akkumulators den Inhalt der Speicherzelle $hhll und den komplementierten Inhalt des Carry-Flags.
Daher sollte vor jeder Subtraktion, sofern nicht der Übertrag in einer zusammengesetzten Subtraktion zu berücksichtigen ist, das Carry-Flag mit dem Befehl SEC gesetzt werden.
Das Ergebnis wird im Akkumulator gespeichert.
Der komplementierte Übertrag (0 oder 1), gewissermaßen in der Bedeutung eines Borge-Bits (engl. borrow), kommt ins Carry-Flag.
Bei gesetztem Decimal-Flag erfolgt die Berechnung in BCD-Arithmetik, wobei bei Operanden im gültigen BCD-Format nur das Carry-Flag und Zero-Flag entsprechend gesetzt werden. Negative-Flag und Overflow-Flag werden zwar entsprechend der Komplement-Darstellung der Operanden verändert, haben aber keine Bedeutung für die BCD-Arithmetik.

Funktionsprinzip

Ass befehl ed.gif

Bedeutung der Buchstaben im Befehl

SBC SuBtract with Carry
Subtrahiere vom Akkumulator den Operand und das komplementierte Carry-Flag

Beispiel

Siehe auch optimiertere Variante.

; Diese Programm macht eine 16-Bit-Subtraktion
; und gibt das Ergebnis am Bildschirm aus.
; Programmstart mit SYS 49152

*=$c000   ; Startadresse des Programms

AXOUT = $bdcd

start      sec             ; Carry-Bit setzen
           lda l_zahl1     ; Low-Byte der 1.Zahl mit
           sbc l_zahl2     ; Low-Byte der 2. Zahl subtrahieren
           sta l_ergebnis  ; Low-Byte ins Ergebnis schreiben
                           ; Vor der High-Byte-Subtraktion wird das Carry-Bit nicht gesetzt, 
                           ; weil sein Wert anzeigt, ob ein Unterlauf bei Low erfolgte.
           lda h_zahl1     ; High-Byte der 1. Zahl mit
           sbc h_zahl2     ; High-Byte der 2. Zahl subtrahieren
           sta h_ergebnis  ; High-Byte ins Ergebnis schreiben		

           ldx l_ergebnis  ; Low-Byte des Ergebnisses ins X-Register 
           lda h_ergebnis  ; High-Byte des Ergebnisses in den Akku
           jsr AXOUT       ; 16-Bit-Zahl ausgeben

           rts             ; Rücksprung zu BASIC		

l_zahl1    .byte $55       ; Zahl1 = $4155
h_zahl1    .byte $41 
l_zahl2    .byte $00       ; Zahl2 = $1000
h_zahl2    .byte $10
l_ergebnis .byte $00       ; Ergebnis = $0000
h_ergebnis .byte $00

Speicherauszug (vor der Ausführung):

.c000	 38            sec
.c001	 ad 1d c0      lda $c01d
.c004	 ed 1f c0      sbc $c01f
.c007	 8d 21 c0      sta $c021
.c00a	 ad 1e c0      lda $c01e
.c00d	 ed 20 c0      sbc $c020
.c010	 8d 22 c0      sta $c022
.c013	 ae 21 c0      ldx $c021
.c016	 ad 22 c0      lda $c022
.c019	 20 cd bd      jsr $bdcd
.c01c	 60            rts
>c01d	 55
>c01e	 41
>c01f	 00
>c020	 10
>c021	 00
>c022	 00

Vergleichbare BASIC-Anweisung

Für BASIC V2:

10 Z1=8533  : REM $4155 (16725)
20 Z2=4096  : REM $1000 (4096)
30 E=Z1-Z2
40 PRINT E  : REM $3155 (12629)

Entsprechend obigem Beispiel.

Beispielprogramme