KSP Aufgabe 2
1. Ab dieser Aufgabe haben Sie einen
Assembler zur Verfuegung, damit das laestige
Kodieren der Befehle nicht mehr per Hand ausgefuehrt werden muss.
Schreiben Sie die drei kleinen Testprogramme aus der vorigen Aufgabe
in jeweils eine Datei, die die Endung .asm haben sollte. Lassen Sie
die Programme assemblieren; die entstehenden Dateien sollten die
Endung .bin haben. Inspizieren Sie diese Binaerdateien mit dem
Kommando "hexdump -C". Versuchen Sie genau zu erklaeren, wie die
beobachtete Ausgabe zustande kommt! Studieren Sie dazu die
Beschreibung des Ninja-Binaerformats .
2. Jetzt aendern Sie Ihre VM vom vorigen Aufgabenblatt so ab,
dass das Binaerprogramm aus einer Datei in den Programmspeicher
geladen wird.
a) Der Name des zu ladenden Programms soll als Kommandozeilenargument
uebergeben werden.
b) Bevor Sie etwas mit dem Inhalt der Datei tun koennen, muessen
Sie die Datei "oeffnen":
FILE *fopen(const char *path, const char *mode);
c) Was Sie mit dem Inhalt einer Ninja-Binaerdatei tun muessen, um das
darin enthaltene Programm starten zu koennen, steht ebenfalls in der
Beschreibung des Ninja-Binaerformats .
d) Sie werden die Funktion fread() zum Lesen aus einer Datei brauchen:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
e) Ebenso brauchen Sie die Funktion malloc() zur Speicheranforderung:
void *malloc(size_t size);
f) Wenn Sie alle Informationen aus der Datei verwertet haben, wird
die Datei wieder geschlossen:
int fclose(FILE *fp);
3. Ergaenzen Sie nun Ihre VM auf die Version 2, in dem Sie
die neuen Instruktionen implementieren.
Eine Diskussion von globalen Variablen und den zugehoerigen
Instruktionen finden Sie hier , die
Diskussion von lokalen Variablen und Stackframes mit ihren
Instruktionen gibt's hier .
4. Pruefen Sie nun das Funktionieren Ihrer VM durch Assemblieren
und Ausfuehren der drei kleinen Programme aus Aufgabenteil 1 sowie
der beiden Testprogramme prog1.asm und
prog2.asm . Es wird dringend empfohlen,
mindestens fuenf weitere selbstgewaehlte Berechnungen im
Stackmaschinen-Assembler zu programmieren und ausfuehren zu lassen.
Sie sollten in der Lage sein, zu jedem Zeitpunkt der Ausfuehrung
den Stack aufzeichnen zu koennen!
5. Und hier wie immer die Referenzimplementierung:
njvm
Hinweise
1. Alle benoetigten Bibliotheksfunktionen kann man im Online-Manual
nachschlagen. Das ruft man mit dem Kommando "man" auf. In diesem
Manual stehen auch alle Kommandos drin, die das System kennt. Wenn
man also z.B. nicht weiss, wie das Manual funktioniert: "man man"
hilft. Das Manual ist sehr "dicht" geschrieben; in jedem Halbsatz
stehen mehrere wichtige Informationen drin. Studieren Sie deshalb
die Manualeintraege genau; nur ueberfliegen reicht nicht!
2. Vergessen Sie nicht, alle Rueckgabewerte zu pruefen; die gerufene
Funktion koennte aus diversen Gruenden fehlgeschlagen sein (moegliche
Ursachen stehen ebenfalls im Manual).