| Lars Trebing / Aktivitäten / Studium / WS 2001 / TGI-Praktikum |
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.
Aufgabe: Implementation der Maschinenbefehle
move imm, RB – speichert einen unmittelbar angegebenen 16-Bit-Wert in RB.jmpc imm – springt an die unmittelbar angegebene Stelle des Maschinenprogramms, falls das carry flag gesetzt ist.umul RA, RB – multipliziert zwei in RA und RB abgelegte vorzeichenlose Zahlen und schreibt das Ergebnis in RB zurück.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:
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.move legt den Inhalt des Befehlszählers auf den Adreßbus und springt zur nächsten Instruktion.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:
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.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.ifetch-Routine durchgeführt und der Maschinenbefehlszähler inkrementiert.ifetch zurückgesprungen.umul RA, RB (Opcode D2)Aufruf zur Multiplikation der Register 1 und 0:
0007 D210 0008 ....
Ablauf:
| R0 (RB) | R1 (RA) | RE | RF | C | RA | |
|---|---|---|---|---|---|---|
| 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 |
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.E und F kopiert, auf die der Maschinenprogrammierer keinen Zugriff hat.E wird per Schiebeoperation halbiert; die vormals letzte Stelle der Binärzahl kommt dabei ins Carry-Flag des Maschinenstatusregisters.F auf das Register A addiert.F wird per Schiebeoperation verdoppelt.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.Aufgabe: Implementation der Sinus-Funktion in 80x86-Assembler mit Hilfe der zugehörigen Taylor-Reihe.
Projektbetreuer: Detlef Fliegl.
Hilfsmittel: Netwide Assembler, GNU C Compiler.
Initialisierung (Parameterübernahme aus dem Rahmenprogramm)C-Programm, Makefile (für GCC unter Linux)
fsin ist etwa um den Faktor 20 schneller (Pentium MMX, Linux).