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.
C-Programm, Makefile (für GCC unter Linux)
fsin
ist etwa um den Faktor 20 schneller (Pentium MMX, Linux).