LSR $ll
Mnemonic: | LSR $ll |
Opcode: | $46 |
Operand(en): | $ll |
Anzahl der Bytes: | 2 |
Befehlsgruppe: | Rotations- und Schiebebefehl |
Adressierung: | Zeropage |
Beeinflusste Flags im Statusregister: | |
Carry-Flag | |
Negative-Flag | |
Zero-Flag | |
Taktzyklen: | 5 |
Der Assembler-Befehl LSR $ll verschiebt die acht Bits des Zeropage-Speicherstelleninhalts $ll um eine Bit-Position nach rechts (von den höherwertigen zu den niederwertigen Bits). Das höchstwertige Bit wird 0 und das herausfallende Bit wird im Carry-Flag aufgefangen.
Damit teilt dieser Befehl den Inhalt der Speicherstelle durch 2. Der Divisionsrest wird im Carry-Flag abgebildet.
Das Negative-Flag wird dabei immer zurückgesetzt, da das Ergebnis stets einem positiven Wert entspricht.
Die zu dieser logischen Operation korrespondierende arithmetische Operation (ein hypothetischer ASR-Befehl) ist nicht implementiert und muss entsprechend ausprogrammiert werden (siehe ASL-Beispiel).
Funktionsprinzip
Bedeutung der Buchstaben im Befehl
LSR | Logical Shift Right |
Logisches Rechts-Schieben |
16-Bit-Rechtsschieben
Dieses Programmfragment dividiert den vorzeichenlose 16-Bit-Wert an Speicherstelle $0022/$0023 durch 2 und zeigt dabei die Kaskadierung für über 8 Bit hinausgehende Werte.
*=$c000 ; Startadresse des Programms lsr $23 ; höherwertiges Byte in Zeropage, Bit 0 im Carry, ror $22 ; niederwertiges Byte, nimmt das Carry mit, ; Carry-Flag enthält den Rest der Division
Speicherauszug:
.c000 46 23 lsr $23 .c002 66 22 ror $22
Speicherstellen-Flag löschen
Ein billige Variante ein Flag zu führen, ist dieses als Bit7 einer Speicherstelle auszulegen. Gelöscht kann es ohne ein Register zu verändern wie folgt:
*=$c000 ; Startadresse des Programms lsr $0d ; Flag in Bit7 auf 0 setzen ... bit $0d ; Flag prüfen bmi gesetzt ; Flag gesetzt! ... gesetzt:
Speicherauszug:
.c000 46 0d lsr $0d ... .c0XX 24 0d bit $0d .c0YY 30 ZZ bmi $c0ZZ ... .c0ZZ