Content |
ULM-Simulator installieren
Der ULM-Simulator ist selbst in C++ geschrieben. Um diesen benutzen zu können, sind folgende Schritte notwenig:
-
Den C++ Souce-Code von der ULR
http://www.mathematik.uni-ulm.de/~lehn/ulm.cc
herunterladen.
-
Den Source-Code mit einem C++ Compiler übersetzen
g++ -Wall -std=c++11 -o ulm ulm.cc
-
An einem kleinen Beispiel testen, ob alles funktioniert.
Demo für das Herunterladen und installieren
$shell> wget http://www.mathematik.uni-ulm.de/~lehn/ulm.cc --2016-04-23 12:10:21-- http://www.mathematik.uni-ulm.de/~lehn/ulm.cc Resolving www-proxy.uni-ulm.de... 134.60.1.151 Connecting to www-proxy.uni-ulm.de|134.60.1.151|:3128... connected. Proxy request sent, awaiting response... 200 OK Length: 14696 (14K) Saving to: 'ulm.cc' 0K .......... .... 100% 10.4M=0.001s 2016-04-23 12:10:21 (10.4 MB/s) - 'ulm.cc' saved [14696/14696] $shell> g++ -Wall -std=c++11 -o ulm ulm.cc $shell> ls ulm ulm.cc $shell>
Format für Programme in ULM-Maschinencode
Ein Programm in ULM-Maschinencode, das mit dem ULM-Simulator ausgeführt werden kann, sieht beispielsweise so aus
81 20 00 05 # orq $32, %0, %5 11 05 F8 0A # movq -8(%5), %10 00 00 00 00 # halt 00 00 00 00 # halt 00 00 00 00 # halt 00 00 00 00 # halt FF FF FF FF # .quad -1 FF FF FF FF #
Zu beachten ist:
-
Pro Zeile steht ein Maschinenbefehl.
-
Leerzeichen werden ignoriert.
-
Der Maschinenbefehl muss als Hexadezimalzahl dargestellt sein.
-
Pro Zeilen werden nur die ersten acht Ziffern gelesen. Der Rest einer Zeile kann als Kommentar für den Maschinencode verwendet werden. Eine Zeile mit
01 23 45 67 # Das soll ...
ist also äquivalent zu
01234567#Dassoll...
Man muss einen Kommentar nicht mit # einleiten. Auch
01234567Dassoll...
ist für die Maschine einfach nur
01234567
Auch dieses Beispiel kann mit wget geladen werden:
$shell> wget http://www.mathematik.uni-ulm.de/~lehn/example.ulm --2016-04-23 12:10:23-- http://www.mathematik.uni-ulm.de/~lehn/example.ulm Resolving www-proxy.uni-ulm.de... 134.60.1.151 Connecting to www-proxy.uni-ulm.de|134.60.1.151|:3128... connected. Proxy request sent, awaiting response... 200 OK Length: 213 Saving to: 'example.ulm' 0K 100% 36.7M=0s 2016-04-23 12:10:23 (36.7 MB/s) - 'example.ulm' saved [213/213] $shell>
Demo zum Testen des ULM-Simulators
Auf der Kommadozeile startet man die ULM, indem man als Argument den Dateinamen für ein Maschinenprogramm übergibt. Zum Beispiel
./ulm example.ulm
Per Default wird die ULM dieses Programm interaktiv ausführen, das heisst
-
Zunächst wird der Zustand der Maschine beim Start dargstellt. Bevor der erste Befehl ausgeführt wurde (CPU-Cycle 0).
-
Drückt man Return wird jeweils der nächste Befehl ausgeführt und der neue Zustand der Maschine dargestellt.
Die Maschine kann auch nicht-interaktiv mit der Option -r (run) gestartet werden. Dann rauscht das durch wie in diesem Demo:
$shell> ./ulm -r example.ulm CPU cycles done 0 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 81 20 00 05 11 05 f8 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |0 |8 |16 |24 |32 |40 |48 |56 |0x0 |0x8 |0x10 |0x18 |0x20 |0x28 |0x30 |0x38 Reg0 0x0000000000000000 Reg1 0x0000000000000000 IP: 0 Reg2 0x0000000000000000 IR: halt Reg3 0x6c00706d5f00706d Reg4 0xfefc873708046a5c Reg5 0xfec39211fec39211 Reg6 0xfee004f008046ab0 Reg7 0x0000a004feffa910 Reg8 0xfec2fd88fefe2cee Reg9 0xfeffa9100000075d Reg10 0xfee004f0fefd2c62 Reg11 0xfec25ad0fec287b8 Reg12 0xfee28ee4fefe2cee Reg13 0xfeffa910000011af Reg14 0x3874534e3774534e Reg15 0xfefc873708046ab4 ZF = 0, OF = 0, SF = 0, CF = 0 CPU cycles done 1 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 81 20 00 05 11 05 f8 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |0 |8 |16 |24 |32 |40 |48 |56 |0x0 |0x8 |0x10 |0x18 |0x20 |0x28 |0x30 |0x38 Reg0 0x0000000000000000 Reg1 0x0000000000000004 IP: 4 Reg2 0x0000000081200005 IR: orq $32, %0, %5 Reg3 0x6c00706d5f00706d Reg4 0xfefc873708046a5c Reg5 0x0000000000000020 Reg6 0xfee004f008046ab0 Reg7 0x0000a004feffa910 Reg8 0xfec2fd88fefe2cee Reg9 0xfeffa9100000075d Reg10 0xfee004f0fefd2c62 Reg11 0xfec25ad0fec287b8 Reg12 0xfee28ee4fefe2cee Reg13 0xfeffa910000011af Reg14 0x3874534e3774534e Reg15 0xfefc873708046ab4 ZF = 0, OF = 0, SF = 0, CF = 0 CPU cycles done 2 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 81 20 00 05 11 05 f8 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |0 |8 |16 |24 |32 |40 |48 |56 |0x0 |0x8 |0x10 |0x18 |0x20 |0x28 |0x30 |0x38 Reg0 0x0000000000000000 Reg1 0x0000000000000008 IP: 8 Reg2 0x000000001105f80a IR: movq -8(%5), %10 Reg3 0x6c00706d5f00706d Reg4 0xfefc873708046a5c Reg5 0x0000000000000020 Reg6 0xfee004f008046ab0 Reg7 0x0000a004feffa910 Reg8 0xfec2fd88fefe2cee Reg9 0xfeffa9100000075d Reg10 0xffffffffffffffff Reg11 0xfec25ad0fec287b8 Reg12 0xfee28ee4fefe2cee Reg13 0xfeffa910000011af Reg14 0x3874534e3774534e Reg15 0xfefc873708046ab4 ZF = 0, OF = 0, SF = 0, CF = 0 CPU cycles done 3 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 81 20 00 05 11 05 f8 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |0 |8 |16 |24 |32 |40 |48 |56 |0x0 |0x8 |0x10 |0x18 |0x20 |0x28 |0x30 |0x38 Reg0 0x0000000000000000 Reg1 0x000000000000000c IP: 12 Reg2 0x0000000000000000 IR: halt Reg3 0x6c00706d5f00706d Reg4 0xfefc873708046a5c Reg5 0x0000000000000020 Reg6 0xfee004f008046ab0 Reg7 0x0000a004feffa910 Reg8 0xfec2fd88fefe2cee Reg9 0xfeffa9100000075d Reg10 0xffffffffffffffff Reg11 0xfec25ad0fec287b8 Reg12 0xfee28ee4fefe2cee Reg13 0xfeffa910000011af Reg14 0x3874534e3774534e Reg15 0xfefc873708046ab4 ZF = 0, OF = 0, SF = 0, CF = 0 $shell>