mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interpreter-System mit AVR


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
wieso wollen auf einmal allen Interpreter für AVR schreiben? :)
Ich selbst plane einen Interpreter und ein Bekannter von mir auch :))
Wie soll denn Deine Syntax aussehen?

Gruß
Markus

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meiner soll vielleicht ungefähr so aussehen:

int $variable1
int $variable2

$variable1=300
$variable2=($variable1/100)+(25*einefunktion(1,5))

Also ziemlich C-ähnlich. Ist aber alles erst in Planung.

Gruß
Andreas

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke, der icall-Befehl ist genau das, was ich gesucht habe!
Ich stehe mit meinem Interpretersystem noch ganz am Anfang. Aber die 
Syntax soll Pascal ähnlich werden.

MfG
Matthias

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.