CMP (RAUTE)$nn
Aus C64-Wiki
Zur Navigation springenZur Suche springenMnemonic: | 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
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.