JMP / RJMP / IJMP / EIJMP - Jump

JMP Adresse
Adresse: Wert des Programm Counters (PC)

Mit diesem Befehl kann der Adresspointer auf einen neuen Wert gesetzt werden. Dadurch springt die Programmausführung an diese neue Adresse.
Die verschiedenen JMP-Befehle stehen auf verschiedenen Prozessortypen in Abhängigkeit des vorhandenen Adressraums zur Verfügung.

JMP: Spungbefehl innerhalb eines 4MWords (=8MByte) Adressraums.

RJMP: Spungbefehl innerhalb eines 4kWords (=8kByte) Adressraums (±2kWords). Dieser Befehl hat zwar eine eingeschränkte Sprungweite, ist jedoch platzsparender und schneller als der JMP-Befehl.

IJMP: Indirekter Spungbefehl auf die Adresse die im Z-Pointer (PC(15:0)) geladen ist. Dieser Befehl kann nur eine 16-Bit Adresse (innerhalb des unteren Adressbereichs) ansprechen. Es sind 64kWords (=128kByte) ansprechbar, da Adressen immer wortweise adressiert werden.

EIJMP: Erweiterter indirekter Spungbefehl innerhalb eines 4MWords (8MByte) Adressraums. Zu dem Z-Pointer wird das EIND-Register für die oberen Adressbits (PC(21:16)) hinzugenommen. Der Befehl ist nur auf Prozessoren mit mehr als 64kWords Adressraum vorhanden.


Beispiel:

jmp Label ;Sprung auf die Adresse, die im Code mit 'Label:' gekennzeichnet ist

rjmp Label ;Sprung auf die Adresse, die im Code mit 'Label:' gekennzeichnet ist. Funktioniert nur, wenn das Label innerhalb von ±2k-Adressen vor oder hinter dem Sprungbefehl ist.

ldi ZH, high(Label<<1)
ldi ZL, low(Label<<1)
ijmp ;Sprung auf die Adresse, die im Z-Pointer ist

ldi r0, page(Label<<1) ;Hier werden die Bytes 21-16 einer Adresse geladen
out eind, r0 ;Speichern im EIND-Register
ldi ZH, high(Label<<1) ;Laden von high und low-Byte der Adresse
ldi ZL, low(Label<<1)
eijmp ;Sprung auf die Adresse, die im Z-Pointer und im EIND-Register ist

Statusregister: Keine Beeinflussung
Speicherplatz:
JMP: 4 Byte
RJMP: 2 Byte
IJMP: 2 Byte
EIJMP: 2 Byte

Taktzyklen:
JMP: 3
RJMP: 2
IJMP: 2
EIJMP: 2