JSR $hhll
Mnemonic: | JSR $hhll |
Opcode: | $20 |
Operand(en): | $ll $hh |
Anzahl der Bytes: | 3 |
Befehlsgruppe: | Sprungbefehl |
Adressierung: | absolut |
Beeinflusste Flags im Statusregister: | |
keine | |
Taktzyklen: | 6 |
Der Assembler-Befehl JSR $hhll verzweigt zur angegebenen Adresse, indem der Programmzähler (PC) direkt auf diesen Wert gesetzt wird, wo dann die Programmausführung fortsetzt.
Vor der Verzweigung wird die um 1 verminderte Rücksprungadresse am Stapel gesichert, mit der der Befehl RTS am Ende des aufgerufenen Unterprogramms wieder an die aufrufende Stelle zurückkehren kann (dabei die Rücksprungadresse am Stapel um 1 korrigierend).
Die genauen Schritte, die bei JSR ablaufen, sind wie folgt:
- Programmzähler + 2
- High-Byte des Programmzählers auf den Stapel
- Stapelzeiger - 1
- Low-Byte des Programmzählers auf den Stapel
- Stapelzeiger - 1
- Das Sprungziel des JSR-Befehls in den Programmzähler übertragen
Auf den Stapel wird zuerst das High-, dann das Low-Byte der Rücksprungadresse-1 geschrieben (= Adresse des JSR-Opcodes + 2). Der RTS-Befehl "korrigiert" beim Rücksprung die vom Stapel genommene Adresse durch Addition von 1.
Funktionsprinzip
Bedeutung der Buchstaben im Befehl
JSR | Jump to SubRoutine |
Verzweige ins Unterprogramm |
Beispiel
; Dieses Programm löscht den Bildschirm und gibt einen Text an einer definierten Position aus. ; Programmstart mit SYS 49152 *=$c000 ; Startadresse des Programms BSOUT = $ffd2 start lda #147 ; Steuerzeichen für Bildschirm löschen jsr BSOUT ; Löschen durchführen ldx #03 ; Zeile 3 ldy #10 ; Spalte 10 clc ; Carry-Flag = 0 Cursorposition setzen, = 1 Cursorposition lesen jsr $fff0 ; Cursor setzen ldx #$00 ; Index für Textbuchstaben in X-Register schleife lda TEXT,X ; Zeichen holen beq ende ; Endmarkierung? (wenn 0) jsr BSOUT ; Zeichen am Bildschirm ausgeben inx ; nächstes Zeichen der Zeichenkette jmp schleife ende rts ; Rücksprung ins Basic TEXT .text "C64-WIKI" ; Zeichenkette .byte $00 ; Endemarkierung
Speicherauszug:
.c000 a9 93 lda #$93 .c002 20 d2 ff jsr $ffd2 .c005 a2 03 ldx #$03 .c007 a0 0a ldy #$0a .c009 18 clc .c00a 20 f0 ff jsr $fff0 .c00d a2 00 ldx #$00 .c00f bd 1c c0 lda $c01c,x .c012 f0 07 beq $c01b .c014 20 d2 ff jsr $ffd2 .c017 e8 inx .c018 4c 0f c0 jmp $c00f .c01b 60 rts >c01c 43 36 34 2d 57 49 4b 49 00
Siehe Assembler-Befehl-Beispiele.
Vergleichbare BASIC-Anweisung
Für BASIC V2:
GOSUB