Emulator Tutorial


SirDzstic

Member
Joined
Nov 14, 2005
Messages
187
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:
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
 
Back
Top