CPY $ll
Aus C64-Wiki
Zur Navigation springenZur Suche springenMnemonic: | 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
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.