CPY $ll

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Mnemonic: CPY $ll
Opcode: $C4
Operand(en): $ll
Anzahl der Bytes: 2
Befehlsgruppe: Arithmetik- und Logikbefehl
Adressierung: Zeropage
Beeinflusste Flags im Statusregister:
Carry-Flag
Negative-Flag
Zero-Flag
Taktzyklen: 3


Der Assembler-Befehl CPY $ll vergleicht das Y-Register mit dem Inhalt der Zeropage-Adresse $ll.
Der Wert wird vom Y-Register subtrahiert und entsprechend dem nicht gespeicherten Zwischenergebnis werden die Flags des Statusregisters gesetzt.

Funktionsprinzip

Ass befehl c4.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

CPY ComPare with Y-Register
Vergleiche mit Y-Register

Beispiele

16-Bit Vergleich

; Diese Programmfragment macht einen 16-Bit-Vergleich zwischen dem Wert in den Registern Y/A 
; und dem Wert in der Zeropage $22/$23.

*=$c000   ; Startadresse

           cpy $22     ; beispielsweise ein Zeiger, niederwertiges Byte
           sbc $23     ; wegen Übertrag - Akkumulator wird dabei "zerstört"
           bcc weiter  ; weiter, wenn A/Y kleiner als Inhalt von $22/$23
           rts         ; retour, wenn größer oder gleich
weiter

Speicherauszug:

.c000	 c4 22  	cpy $22
.c002	 e5 23  	sbc $23
.c004	 90 01  	bcc $c007
.c006	 60     	rts

16-Bit Vergleich abteilig

Hier wird der Akkumulator nicht zerstört und im Mittel schneller, weil nur häufiger nur das höherwertige Byte verglichen werden muss. Die etwaige bessere Ausführungszeit (etwa in einer Schleife) geht allerdings auf Kosten der Codelänge.

; Diese Programmfragment macht einen 16-Bit-Vergleich zwischen dem Wert in den Registern Y/A 
; und dem Wert in der Zeropage $22/$23.

*=$c000   ; Startadresse

           cmp $23      ; beispielsweise ein Zeiger, höherwertiges Byte zuerst
           bcc weiter   ; gleich weiter, wenn höherwertiges Byte kleiner
           bne abbruch  ; falls größer 
           cpy $22      ; nur bei Gleichheit auch niederwertiges Byte vergleichen
           bcc weiter   ; A/Y doch kleiner 
abbruch    rts          ; retour, wenn größer oder gleich
weiter

Speicherauszug:

.c000	 c5 22  	cmp $23
.c002	 90 07  	bcc $c00b
.c004	 D0 04  	bne $c00a
.c006	 c4 22  	cpy $22
.c008	 90 04  	bcc $c00b
.c00a	 60     	rts
.c00b

Vergleich mit BASIC

Vergleich BASIC Assembler-Befehl(e) nach CPY
= IF Y = nn THEN GOTO label BEQ label
<> IF Y <> nn THEN GOTO label BNE label
>= IF Y >= nn THEN GOTO label vorzeichenlos:
BCS label
oder vorzeichenbehaftet:
BPL label
> IF Y > nn THEN GOTO label vorzeichenlos:
BEQ skip
BCS label
skip: ...
oder vorzeichenbehaftet:
BEQ skip
BPL label
skip: ...
<= IF Y <= nn THEN GOTO label vorzeichenlos:
BEQ label
BCC label
oder vorzeichenbehaftet:
BEQ label
BMI label
< IF Y < 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