[ CHEAP ] [ CASM ] [ CSIM ] [ CSIM-P ] [ Impressum ]
Mit dem CSIM-P wird das Verhalten eines CHEAP bei Verarbeitung von durch CASM erzeugten Maschinencode simuliert. Die Entwicklung der Anwendung erfolgte unter Einsatz von Red Hat Linux 7.1 und SunOS 5.9. Das verwendete Makefile gibt Auskunft über die im Detail eingesetzten Werkzeuge. Die Arbeit an der Anwendung wurde zu einem sehr frühen Entwicklungszeitpunkt eingestellt. Diesem Unstand ist auch der niedrige Bedienungskomfort anzulasten. Zur Überprüfung der Ausgabe des CASM kann das Werkzeug nur unter gewissen Einschränkungen eingesetzt werden. Es empfiehlt sich daher in den meisten Fällen die Verwendung des CSIM.
Das Übersetzen sollte auf allen Linux-Rechnern durch Ausführen des make Kommandos im entsprechenden Ordner möglich sein. Zuvor sollte jedoch der Include-Pfad zu den ncurses-Headerfiles angepasst werden. Der Inhalt des verwendeten Makefiles ist nachfolgend aufgeführt.
makefile used to make CSIM |
---|
all: Makefile csim.pas gpc --automake -s -I/pub/projekte/GNU_PASCAL/ncurses/include -ocsim csim.pas rm crt.gpi crt.o crtc.o gpc.gpi gpc.gpm gpc.o gpc_bp.gpi gpc_delphi.gpi\ gpc_ep.gpi gpc_sp.gpi elapsecs.o |
Der Aufruf des fertigen Simulators ist dann denkbar einfach. Mit dem optionalen Parameter --step wird ein Schrittmodus erzwungen, bei dem jeder Befehl erst nach betätigen der Tabulatortaste abgearbeitet wird.
command line used to start CSIM |
---|
./csim binary [-s|--step]|[-d|--delay] |
Zu Beginn der Simulation wird die Binärdatei in den virtuellen CHEAP-Hauptspeicher eingelesen. Ein Hexdump gibt Auskunft über dessen Inhalt. Alle Register werden mit dem Wert Null initialisiert.
Durch betätigen von Enter beginnt die eigentliche Simulation. Wurde der Schrittbetrieb aktiviert, muß die Tabulatortaste gedrückt werden, ehe der erste Befehl abgearbeitet wird. Die übrigen Tasten werden bei Betätigung als Eingabe für das laufende Programm interpretiert und an dieses weitergereicht.
Zu jedem interpretierten Befehl wird nun eine Zeile mit Statusinformationen ausgegeben. Eine solche Zeile kann wie folgt schematisiert werden.
CSIM instruction info, scheme | CSIM instruction info, example | |
---|---|---|
instr/type [rg1<value>|imm [, rg2<value>|imm]] |
add/oc r1[2], 1 |
Die Simulation wird abgebrochen, wenn der simulierte Program Counter den Wert 4095 annimmt. Da die CHEAP-Anwendungen ohne die Zwischenschicht eines Betriebssystems auf dem Prozessor laufen, entschied man sich für diese Herangehensweise, um das Ende eines Programmes zu definieren.
Wurde das Programm beendet, gibt ein weiterer Hexdump Auskunft über den aktuellen Inhalt des CHEAP-Hauptspeichers. Durch das abgelaufene Programm vollzogene Änderungen können somit noch einmal im Gesamtbild nachvollzogen werden.
Bei dem unten aufgezeigten Programm sind die Zahlen 10 bzw. 0Ah und 20 bzw. 14h im Speicher an Offset 1 und 2 abgelegt. Die Zahlen werden ausgelesen und addiert. Das Ergebnis der Addition wird an Offset 3 im Speicher abgelegt.
++ |
---|
source hexdump | instruction infos | final hexdump | ||
---|---|---|---|---|
C0 00 00 04 00 00 00 0A 00 00 00 14 00 00 00 00 20 40 00 01 00 82 00 30 28 40 00 01 00 C2 00 30 00 86 00 05 28 40 00 01 00 82 00 31 C0 00 0F FF |
jmp/oc 4 set/oc r1[0], 1 lw /sc r2[0], r1[1] add/oc r1[1], 1 lw /sc r3[0], r1[2] add/sc r2[10], r3[20] add/oc r1[2], 1 sw /sc r2[30], r1[3] jmp/oc 4095 |
C0 00 00 04 00 00 00 0A 00 00 00 14 00 00 00 1E 20 40 00 01 00 82 00 30 28 40 00 01 00 C2 00 30 00 86 00 05 28 40 00 01 00 82 00 31 C0 00 0F FF |
Bei dem unten aufgezeigten Programm wird eine beliebige am Programmende definierte Zeichenkette zu einer Zeichenkette in Großbuchstaben umgewandelt. Zeichen, die keine Buchstaben darstellen, bleiben unangetastet. Die in der Binärdatei definierte Zeichenkette kann dort geändert werden. Die Endekennung erfolgt wie üblich durch eine binäre Null.
++ |
---|
source hexdump | instruction infos | final hexdump | ||
---|---|---|---|---|
20 40 00 0D 01 02 00 30 D1 00 0F FF 01 48 00 04 A9 40 00 60 D1 40 00 0A 01 48 00 04 B1 40 00 7C D1 40 00 0A 31 00 00 20 01 02 00 31 28 40 00 01 C0 00 00 01 00 00 00 3E = > 00 00 00 20 = 00 00 00 63 = c 00 00 00 68 = h 00 00 00 65 = e 00 00 00 61 = a 00 00 00 70 = p 00 00 00 41 = A 00 00 00 73 = s 00 00 00 6D = m 00 00 00 20 = 00 00 00 3C = < 00 00 00 00 |
set/oc r1[0], 13 lw /sc r4[0], r1[13] bez/oc r4[62], 4095 set/sc r5[0], r4[62] cst/oc r5[62], 96 bez/oc r5[0], 10 sw /sc r4[62], r1[13] add/oc r1[13], 1 jmp/oc 1 lw /sc r4[62], r1[14] bez/oc r4[32], 4095 set/sc r5[0], r4[32] cst/oc r5[32], 96 bez/oc r5[0], 10 sw /sc r4[32], r1[14] add/oc r1[14], 1 jmp/oc 1 : some more loops : lw /sc r4[32], r1[24] bez/oc r4[60], 4095 set/sc r5[0], r4[60] cst/oc r5[60], 96 bez/oc r5[0], 10 sw /sc r4[60], r1[24] add/oc r1[24], 1 jmp/oc 1 lw /sc r4[60], r1[25] bez/oc r4[0], 4095 |
20 40 00 0D 01 02 00 30 D1 00 0F FF 01 48 00 04 A9 40 00 60 D1 40 00 0A 01 48 00 04 B1 40 00 7C D1 40 00 0A 31 00 00 20 01 02 00 31 28 40 00 01 C0 00 00 01 00 00 00 3E = > 00 00 00 20 = 00 00 00 43 = C 00 00 00 48 = H 00 00 00 45 = E 00 00 00 41 = A 00 00 00 50 = P 00 00 00 41 = A 00 00 00 53 = S 00 00 00 4D = M 00 00 00 20 = 00 00 00 3C = < 00 00 00 00 |