Institut für Informatik
SoSe 2021 Blatt 12 Abgabe 06.07.2021
Janine Golov Markus Brenneis
Rechnerarchitektur
Übung zur Vorlesung
Auf diesem und dem nächsten Übungsblatt werden Sie Assemblerprogramme schreiben und ab- geben. Daher gelten andere Bedingungen als für die bisherigen Abgaben. Wie gewohnt führen Abweichungen von den Formatvorgaben zu Punktabzügen.
Bitte erstellen Sie einen Ordner, in welchem Sie für jede Aufgabe eine Assemblerdatei (dies ist eine einfache Textdatei (Plaintext) mit der Endung .asm) erstellen.
Die Assemblerdateien nennen Sie bitte genau nach folgendem Schema:
blatt
Für Aufgabe 3 dieses Aufgabenblatts wäre der Name also blatt12_aufgabe3.asm. Wir prü- fen Ihre Abgaben halbautomatisch, weshalb Sie von diesem Benennungsschema nicht abweichen dürfen!
Entfernen Sie alle anderen Dateien aus dem Ordner und erstellen Sie ein zip-Archiv (mehr dazu weiter unten). Ihre Abgabe muss aus einer einzelnen zip-Datei bestehen.
Alternativ nutzen Sie unseren Vorgabeordner und erstellen Ihr Archiv damit. Dafür sollten Sie die Programme make und zip installieren.
• 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 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.
Aufgabe 1
Register
(5 Punkte)
Schreiben Sie ein Assembler-Programm, in dem Sie je eine Folge von Instruktionen angeben, die das ZF, PF, OF, CF bzw. SF setzen. Geben Sie in Kommentaren kurz an, welches Flag gesetzt wird und warum es gesetzt wird.
1
Aufgabe 2 3 Zahlen ausgeben (4 Punkte)
Schreiben Sie ein Assembler-Programm, das nacheinander drei ganze Zahlen einliest und diese in derselben Reihenfolge, wie sie eingelesen worden sind, wieder ausgibt. Dabei soll jede Zahl in einer eigenen Zeile ausgegeben werden.
Aufgabe 3 Zahlen überprüfen (5 Punkte) Schreiben Sie ein Assembler-Programm, das nacheinander drei ganze Zahlen einliest und folgende
Ausgabe macht:
• Ausgabe des Strings „korrekt“, wenn alle eingegebene Zahlen in der Menge {0, 1} sind.
• Ausgabe des Strings „falsche Eingabe“, wenn mindestens eine Zahl nicht in der Menge {0,1} ist.
Ihr Programm soll dabei immer drei Zahlen einlesen.
Aufgabe 4 Parität (4 Punkte) Schreiben Sie ein Assembler-Programm, das nacheinander drei ganze Zahlen einliest und folgende
Ausgabe macht:
• Ausgabe der geraden Parität der drei Zahlen, wenn alle eingegebene Zahlen in der Menge {0, 1} sind.
• Ausgabe des Strings „falsche Eingabe“, wenn mindestens eine Zahl nicht in der Menge {0,1} ist.
Wenn Ihr Programm z. B. die Zahlen 0, 0 und 1 einliest, soll Ihr Programm 1 ausgeben. Ihr Programm soll dabei immer drei Zahlen einlesen.
Aufgabe 5 Parität mit Schleife (4 Punkte)
Schreiben Sie ein Assembler-Programm, das nacheinander drei ganze Zahlen einliest. Falls eine Zahl nicht in der Menge {0, 1} ist, soll die Eingabe aller drei Zahlen wiederholt werden. Anschließend soll Ihr Programm die geraden Parität der drei eingelesenen Zahlen ausgeben.
Beispiel: Wenn 0, 1, 2, 0, 1, 1 eingegeben wird, soll 0 ausgegeben werden.
2
Packen Sie Ihre Lösung zu folgender Aufgabe mit in die zip-Datei (z. B. als zusätzliche PDF- oder Text-Datei).
Aufgabe 6 Gültige Befehle (3 Punkte) Hinweis: Lesen Sie die Aufgabenstellung vollständig durch, bevor Sie mit der Bearbeitung beginnen.
Betrachten Sie die Mic-1. Vervollständigen Sie die folgenden beiden MAL-Befehle, sodass sie gültig sind …
H=H+ H=1+
. . . und vervollständigen Sie die folgende Instruktion, sodass sie ungültig ist: H=+
In die letzten beiden Lücken dürfen Sie nur die beiden Werte eintragen, die Sie oben verwendet haben. (Beispiel: Wenn Sie oben H und SP eingetragen haben, dann dürfen Sie unten nur H+SP und SP+H eintragen; Sie müssen also die ersten beiden Lücken so wählen, dass auch die Bedingung für die letzte Lücke erfüllt ist.)
Betrachten Sie jetzt NASM-Assembler. Vervollständigen Sie die folgenden beiden Assembler-Befehle, sodass sie gültig sind . . .
add eax,
add ebx,
. . . und vervollständigen Sie die folgende Instruktion, sodass sie ungültig ist: add ,
In die letzten beiden Lücken dürfen Sie nur die beiden Werte eintragen, die Sie oben verwendet haben.
Geben Sie für die letzte Instruktion eine gültige x86-Instruktionsfolge an, die die beschriebene Ope- ration ausführt.
3