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. Denken Sie daran, dass auch der nja ausführbar sein 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).