MMIX Tutorial

 Posted by on 2006/05/01 at 13:13
 

Dieses kleine Tutorial soll dir helfen den MMIX-Assembler auf deinem Rechner ans laufen zu bekommen. Da ich bei mir MMIX bisher nur unter Windows eingerichtet habe, beschreibt dieses Tutorial die Einrichtung auch nur für Windows XP (unter Win2k sollte es ähnlich gehen).

Zuerst musst du dir den MMIX Assembler und den MMIX Emulator herunterladen. Ich habe zwei verschiedene Versionen gefunden, einmal eine relativ neue und die alte von der RechnerStrukturen-Seite des SS2003, welche Version besser ist weiß ich auch nicht. Entpacke die Dateien an einen beliebigen Ort auf deiner Festplatte, z.B. “c:\Programme\MMIX”

Windows-Einstellungen

Es ist hilfreich sich diesen Pfad zur Umgebungsvariable “Path” hinzuzufügen, damit der Rechner den MMIX auch ohne Pfadangabe findet.

Umgebungsvariable ändern:
“Arbeitsplatz” -> “Eigenschaften” (im Kontextmenü) -> “Erweitert” (Registerkarte) -> “Umgebungsvariablen”
Dort unter “Systemvariablen” die Variable “Path” suchen und auf “Bearbeiten” klicken. Bei “Wert der Variablen” kannst du am Ende deinen Pfad anfügen. Die einzelnen Pfade werden durch Semikolon getrennt. Du solltest nicht auf die Idee kommen hier willkürlich irgendwelche anderen Pfade zu verändern/löschen.

Jetzt solltest du dir einen Ordner anlegen in dem du deine MMIX-Programme ablegen kannst. z.B. “c:\Progen\MMIX”

Damit du diesen Ordner auch bequem mit der Konsole erreichen kannst, erstelle dir eine Verknüpfung auf “%SystemRoot%\system32\cmd.exe” (Hinweis: Das %SystemRoot% wird automatisch von Windows ersetzt und braucht dich daher nicht weiter zu kümmern)

Anschließend änderst du das Arbeitsverzeichnis der Verknüpfung auf den Pfad für deine selbstgeschriebenen Programme. Dadurch startet die Konsole automatisch im gewünschten Verzeichnis.

Arbeitsverzeichnis einer Verknüpfung ändern:
“Eigenschaften” der Verknüpfung (im Kontextmenü) aufrufen.
Dort kann man den gewünschten Pfad bei “Ausführen in:” angeben.

Es ist sehr empfehlenswert in Windows die Dateierweiterungen anzeigen zu lassen, damit man .mms-Dateien von .mmo-Dateien unterscheiden kann. Dies geht im Arbeitsplatz unter “Extras” -> “Ordneroptionen” -> “Ansicht” (Registerkarte) und dort den Haken bei “Erweiterungen bei bekannten Dateitypen ausblenden” entfernen.

Der Editor

Als nächstes brauchst du einen TextEditor mit dem du deine Programme schreibst. Ich empfehle Notepad2 (ist Opensource), zur Not reicht aber auch das einfache Windows-Notepad (“notepad.exe”). Es ist ungemein praktisch, wenn .mms-Dateien automatisch mit deinem Editor geöffnet werden. Notepad2 (siehe oben) unterstützt zwar Drag&Drop, trotzdem ist das öffnen per Doppelklick auf die Datei noch bequemer. (und Studis sind ja faul…)

Programm zum öffnen eines unbekannten Dateityps einstellen:
Klicke doppelt auf die unbekannte Datei und wähle “Programm aus einer Liste auswählen”. In der folgenden Liste wälst du das gewünschte Programm aus. Solltest du dein Programm nicht finden, kannst du unten auf “Durchsuchen…” klicken und die .exe-Datei deines gewünschten Editors manuell angeben. Damit das ganze von nun an immer automatisch passiert, kannst du den Haken bei “Dateityp immer mit (…) öffnen” auswählen.

Solltest du das ganze irgendwann einmal rückgänig machen wollen, oder du hast ein Programm, das nur glaubt es könne .mms-Dateien öffnen, dies geht hier:
“Arbeitsplatz” -> “Extras” -> “Ordneroptionen” -> “Dateitypen” (Registerkarte)
Hier kann man sich überings auch ein Datei-Icon einstellen, falls einem das Standart-Icon nicht gefällt.

Das erste Programm

Nun solltest du MMIX mit einem kleinen Programm, z.B. dem folgenden HelloWorld-Programm testen.

        LOC     #100
Text    BYTE    "Hello, World!",#a,0
Main    GETA    $255,Text
        TRAP    0,Fputs,StdOut
        TRAP    0,Halt,0

Erstelle eine Datei mit obigem Code und speichere sie unter “hello.mms”. Dann öffnest du die Konsole. Zuerst muss der Assembeler das Programm in Maschinen-Code umwandeln. Gebe dazu “mmixal hello.mms” in die Konsole ein. Anschließend kannst du das Programm mit “mmix hello” starten.

Fehlermeldungen – FAQ

In den Fehlermeldungen ist immer auch die Zeilennummer des Fehlers angeben. Somit kann man in den meisten Fällen einen Fehler schnell finden. Nun eine kleine Liste der häufigsten Fehlermeldungen/Warnungen beim assemblieren:

  • "test.mms", line 3 warning: relative address is not divisible by 4

    MMIX verwaltet relative Adressen in einem 4-Byte-Raster (ein TetraByte), da dadruch größere Sprungweiten möglich sind. D.h. die Addresse an der der Befehl liegt muss durch 4 teilbar sein. Andere Adressangaben werden auf die nächst niedrigere durch 4 teilbare Zahl abgerundet. Lösung: Benutze z.B. den LOC-Befehl um den Befehl in der angegebenen Zeile zu verschieben.

  • "test.mms", line 15 warning: trailing characters of long input line have been dropped

    Die angebene Zeile war zu lang und wurde abgeschnitten. In den meisten Fällen dürfte dies nur ein Kommentar gewesen sein. Es ist aber möglich die Datei mit der Option “-b <number>” zu assemblieren. Durch das folgende Beispiel wird der Lese-Puffer auf 256 Zeichen verlängert und der Fehler sollte nicht mehr auftreten: mmixal -b 256 test.mms

  • "test.mms", line 7: no base address is close enough to the address A!

    Du hast einem Load- bzw. Store-Befehl (LDB,STB, …) ein Label als Adresse übergeben. Diese ist zwar möglich, jedoch muss man in der Nähe der Speicheradresse die man laden/speichern will eine Basisadresse festlegen. Hier zu reicht ein einfaches GREG @ in der Nähe der Speicheradresse. (maximal 254 Tetrabytes entfernt) Dies fehlt in den Beispielen auf den Folien zur Vorlesung. (siehe Folien 28.04.05 – Seite 8,10)

  • "test.mms", line 8: relative address is more than #ffff tetrabytes forward!

    Du hast versucht mit GETA die Adresse eines Labels zu laden, das sich mehr als 65535 Tetrabytes entfernt von der aktuellen Speicherposition befindet, also beispielsweise im Data_Segment. Der GETA-Befehl kann jedoch nur auf Label im lokalen Speicherbereich (aktuelle Basisadresse) zugreifen. Verwende stattdessen den LDA Befehl (LoadAddress).
    Der Fehler kann auch im Zusammenhang mit Sprungbefehlen wie JMP oder BZ auftreten. Versuche dein Programm (also die Befehle, nicht die Daten) innerhalb von 65535 Tetrabytes anzuordnen. Sollte dies nicht möglich sein, teile dein Programm in Unterprogramme auf und benutze GO oder PUSHJ bzw. PUSHGO um zwischen den Teilen hin und her zu springen.

  • "test.mms", line 6: unknown operation code 'xxxx'!

    Den verwendeten Befehl gibt es nicht. Wahrscheinlich hast du dich vertippt.

  • undefined symbol: Main

    Du hast vergessen ein Label für den Programmanfang zu setzen. Eine andere Möglichkeit ist, dass das Label in einer ungültigen Zeile steht. Setze in der Zeile in der das Programm beginnen soll ein Label mit dem Namen “Main”. In dieser Zeile muss ein Assemblerbefehl stehen, kein Pseudo-Operator. (siehe Folien 28.04.05 – Seite 8 )

Links