Interpreter-System mit AVR

Gast #11900
Lesenswert?

Hallo,

ich will versuchen ein kleines Interpreter-System für meinen AVR zu 
schreiben. Dazu will ich den Compiler den Code in Byte-Tokens übersetzen 
lassen. Im AVR selbst sollen dann die zum Token gehörigen Routinen mit 
einer Sprungtabelle angesprungen werden. Mit dem folgenden Code kann ich 
die zum Token gehörige Sprungadresse holen. Wie kann man es schaffen, an 
diese Adresse (in r1 u. r2) zu springen?

MfG
Matthias

.include "2333def.inc"

.def sprung_low  = r1
.def sprung_high = r2

  ;...

  ;Token holen
  ;...

  ldi r30,low(tabelle)  ;Anfang der Tabelle in Z-Pointer
  ldi r31,high(tabelle)

  ;Token auf Anfangsadresse addieren
  ;...

  lpm      ;Low-Byte der Sprungadresse holen
  mov r0,sprung_low
  adiw r30,1    ;Z-Pointer inkrementieren
  lpm      ;High-Byte der Sprungadresse holen
  mov r0,sprung_high

  ;Sprung an 'sprung_low','sprung_high'

  ;...

;Routinen für Tokens

token1:
  nop
  ret

token2:
  nop
  ret

;...


;Sprungtabelle

tabelle:
.dw token1,token2
Admin Persönliche Seite #11901
Lesenswert?

Vielleicht so:

push r1
push r2
(oder umgedreht, bin grad zu faul darüber nachzudenken)
ret

Oder schau dir mal den Befehl icall an.

BTW: ich fange auch gerade an einen Interpreter zu schreiben, allerdings 
direkt für Klartext-Programme. Im Moment bin ich noch beim Parsen von 
mathematischen Ausdrücken... geklammert funktioniert das schon, aber 
Punkt vor Strich wäre auch ganz schön, deswegen wird das ganze jetzt neu 
gemacht :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren