CMP (RAUTE)$nn

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Mnemonic: CMP #$nn
Opcode: $C9
Operand(en): $nn
Anzahl der Bytes: 2
Befehlsgruppe: Arithmetik und Logikbefehl
Adressierung: unmittelbar
Beeinflusste Flags im Statusregister:
Carry-Flag
Negative-Flag
Zero-Flag
Taktzyklen: 2
1 PC R Lese Befehl, inkrementiere PC
2 PC R lese Wert, inkrementiere PC


Der Assembler-Befehl CMP #$nn vergleicht den Akkumulator mit dem konstanten Wert nn.
Der Wert wird vom Akkumulator subtrahiert und entsprechend dem nicht gespeicherten Zwischenergebnis werden die Flags des Statusregisters gesetzt.

Funktionsprinzip

Carry-Flag Zero-Flag Negative-Flag wenn
1 0 0 Differenz > 0
1 1 0 Differenz = 0
0 0 1 Differenz < 0


Bedeutung der Buchstaben im Befehl

CMP CoMPare with Accumulator
Vergleiche mit Akkumulator

Beispiel

; Dieses Programm zeigt eine Eingabe-Routine, die mit Return  beendet wird.
; Es werden nur die ASCII-Zeichen 32-95 zugelassen. (Steuerzeichen werden herausgefiltert)
; Die Länge der Eingabe kann auf einen konstanten Wert begrenzt werden.
; DEL  kann zur Korrektur verwendet werden.
; Das Ergebnis der Eingabe liegt ab $c042. Das Ende wird durch eine 0 gekennzeichnet.
; Programmstart mit SYS 49152

*=$c000   ; Startadresse des Programms

BSOUT = $ffd2
GETIN = $ffe4
MAX = 10

start           ldx #0         ; Zeichenzähler
                stx counter
eingabe         jsr GETIN      ; Zeichen einlesen			
                beq eingabe    ; wenn keine Taste gedrückt --> zurück zur Eingabe 

                cmp #13        ; wenn Return-Taste --> Programmende
                beq ende

                cmp #20        ; wenn nicht die DEL-Taste --> verzweige nach weiter
                bne weiter
                ldx counter
                beq eingabe    ; wenn Zeichenzähler=0 --> DEL-Taste ignorieren
                dec counter    ; Zeichenzähler-1
                jmp out        ; DEL ausführen

weiter          cmp #32        ; nur Zeichen mit ASCII-Code zwischen 32 und 95 zulassen
                bcc eingabe    ; wenn < 32 --> zurück zur Eingabe
                cmp #96
                bcs eingabe    ; wenn >= 96 --> zurück zur Eingabe

ausgabe         ldx counter
                cpx #MAX
                bcs eingabe    ; wenn max. Eingabelänge erreicht --> Zeichen ignorieren
                sta text, x    ; Zeichen speichern
                inc counter    ; Zeichenzähler +1
out             jsr BSOUT      ; Zeichen ausgeben
                jmp eingabe

ende            lda #0         ; das Ende des Textes mit 0 abschließen
                ldx counter
                sta text, x

                rts            ; Rücksprung ins BASIC

counter  .byte 0
text     .byte 0

Speicherauszug:

.c000	 a2 00      ldx #$00
.c002	 8e 41 c0   stx $c041
.c005	 20 e4 ff   jsr $ffe4
.c008	 f0 fb      beq $c005
.c00a	 c9 0d      cmp #$0d
.c00c	 f0 2a      beq $c038
.c00e	 c9 14      cmp #$14
.c010	 d0 0b      bne $c01d
.c012	 ae 41 c0   ldx $c041
.c015	 f0 ee      beq $c005
.c017	 ce 41 c0   dec $c041
.c01a	 4c 32 c0   jmp $c032
.c01d	 c9 20      cmp #$20
.c01f	 90 e4      bcc $c005
.c021	 c9 60      cmp #$60
.c023	 b0 e0      bcs $c005
.c025	 ae 41 c0   ldx $c041
.c028	 e0 0a      cpx #$0a
.c02a	 b0 d9      bcs $c005
.c02c	 9d 42 c0   sta $c042,x
.c02f	 ee 41 c0   inc $c041
.c032	 20 d2 ff   jsr $ffd2
.c035	 4c 05 c0   jmp $c005
.c038	 a9 00      lda #$00
.c03a	 ae 41 c0   ldx $c041
.c03d	 9d 42 c0   sta $c042,x
.c040	 60         rts
>c041	 00         .byte 0
>c042	 00         .byte 0

Vergleichbare BASIC-Anweisung

Vergleich BASIC Assembler-Befehl(e) nach CMP
= IF A = nn THEN GOTO label BEQ label
<> IF A <> nn THEN GOTO label BNE label
>= IF A >= nn THEN GOTO label vorzeichenlos:
BCS label
oder vorzeichenbehaftet:
BPL label
> IF A > nn THEN GOTO label vorzeichenlos:
BEQ skip
BCS label
skip: ...
oder vorzeichenbehaftet:
BEQ skip
BPL label
skip: ...
<= IF A <= nn THEN GOTO label vorzeichenlos:
BEQ label
BCC label
oder vorzeichenbehaftet:
BEQ label
BMI label
< IF A < nn THEN GOTO label vorzeichenlos:
BCC label
oder vorzeichenbehaftet:
BMI label

Anmerkung: Das Sprungziel label ist in der BASIC-Variante als Zeilennummer zu verstehen.

Beispielprogramme