HAL Interpreter
-
Hallo...
hab ein kleines problem mit einem Programm das ich für die Betriebssystem-Vorlesung schreiben muss.
Aufgabe ist es einen HAL-Interpreter zuschreiben.
Der HAL Befehlssatz ist sehr minimal. Ein kleines HAL-Programm das 2 Zahlen einliest, sie dann addiert
und das Ergebnis ausgibt würde z.B. so aussehen:START //Start des Programms IN //Eingabe über cin in Akkumulator STORE 10 //Akkumulator in Register 10 schieben IN //Eingabe über cin in Akkumulator ADD 10 //register 10 zu Akkumulator addieren OUT //ausgabe über cout des Akkumulaors STOP //Ende des Programms
Der komplette Befehlssatz des HAL's besteht aus:
START,STOP,IN,OUT,LOADNUM,LOAD,STORE,JUMPPOS,JUMPNEG,JUMP,ADD,SUB,MUL,DIV,ADDNUM,SUBNUM,MULNUM,DIVNUM.Den Interpreter dafür zuschreiben war auch eigentlich überhaupt kein
Problem. Doch nun sollen wir den Interpreter so erweitern, das die JUMP-Befehle
auch mit Labels arbeiten können.Hier mal 2 Beispiele einmal ohne Labels und einmal mit Labels.
Ohne Labels:
00 START //Start des Programms 01 IN //Eingabe über cin in Akkumulator 02 JUMPNEG 4 //Wenn Eingabe negativ Sprung zu Zeile 4 03 JUMP 5 //Wenn nicht Sprung zu Zeile 5 04 MULNUM -1 //Akkumulator mit -1 multiplizieren 05 STORE 10 //Ergebnis in Register 10 speichern 06 STOP //Ende des Programms
Mit Labels:
START //Start des Programms IN //Eingabe über cin in Akkumulator JUMPNEG ifneg //Wenn Eingabe negativ Sprung zu Zeile 4 JUMP else //Wenn nicht Sprung zu Zeile 5 ifneg MULNUM -1 //Akkumulator mit -1 multiplizieren else STORE 10 //Ergebnis in Register 10 speichern STOP //Ende des Programms
Zuerst habe ich gedacht das wäre kein Problem, doch irgendwie überlege ich
nun schon seit gestern wie ich das am besten umsetze und komme auf keine
schöne Lösung dafür.Ohne die Labels habe ich das HAL-Programm einfach zeilenweise eingelesen, habe
mir dann den Befehl und falls vorhanden den Parameter heraus gezogen und das
ganze dann in einer Struktur gespeichert und in den Speicher(ein Vector) geladen
um es später Befehl für Befehl abzuarbeiten.Doch nun mit Labels funktioniert dieser Ansatz nicht mehr, denn wenn ich nun
einen JUMP-Befehl einlese, kann ich zwar erkennen das ich zu einem Label
springen soll, jedoch weiß ich an dieser stelle noch nicht welche
Sprungadresse(Zeilenummer) das Label hat an die ich springen soll, da ich an
dieser Stelle die Zeile mit dem Label möglicherweise noch gar nicht eingelesen
habe. Hoffe ihr versteht mein Problem.Einer der vielen Ansätze die ich mir überlegt habe und den ich bis jetzt am
Besten finde wäre das HAL-Programm mehrmals zu durchlaufen.1.Durchlauf -> Nach Labels suchen und die dazu gehörigen
----------------> Sprungadressen(Zeilennummer) speichern.2.Durchlauf -> Labels durch die gefunden Sprungadressen(Zeilennummern)
----------------> ersetzen.3.Durchlauf -> HAL-Programm ganz normal wie zuvor ohne Labels durchlaufen
----------------> und interpretieren.Jedoch bin ich mir einfach nicht sicher ob das ein guter Ansatz ist und ob
es nicht vielleicht doch besser und einfacher gehen könnte.Tut mir sehr leid das ich jetzt so viel geschrieben habe, hoffe aber das sich
vielleicht doch einer von euch die mühe macht sich mein Problem durch zulesen
und mir vielleicht ein paar Vorschläge machen kann wie ich das am Besten
umsetzen könnte. Will auch keine Musterlösung, sondern einfach nur ein paar
gute Ansätze mit denen ich dann weiter arbeiten kann.mfg Timo
-
Hallo,
Mein Vorschlag wäre:
Du liest dein Programm wie bisher ein und wenn du auf eine Labelmarke triffst speicherst du diese mit Namen und Zeile in einem Vector. Triffst du nun auf einen Sprung zu einem Label das noch nicht definiert(im Vektor abgelegt) wurde läufst du einfach so lange weiter bis du das Label gefunden hast. Sollte das Programm schon vorher zu ende sein musst du halt eine Fehlermeldung bringen, dass es dieses Label nicht gibt. Das Programm erst nach Labels zu durchsuchen halte ich für zu langsam!Viele Grüße,
Patrick