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


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

Ass befehl c9.gif

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