Hallo, im Register r16 steht bei mir ein Command der nun Ausgeführt werden soll (r16 wurde von der ser. Schnittstelle eingelesen). Nun möchte ich jenach inhalt von r16 zu den Befehlen springen. Ich dachte mir das in etwa so. main: [..] jmp 0x0100+(r16*2) (Hier haperts!) .org 0x0100 ; Befehlstabelle rjmp Befehl1 rjmp Befehl2 [..] rjmp Befehl31 Befehl1: dosometing rjmp main Befehl2: dosomethingelse rjmp main [..] Befehl 31: nochetwastun rjmp main Nur wie springe ich in der Zeile jmp 0x0100+(r16*2) am besten? Oder ist der Ansatz ganz falsch? Grüße Tobias
Der Ansatz dann aber 2xr16 zu 0x0100 dazuzuzählen stimmt, aber? Oder einfach nur noch daführ sorgen das das Ergebnis in r30,r31 steht und dann ijmp?
Der Ansatz ist im Prinzip richtig, nur es muss R16 im Gegensatz zum Tabellenzugriff nicht mit 2 multipliziert werden. Dies gilt nur, wenn die Tabelle aus RJMP Befehlen besteht. Hier also mal der Code als Denkanstoss. ldi R30,low(JMP_TABLE) ldi R31,high(JMP_TABLE) add R30,R16 brcc PC + 2 inc R31 ijmp JMP_TABLE: rjmp BEFEHL1 rjmp BEFEHL2 rjmp BEFEHL3 ....
Hi, super! Es funktioniert perfekt. Eine Frage noch. Was steht in "PC"? Die aktuelle Adresse im Programmspeicher? Grüße Tobias
PC ist der "Program Counter", die aktuelle Adresse im Programmspeicher. (Der Assembler führt bei der Schreibweise "rjmp PC+2" allerdings keine wirkliche Addition mit PC durch, da rjmp sowieso schon eine relative Adressangabe erwartet.)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.