Forum: Mikrocontroller und Digitale Elektronik "JMP Tabelle"


von Tobias Müller (Gast)


Lesenswert?

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

von crazy horse (Gast)


Lesenswert?

geht nur mit ijmp (indirekt jump (z). Also Zieladresse muß in Z stehen.

von Tobias Müller (Gast)


Lesenswert?

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?

von mikki merten (Gast)


Lesenswert?

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
      ....

von Tobias Müller (Gast)


Lesenswert?

Hi,

super! Es funktioniert perfekt. Eine Frage noch. Was steht in "PC"? Die 
aktuelle Adresse im Programmspeicher?

Grüße
  Tobias

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.