Ich hab mal einen sehr kleinen Emulator geschrieben, der helfen soll,
zu verstehen, wie ein Emulator funktioniert.
Emuliert wird eine CPU, die zwar nur 5 Instruktionen versteht, aber
trotzdem Programme ausführen kann. Ich habe zwei Beispiel-
programme und einen Assembler, der aus dem Sourcecode für die CPU
Binaries erzeugt, die im Emulator laufen.
Die Beispielprogramme sind im Verzeichnis examples/ und lassen sich
mit "make examples" assemblieren.
Ein Probelauf:
Der Emulator nimmt als ersten Parameter ein Binary entgegen, das
er ausführen soll und danach bis zu 8 Initialisierungswerte für
seine 8 CPU-Register (Die sind auf 8 bit limitiert, also gehen maximal
werte bis 255 pro Register). Das Beispielprogramm add-2 addiert die
Werte in Register 0 und 1 (im Beispiel die Werte 1 und 2) und speichert
sie in Register 0. Am Ende des Probelaufst ist dort eine 3 zu sehen
Die Ausgabe bedeutet folgendes:
In der ersten Spalte steht die Adresse, an der die aktuell Anweisung
steht. In Spalte 2 und 3 stehen der aktuell ausgeführte Opcode und seine
Parameter.
In den restlichen Spalten folgen die Inhalte der acht CPU Register.
Die Instruktionen, die die CPU versteht, sind folgende:
"STP": Programmende
"JMP x": springe zu Adresse x
"DEC x": Subtrahiere 1 vom Wert in Register x
"INC x": Addiere 1 zum Wert in Register x
"ISZ x": Falls Register x den Wert 0 enthält, überspringe den nächsten Befehl.
Ich hoffe, damit vielleicht jemandem geholfen zu haben, der gern mal
einen Emulator schreiben würde, aber nicht weiß, wie soetwas funktioniert.
DOWNLOAD :E
zu verstehen, wie ein Emulator funktioniert.
Emuliert wird eine CPU, die zwar nur 5 Instruktionen versteht, aber
trotzdem Programme ausführen kann. Ich habe zwei Beispiel-
programme und einen Assembler, der aus dem Sourcecode für die CPU
Binaries erzeugt, die im Emulator laufen.
Die Beispielprogramme sind im Verzeichnis examples/ und lassen sich
mit "make examples" assemblieren.
Ein Probelauf:
asdf@localh0rst ~/src/aisc-0.0.1 $ bin/aisc bin/add-2.aisc 1 2
0 JMP 6 1 2 0 0 0 0 0 0
6 ISZ 1 1 2 0 0 0 0 0 0
8 JMP 2 1 2 0 0 0 0 0 0
2 INC 0 2 2 0 0 0 0 0 0
4 DEC 1 2 1 0 0 0 0 0 0
6 ISZ 1 2 1 0 0 0 0 0 0
8 JMP 2 2 1 0 0 0 0 0 0
2 INC 0 3 1 0 0 0 0 0 0
4 DEC 1 3 0 0 0 0 0 0 0
6 ISZ 1 3 0 0 0 0 0 0 0
10 STP 3 0 0 0 0 0 0 0
Der Emulator nimmt als ersten Parameter ein Binary entgegen, das
er ausführen soll und danach bis zu 8 Initialisierungswerte für
seine 8 CPU-Register (Die sind auf 8 bit limitiert, also gehen maximal
werte bis 255 pro Register). Das Beispielprogramm add-2 addiert die
Werte in Register 0 und 1 (im Beispiel die Werte 1 und 2) und speichert
sie in Register 0. Am Ende des Probelaufst ist dort eine 3 zu sehen
Die Ausgabe bedeutet folgendes:
In der ersten Spalte steht die Adresse, an der die aktuell Anweisung
steht. In Spalte 2 und 3 stehen der aktuell ausgeführte Opcode und seine
Parameter.
In den restlichen Spalten folgen die Inhalte der acht CPU Register.
Die Instruktionen, die die CPU versteht, sind folgende:
"STP": Programmende
"JMP x": springe zu Adresse x
"DEC x": Subtrahiere 1 vom Wert in Register x
"INC x": Addiere 1 zum Wert in Register x
"ISZ x": Falls Register x den Wert 0 enthält, überspringe den nächsten Befehl.
Ich hoffe, damit vielleicht jemandem geholfen zu haben, der gern mal
einen Emulator schreiben würde, aber nicht weiß, wie soetwas funktioniert.
DOWNLOAD :E