Der DLX-Assembler DLXasm
DLXasm ist ein einfacher DLX-Assembler. Er sollte uns ursprünglich bei der Erstellung von Testprogrammen für unsere DLX-CPU behilflich sein. Aus dem kleinen Tool ist mittlerweile ein 3-Pass-Assembler geworden, der ein relativ komfortables Schreiben von DLX-Programmen ermöglicht. DLXasm liest Quellcode in Mnemonic-Schreibweise ein und übersetzt diesen in für den DLX-Simulator lesbare Instruktionen. Diese Instruktionen werden in Form von 32-Bit Integerwerten in einer Haskell-Liste gespeichert. Ausgegeben wird also eine hs-Datei, die im DLX-Simulator direkt als Speicherinhalt eingelesen und weiterverarbeitet werden kann. Dazu wird es im fertigen DLX-Simulator eine Eingabemöglichkeit geben, mit der man ein mit DLXasm assembliertes Programm einlesen und auszuführen kann.
Nachfolgendes Beispiel zeigt eine Ausgabe von DLXasm. Es ist die
assemblierte Version des Beispiel-Programms "bubble.as". Der Quelltext dazu befindet sich weiter unten.
Syntax: Die Syntax der Mnemonic-Schreibweise ist die gleiche, wie sie im Hennessy-Patterson vorgestellt wird. Also der Form: ADDI R1, R2, #123 LHI R4, #-1000 LB R30, 48(R0) SW -80(R20), R21 NOP JAL -1234 BNEZ R15, 20Immediates werden mit einer vorausgehenden Raute # gekennzeichnet und Register mit einem R. Displacements erfordern die bekannte Klammerung. Zusätzlich zu den DLX-Befehlen im Mnemonic-Format kann DLXasm noch mit einigen Assembleranweisungen umgehen:
Desweiteren sind jegliche Abstände zwischen Befehlen, Kommata, Klammern und Operanden völlig egal.
Es folgt das Beispiel-Programm "bubble.as". Es veranschaulicht gut, welchen Quellcode der Assembler
verarbeiten kann.
DLXasm kann nicht mit Bezeichnern für Variablen umgehen. D.h. man kann nicht Befehle der Art "SW X, R2" schreiben, wobei "X" eine Variable sein soll. Daher muß bei Speicherzugriffen mit Displacements gearbeitet werden. Da der DLX-Simulator sowieso Lehrzwecken dienen soll, ist dies kein Nachteil. Bei der Verwendung von Displacements ist zu beachten, daß die Zahlen Vielfache von vier sein müssen. Es wird PC-relativ zugegriffen. Beispiel: LW R1, 8(R0) ;lade Word aus der Speicherzelle hinter dem nächsten Befehl NOP DW 4711 ;auf diese Speicherzelle wird zugegriffenLast not least verfügt DLXasm über eine umfassende Fehlerbehandlung. Je nach Fehlerart wird eine Meldung mit Zeilennummer ausgegeben. Kodierung und Befehlsformat: Ich habe mich strikt an die R, I und J-type Befehlsformate aus Hennessy-Patterson gehalten. Einzige Ausnahme sind die Befehle mit den speziellen Opcodes. Dort wird func nicht in den höchstwertigen 11 Bit kodiert sondern in den höchstwertigen 6 Bit. Dies ist eine der Festlegungen, die am Anfang des Praktikums in Übereinstimmung mit der Gruppe 2 gemacht wurden. Desweiteren werden die Opcodes wie abgesprochen durchnummeriert (siehe dazu die Liste der DLX-Befehle).
Der Befehl TRAP wird auch kodiert, ist aber (zumindest
bei unserer DLX-CPU) nicht im Befehlssatz enthalten. Er wird von
uns als "Programmende"-Befehl verwendet bzw. für eine
kontrollierte Ausführung benutzt.
DLXasm [-o ziel.hs] quell.asBei Aufruf ohne Parameter wird diese Meldung ausgegen. Wird keine Ausgabedatei angegeben, erzeugt DLXasm standardmäßig als Ausgabe eine Datei "out.hs", in der dann der assemblierte Code liegt. Ein Aufruf der Art DLXasm datei.aswürde dies bewirken. Es kann aber auch explizit eine Ausgabedatei angegeben werden: DLXasm -o datei.hs datei.asNach dem Assemblieren liegt das Programm in für den DLX-Simulator verständlicher Form im Verzeichnis. Außerdem wird eine Datei "DLXasmPass2.as" erzeugt. In dieser Datei befindet sich der ursprüngliche Quellcode, so wie er nach der zweiten Assemblierungsphase aussieht. D.h. sämtliche Labels wurden durch Sprung-Offsets ersetzt. Diese Datei dient ausschließlich zur Fehlersuche. Wer den Assembler selbst unter Linux compilieren möchte, muß folgendes eingeben: flex -i DLXasm.l yacc DLXasm.y (oder: bison -y DLXasm.y) gcc -o DLXasm y.tab.c -lflDiese Arbeit auch automatisch von dem Bash-Script "Make" ausgeführt werden. (Nicht vergessen, das Execute-Bit für Make zu setzen.) Falls jemand eine GCC (GNU Compiler Collection) unter MS-Windows installiert hat, kann den Assembler auch unter Windows compilieren und dazu das Batch-Script "Make.bat" verwenden. Ich persönlich empfehle hierfür "mingw32", Download unter "http://agnes.dida.physik.uni-essen.de/~janjaap/mingw32/". Die Datei "DLXasm.exe" sollte aber unter allen MS-Windows 9x Versionen laufen (NT habe ich nicht getestet), so daß eine Neucompilierung ohnehin nicht notwendig ist.
WICHTIG: Sollte unter Linux das Compilieren des Assemblers nicht klappen oder
wenn der Assembler unerklärliche Ausgaben bzw. Fehlermeldungen erzeugt, ist zu
überprüfen, ob nicht vielleicht eine Quelldatei im DOS-Format (also mit
CR/LF) vorliegt bzw. im UNIX-Format (nur CR ?), falls unter MS-Windows compiliert wird.
- DLXasm : Ich habe diese Version unter Suse 6.5 compiliert, sollte somit auch unter Suse 6.5 laufen - DLXasm.exe : Version für MS-Windows - DLXasm.l : flex-Quelldatei - DLXasm.y : yacc-Quelldatei - Make : Bash-Script zur automatischen Compilierung von DLXasm unter Linux - Make.bat : Batch-Script - " - unter MS-Windows - DLX-Befehle : Eine Auflistung der Formate und Opcodes der DLX-Befehle, quasi die "Spezifikation" - bubble.as : Beispiel-Programm: BubbleSort mit gezieltem Abbruch - bubble.hs : assemblierte Version - fibo.as : Beispiel-Programm: Berechnet Fibonacci-Zahl - fibo.hs : assemblierte Version Über alle Änderungen/persönlichen Anpassungen am Quellcode - sofern sie erfolgen - bitte ich, mich zu benachrichtigen.
|