TGI-Praktikum WS 2001/02, Gruppe 5

Teilnehmer: Christian Becker (Vortrag Mikroprogrammierung, Ausarbeitung Assembler), Rachid Benmrhar (Projektleitung Mikroprogrammierung, Vortrag Assembler), Lars Trebing (Ausarbeitung Mikroprogrammierung, Projektleitung Assembler).

Hinweis: Diese Seite ist aus den Vortragsfolien zu den beiden bearbeiteten Aufgaben entstanden und für Außenstehende vermutlich ziemlich wirr und erst recht nutzlos. Späteren Teilnehmern des TGI-Praktikums, die dieselben Aufgabenstellungen zu bearbeiten haben, kann sie womöglich als Denkanstoß in die richtige Richtung dienen. Es wird ausdrücklich davor gewarnt, das hier als Ersatz für die eigene Bearbeitung der Aufgaben zu verwenden – das funktioniert nämlich nicht und führt mit sehr großer Wahrscheinlichkeit dazu, daß man es im nächsten Semester nochmal probieren darf. Der Schlüssel zum Praktikumsschein liegt im eigenen Verständnis der Aufgabenstellung, der Werkzeuge und der Lösung.

Mikroprogrammierung (Projekt 5)

Aufgabe: Implementation der Maschinenbefehle

Projektbetreuer: Josef Weidendorfer.

Hilfsmittel: MI-Simulator MIC 5.3, ifetch-Mikroprogramm (beides vom Lehrstuhl bereitgestellt).

move imm, RB (Opcode 38)

Aufruf zum Kopieren des Wertes aus Speicherzelle 0042 ins Register 3:

0000 3803
0001 0042
0002 ....

Mikroprogrammcode:

interr am2901 am2904 sequencer bz mem
ie int kmux cons src func dest ra rb ld ed inc ea irld mwe
380 DIS ENI D FFFF AQ ADD NOP 7 MR f MR H H CI0 X H H 77 PS CONT 381 H H H E H R
381 DIS ENI D FFFF DZ ADD RAMF 7 MR f IR H H CI0 X H H 77 PS CJS 000 H H I H H R

Ablauf:

  1. Das bereits vorgegebene Mikroprogramm ifetch lädt den Inhalt der Speicherzelle 0000 ins Instruktionsregister, erhöht den Befehlszähler auf 0001 und springt zu der im Instruktionsregister angegebenen Mikroprogrammadresse 380.
  2. Der erste Befehl des Mikroprogramms move legt den Inhalt des Befehlszählers auf den Adreßbus und springt zur nächsten Instruktion.
  3. Der Wert 4711 wird jetzt vom Hauptspeicher auf den Datenbus gelegt und vom K-Multiplexer in den Rechenwerkbaustein Am2901 geleitet. Dort wird dieser Wert mit Null addiert und in das im RB-Feld des Instruktionsregisters angegebene Register geschoben. Abschließend inkrementiert das Leitwerk den Befehlszähler und springt an den Anfang des Mikroprogrammspeichers zurück.

jmpc imm (Opcode 89)

Aufruf zum Sprung an die Adresse 0815h (dezimal 2069):

0004 8900
0005 0815
0006 ....

Mikroprogrammcode:

interr am2901 am2904 sequencer bz mem
ie int kmux cons src func dest ra rb srtest ld ed inc ea irld mwe
890 DIS ENI D FFFF AQ ADD NOP 7 MR f MR H H CI0 X H H 53 C CJP 892 H H H E H R
891 DIS ENI D FFFF AQ ADD NOP 7 MR f MR H H CI0 X H H 77 PS CJP 000 H H I H H R
892 DIS ENI D FFFF DZ ADD RAMF 7 MR f MR H H CI0 X H H 77 PS CJP 000 L H H H H R

Ablauf:

  1. Das bereits vorgegebene Mikroprogramm ifetch lädt den Inhalt der Speicherzelle 0004 ins Instruktionsregister, erhöht den Befehlszähler auf 0005 und springt zu der im Instruktionsregister angegebenen Mikroprogrammadresse 890.
  2. Der erste Befehl des Mikroprogramms jmpc legt den Inhalt des Befehlszählers auf den Adreßbus und fragt das Carry-Flag ab. Wenn dieses gesetzt ist, springt es zur Mikroprogrammzeile 892; ansonsten wird der Mikrobefehlszähler ganz normal inkrementiert.
  3. Wenn das Carry-Flag nicht gesetzt war, wird ein unbedingter Sprung auf die ifetch-Routine durchgeführt und der Maschinenbefehlszähler inkrementiert.
  4. Wenn das Carry-Flag gesetzt war, wird der Inhalt der Konstanten aus dem Speicher gelesen, im Rechenwerk mit Null addiert, das Ergebnis in den Maschinenbefehlszähler geladen und ebenfalls zu ifetch zurückgesprungen.

umul RA, RB (Opcode D2)

Aufruf zur Multiplikation der Register 1 und 0:

0007 D210
0008 ....

Ablauf:

R0
(RB)
R1
(RA)
RERFCRA
1 101 10 0 0 0 0
2 101 10 101 10 0 0
3 101 10 10 10 1 0
4 101 10 10 10 0 10
5 101 10 10 100 0 10
3 101 10 1 100 0 10
4 101 10 1 100 0 10
5 101 10 1 1000 0 10
3 101 10 0 1000 1 10
4 101 10 0 1000 0 1010
5 101 10 0 10000 0 1010
6 1010 10 0 10000 0 1010
  1. Das bereits vorgegebene Mikroprogramm ifetch lädt den Inhalt der Speicherzelle 0007 ins Instruktionsregister, erhöht den Befehlszähler auf 0008 und springt zu der im Instruktionsregister angegebenen Mikroprogrammadresse D20.
  2. Der Inhalt der vom Maschinenprogrammierer angegebenen Register wird in die Register E und F kopiert, auf die der Maschinenprogrammierer keinen Zugriff hat.
  3. Der Wert im Register E wird per Schiebeoperation halbiert; die vormals letzte Stelle der Binärzahl kommt dabei ins Carry-Flag des Maschinenstatusregisters.
  4. Falls das Carry-Flag gesetzt ist, wird der Wert des Registers F auf das Register A addiert.
  5. Der Wert des Registers F wird per Schiebeoperation verdoppelt.
  6. Wenn der Wert im Register E größer als 0 ist, wird zu 3. zurückgesprungen, um die restlichen Stellen abzuarbeiten. Ansonsten wird das Ergebnis aus Register A in das vom Maschinenprogrammierer angegebene Register RB kopiert und zu ifetch zurückgesprungen.

Datei für MI-Simulator

Assembler (Projekt 12)

Aufgabe: Implementation der Sinus-Funktion in 80x86-Assembler mit Hilfe der zugehörigen Taylor-Reihe.

Projektbetreuer: Detlef Fliegl.

Hilfsmittel: Netwide Assembler, GNU C Compiler.

Realisierung

  1. sin(x)=x - x^3/3! + x^5/5! - x^7/7! +- ...Initialisierung (Parameterübernahme aus dem Rahmenprogramm)
  2. Berechnen der übernächsten x-Potenz
  3. Berechnen des jeweiligen Bruchs; ggf. Negieren
  4. Speichern des Bruchs und zurück zu 2.
  5. Berechnen der Summe aus den gespeicherten Brüchen

Assembler-Programm

Aufgaben des Rahmenprogramms

C-Programm, Makefile (für GCC unter Linux)

Leistungsfähigkeit und Genauigkeit