**Übung zur Vorlesung "Grundgebiete der Informatik 4"** vom [Institute for Automation of Complex Power Systems](http://www.acs.eonerc.rwth-aachen.de), [RWTH Aachen University](http://www.rwth-aachen.de), ist lizenziert unter einer [Creative Commons Lizenz BY-NC-SA 3.0 DE](http://creativecommons.org/licenses/by-nc-sa/3.0/de/).
In dieser Aufgabe sollen Sie die Arbeitsweise eines Assemblers anhand des folgenden Beispielprogramms für die vereinfachte Mikroprozessor-Architektur aus der Vorlesung nachvollziehen, die der x86-Architektur ähnlich ist. Das Befehlsformat ist gegenüber der x86-Architektur vereinfacht und besteht aus den folgenden Elementen:
* OpCode (1 Byte)
* Register- und Adressmodusbezeichner 1. Operand (1 Byte, optional)
* Register- und Adressmodusbezeichner 2. Operand (1 Byte, optional)
* SI-Byte (Abkürzung steht für „Scale and Index“, 1 Byte, optional)
* Displacement (4 Bytes, optional)
* Immediate (4 Bytes, optional)
Anhand der Anweisung `mov edx, [ebx+8*ecx]` wird die Bildung des Maschinencodes exemplarisch erläutert. Der Opcode wird mit Hilfe der Tabelle 1 bestimmt und entspricht in diesem Fall `0x0C`. Für die beiden Operanden muss anschließend jeweils ihr Register- und Adressmodusbezeichner bestimmt werden, die jeweils in einem Byte codiert werden und ebenfalls aus Tabelle 1 ersichtlich sind. Die Bits 0-3 des Bezeichners spezifizieren den Adressmodus, die Bits 4-7 spezifizieren, welches Register als Basis für den Adressmodus verwendet wird.
Der erste Operand stellt ein Register dar, so dass die Bits 0-3 den Wert 0x0 annehmen. Da es sich bei dem Register des ersten Operanden um das Register `edx` handelt, nehmen die Bits 4-7 den Wert 0x3 an. Somit besitzt der Register- und Adressmodusbezeichner des ersten Operanden den Wert `0x30`.
Der zweite Operand verwendet als Adressierungsmodus *indirekt indiziert*, so dass die Bits 0-3 des Register- und Adressmodusbezeichners den Wert `0x4` annehmen. Die Bits 4 bis 7 nehmen den Wert `0x1` an, der für das Register ebx steht. Somit besitzt der Register- und Adressmodusbezeichner des zweiten Operanden den Wert `0x14`. Anschließend muss im SI-Byte das Index-Register sowie der Skalierungsfaktor des zweiten Operanden codiert werden. Bits 0-3 stehen hierbei für das Index-Register und nehmen wegen des Registers ecx den Wert `0x2` an. Die Bits 4-7 beschreiben den Skalierungsfaktor und nehmen daher hier den Wert `0x8` an.
Somit ergibt sich für die exemplarische Anweisung der Maschinencode `0x0C301482`.
1. Erläutern Sie kurz und prägnant die Funktionsweise des Beispielprogramms.
2. Vollziehen Sie die Phase 1 eines Assemblers wie in der Vorlesung nach:
* Markieren Sie die Pseudooperationen im Quelltext.
* Errechnen Sie die Länge der einzelnen Befehle und geben Sie diese am Zeilenen- de in Klammern an.
* Schreiben Sie vor jede Zeile im Quellcode den entsprechenden Locationcounter.
* Generieren Sie die Symboltabelle des Assemblers, verwenden Sie hierzu die
nachfolgende Tabelle.
* Geben Sie die Länge des Code- und des Datensegmentes sowie die Gesamtlänge an.
3. Vollziehen Sie nun die Phase 2 des Assemblers nach, indem Sie eine Objektdatei im in der Vorlesung vorgestellten Objektformat erzeugen. Zur Vereinfachung können alle Zahlen im *Big Endian*-Format dargestellt werden, außerdem seien alle Sprünge relativ und alle Funktionsaufrufe absolut. Kodieren Sie, soweit möglich, genau drei Befehle in einem T-Datensatz. Nutzen Sie auch den den S-Datensatz. Gehen Sie davon aus, dass der Dateiname und damit auch der Modulname *cntdwn* lautet.