Institut für Informatik
Stefan Conrad
Janine Golov
Gerhard Klassen
WS 2021/22
Blatt 10 (49 Punkte)
Abgabe 22.12.2021
Rechnerarchitektur
Beispiellösung zur Übung
Beachten Sie unbedingt alle (auch kurzfristigen) Ankündigungen zu dieser Abgabe in ILIAS! Wir
rechnen, aufgrund des ILIAS Updates mit Problemen und müssen da gegebenenfalls schnell drauf
reagieren.
Mit diesem Übungsblatt starten wir in die Assemblerprogrammierung. Da es keinen Sinn ergibt,
Programme, welche wir assemblieren und ausführen möchten, in PDFs abzugeben, ändern wir für
diese Aufgaben das Abgabeformat. Wie gewohnt führen Abweichungen von den Formatvorgaben
zu Punktabzügen.
Nutzen Sie die Gerüstateien, welche wir Ihnen bei den Übungsblättern hochladen, für Ihre Ab-
gabe. Ändern Sie die Dateinamen auf keinen Fall!
Für Ihre Abgabe erstellen Sie ein zip-Archiv welches genau diese Dateien mit Ihren eingefügten
Lösungen (also keine weiteren Dateien!) enthält.
Im Zip zu den Übungsblättern finden sie außerdem ein Makefile, welches Ihnen einige Dinge
abnimmt. Wenn Sie dieses nutzen möchten, installieren Sie die Programme make und zip.
• Um Ihre Programme alle zu bauen, führen Sie nur den Befehl make aus. Achtung: Sollte
eines der Programme nicht assemblieren/kompilieren, wird der Vorgang abgebrochen.
• mit make build_X wird das Programm zu Aufgabe X erstellt.
• Mit make zip werden alle für die Abgabe relevanten Dateien in ein zip-Archiv gespeichert.
• Mit make clean können Sie das Verzeichnis ein wenig aufräumen, erstellte Objektdateien
und Verzeichnisse werden dadurch gelöscht.
Ihre Abgaben müssen unter Linux (32-Bit) lauffähig sein. Zur Klarstellung: 17.12.2021: Ihre
Programme müssen sich so, wie im Makefile angegeben assemblieren, kompilieren und linken
lassen. Sie dürfen und sollen die Makros aus asm_io.asm verwenden!
Sollte Ihnen die Vorlesung nicht reichen, was gut möglich ist, nutzen Sie PC Assembly Language
von Dr. Paul Carter.
Ab Blatt 11 werden nur Programme korrigiert, die sich assemblieren lassen.
1
Aufgabe 1 Register (15 Punkte)
Schreiben Sie ein Assembler-Programm, in dem Sie je eine Folge von Instruktionen angeben, die das
SF, PF, OF, CF bzw. ZF setzen. Geben Sie in Kommentaren kurz an, was das jeweilige Flag aussagt
und warum es bei dem von Ihnen gegebenen Codebeispiel gesetzt wird.
Lösungsvorschlag: (15 Punkte)
siehe asm-Dateien
Zum Überprüfen kann dump_regs nr verwendet werden.
Bepunktung:
5: 1 Punkt pro korrekter Erklärung der Aussage
5: 1 Punkt pro korrekter Erklärung des Codebeispiels
5: 1 Punkt pro richtig gesetztem Flag
Aufgabe 2 3 Zeichen ausgeben (10 Punkte)
Schreiben Sie ein Assembler-Programm, das nacheinander drei Zeichen einliest und diese in derselben
Reihenfolge, wie sie eingelesen worden sind, wieder ausgibt. Dabei soll jedes Zeichen in einer eigenen
Zeile ausgegeben werden. Kommentieren Sie Ihr Programm blockweise.
Lösungsvorschlag: (10 Punkte)
siehe asm-Dateien
Bepunktung:
1: Programm assembliert fehlerfrei
2: 2 Punkte fürs Einlesen von drei Zeichen
3: 2 Punkte fürs Ausgeben von drei Zeichen
2: 2 Punkte für die richtige Reihenfolge der richtigen Zeichen
1: 1 Punkt für Ausgabe auf eigener Zeile
2: 2 Punkte für blockweise Kommentare (1 Punkt für Kommentare, die fehlerhaft
sind oder zeilenweise)
• -1P Abzug für Fehler
Aufgabe 3 Buchstaben überprüfen (12 Punkte)
Schreiben Sie ein Assembler-Programm, weclhes ein Zeichen einliest und folgende Ausgabe macht:
• Ausgabe des Strings „korrekt“, wenn das eingegebene Zeichen ein Großbuchstabe ist.
• Ausgabe des Strings „falsche Eingabe“, wenn das Zeichen kein Großbuchstabe ist.
Ein Assemblerprogramm sollte nie ohne ein Newlinezeichen abschließen. Kommentieren Sie Block-
weise. Verwenden Sie nicht mehr als 5 Sprunganweisungen. Versuchen Sie wenig Code zu doppeln
Hinweis: Beachten Sie Blatt 1, Aufgabe 1
Lösungsvorschlag: (12 Punkte)
2
siehe asm-Dateien
Bepunktung:
1: Programm assembliert fehlerfrei
1: 1 Punkt fürs Einlesen des Chars
2×2: je 2 Punkte für die Überprüfung der unteren/oberen Grenze (-1P für off-by-one)
2×1: je ein Punkt für die Ausgabe der Nachrichten (exakt!)
1: Falsche Ausgabenachricht wird übersprungen
1: Kein doppeltes print_string oder print_nl.
2: 2 Punkte für blockweise Kommentare (1 Punkt für Kommentare, die fehlerhaft
sind oder zeilenweise)
• -1P Abzug für Fehler
Aufgabe 4 MAL Multiplikation in x86 (12 Punkte)
Betrachten Sie folgendens MAL Programm für die Mic-1:1
imul1 MAR = SP = SP – 1; rd
imul2 OPC = 0
loop Z = TOS; if (Z) goto finish; else goto imul4
imul4 H = 1
imul5 Z = TOS AND H; if (Z) goto next; else goto imul6
imul6 H = MDR
imul7 OPC = OPC + H
next H = MDR
imul9 MDR = MDR + H
imul10 TOS = TOS >> 1; goto loop
finish MDR = TOS = OPC; wr; goto Main1
Setzen Sie diese in x86-Assembler um. Ergänzen Sie es um eine Eingabeaufforderung, die Eingabe
zweier ganzer Zahlen (ohne Überprüfung), und die Ausgabe des Ergebnisses mit einem sinnvollen
String. Lassen Sie alles das weg, was mit dem Stack zu tun hat und ersetzen Sie diese Teile durch
beliebige Register.
Kommentieren Sie, welche Register Sie durch welche anderen Register ersetzen, um die Zusammen-
hänge zwischen Ihrem und dem obigen Code klarzustellen.
Lösungsvorschlag: (12 Punkte)
siehe asm-Dateien
Bepunktung:
1: Programm assembliert fehlerfrei
2: Eingabeaufforderung und Einlesen der Zahlen
1: Ergebnis mit 0 initialisiert
1: Verunden
1Quelle: http://wwwlehre.dhbw-stuttgart.de/~stroetma/CT/ct.pdf
3
http://wwwlehre.dhbw-stuttgart.de/~stroetma/CT/ct.pdf
1: Shift rechts
1: Shift links (H = MDR, MDR = MDR + H; 2X MDR)
1: Alle Sprünge umgesetzt
2: Ausgabe mit Text und Ergebnis
: 2 Punkte für die Kommentierung
• -1P Abzug für Fehler
4