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


Anmelden zum Antworten