Das geht auch einfacher mit IJmp oder ICall.
Aufpassen: diese Befehle können manche AVR Controller nicht, also
besser vorher im Datenblatt nachschlagen.
Im Prinzip funktioniert das so (habs die Syntax nicht ausprobiert):
; Sprungtabelle in Z-Pointer laden
LDI ZL, low(Sprungtabelle)
LDI ZH, high(Sprungtabelle)
;hier musste nochmals nachschlagen das Prinzip sollte klar sein, der
Assembler soll das low byte der Adresse der Sprungtabelle in ZL laden
dito für ZH, die Syntax sieht bestimmt ein bischen anders aus.
; Nachdem jeder Eintrag in der Sprungtabelle 2 byte gross ist musst du
den Index-Wert in R16 noch mit 2 multiplizieren das enspricht einem
linksshift.
LSL R16
;Nun index auf Z draufaddieren (auf überlauf des lowbyte achten!)
; daher vorher ein Register mit 0 laden
SUB R0,R0 ; R0 wird mit 0 geladen
ADD ZL, R16 ; R16 wird auf ZL addiert und C ggfs. gesetzt
ADC ZH, R0 ; ZH = ZH + 0 + C, ggfs carry draufaddieren. zum
Registersparen geht das auch ohne R0 mit Abfrage des Carrybits und
einem eventuellen INC des ZH.
; Nun der eingentliche Sprung
Ijmp
; Hier nun die Sprungtabelle
Srungtabelle:
rjmp prog0
rjmp prog1
rjmp prog2
....
ciao
Remo