Tutorübung 7: Mikroprogrammierung I Vorlesung Einführung in die Technische Informatik (ETI) Lehrstuhl für Rechnertechnik und Rechnerorganisation Institut für Informatik 10 Technische Universität München
Sedezimalzahlen 1.Zahl: 0101 0101 1111 1010 2.Zahl: 1111 1010 0101 0000 3.Zahl: 1111 1010 0101 0000
Sedezimalzahlen 1.Zahl: 0101 0101 1111 1010 = 55f5 2.Zahl: 1111 1010 0101 0000 = fa50 3.Zahl: 1111 1010 0101 0000 = 05f5
Oktalzahlen 1.Zahl: 010 011 111
Oktalzahlen 1.Zahl: 010 011 111 = 237
Endlicher (Kaffee)-automat Zustände z1 := Automat wartet auf Kunden (Anfangszustand) z2 := Automat wartet auf Geldeinwurf z3 := Automat gibt Kaffee aus Eingabe G := Ein Geldstück wurde eingeworfen.!g := Es wurde 1 Minute lang kein Geld eingeworfen. K := Der Knopf wurde gedrückt. Ausgabe B1 := Bitte Knopf drücken! B2 := Bitte Geld einwerfen!
Endlicher (Kaffee)-automat Ausgabefunktion λ(z1) := B1 λ(z2) := B2 λ(z3) := {}
Endlicher (Kaffee)-automat z1 ε z2 K!G δ z1 z2 z3 G K z2 z2 z1 G z1 z3 z1!g z1 z1 z1 z3
Befehlstabelle Befehl Opcode Länge Beschreibung CMP RB 01 16 16 Bit setzt Zeroflag, falls 0 = RB ADD RA, RB 05 16 16 Bit RB := RB + RA DEC RB 06 16 16 Bit RB := RB 1 MOV imm, RB 0E 16 32 Bit RB := imm MOV RA, addr 0F 16 32 Bit [addr] := RA JZ addr A1 16 32 Bit falls Zeroflag gesetzt, Sprung nach addr JMP addr A2 16 32 Bit unbedingter Sprung nach addr
Bitte disassemblieren! Speicherauszug: Adresse Inhalt 1A35... 1A36 0E02 1A37 0000 1A38 0100 1A39 A100 1A3A 1A3F 1A3B 0512 1A3C 0600 1A3D A200 1A3E 1A38 1A3F... Befehlstabelle: Befehl Opcode Länge CMP RB 01 16 16 Bit ADD RA, RB 05 16 16 Bit DEC RB 06 16 16 Bit MOV imm, RB 0E 16 32 Bit MOV RA, addr 0F 16 32 Bit JZ addr A1 16 32 Bit JMP addr A2 16 32 Bit
Lösung Speicherauszug: Adresse Inhalt 1A35... 1A36 0E02 1A37 0000 1A38 0100 1A39 A100 1A3A 1A3F 1A3B 0512 1A3C 0600 1A3D A200 1A3E 1A38 1A3F... Assemblerprogramm: MOV 0x0000, r2 schleife: CMP r0 JNZ ende ADD r1, r2 DEC r0 JMP schleife ende:
Lösung Opcodes Speicherauszug: Adresse Inhalt 1A35... 1A36 0E02 1A37 0000 1A38 0100 1A39 A100 1A3A 1A3F 1A3B 0512 1A3C 0600 1A3D A200 1A3E 1A38 1A3F... Assemblerprogramm: MOV 0x0000, r2 schleife: CMP r0 JNZ ende ADD r1, r2 DEC r0 JMP schleife ende:
Lösung Registeroperanden Speicherauszug: Adresse Inhalt 1A35... 1A36 0E02 1A37 0000 1A38 0100 1A39 A100 1A3A 1A3F 1A3B 0512 1A3C 0600 1A3D A200 1A3E 1A38 1A3F... Assemblerprogramm: MOV 0x0000, r2 schleife: CMP r0 JNZ ende ADD r1, r2 DEC r0 JMP schleife ende:
Lösung Direktoperanden Speicherauszug: Adresse Inhalt 1A35... 1A36 0E02 1A37 0000 1A38 0100 1A39 A100 1A3A 1A3F 1A3B 0512 1A3C 0600 1A3D A200 1A3E 1A38 1A3F... Assemblerprogramm: MOV 0x0000, r2 schleife: CMP r0 JNZ ende ADD r1, r2 DEC r0 JMP schleife ende:
CMP RB
CMP RB Speicher: sende Befehlszähler an Speicher (Adressbus) liefere Befehl (Datenbus) inkrementiere Befehlszähler (warum?)
CMP RB Speicher: sende Befehlszähler an Speicher (Adressbus) liefere Befehl (Datenbus) inkrementiere Befehlszähler (warum?) Rechenwerk: berechne 0+RB, setze Zeroflag entsprechend
ADD RA,RB sende Befehlszähler an Speicher (Adressbus) Speicher: liefere Befehl (Datenbus) inkrementiere Befehlszähler
ADD RA,RB sende Befehlszähler an Speicher (Adressbus) Speicher: liefere Befehl (Datenbus) inkrementiere Befehlszähler Rechenwerk: berechne RA+RB, setze Flags entsprechend Rechenwerk: speichere Ergebnis in RB
DEC RB Speicher: sende Befehlszähler an Speicher (Adressbus) liefere Befehl (Datenbus) inkrementiere Befehlszähler
DEC RB Speicher: sende Befehlszähler an Speicher (Adressbus) liefere Befehl (Datenbus) inkrementiere Befehlszähler Rechenwerk: berechne RB-1, setze Flags entsprechend Rechenwerk: speichere Ergebnis in RB
MOV imm, RB sende Befehlszähler an Speicher (Adressbus) Speicher: liefere Befehl (Datenbus) inkrementiere Befehlszähler
MOV imm, RB sende Befehlszähler an Speicher (Adressbus) Speicher: liefere Befehl (Datenbus) inkrementiere Befehlszähler Speicher: sende Befehlszähler an Speicher (Adressbus) liefere imm-wert (Datenbus)
MOV imm, RB sende Befehlszähler an Speicher (Adressbus) Speicher: liefere Befehl (Datenbus) inkrementiere Befehlszähler Speicher: sende Befehlszähler an Speicher (Adressbus) liefere imm-wert (Datenbus) Rechenwerk: berechne imm+0, Flags werden nicht geändert Rechenwerk: Speichere Ergebnis in RB
MOV imm, RB sende Befehlszähler an Speicher (Adressbus) Speicher: liefere Befehl (Datenbus) inkrementiere Befehlszähler Speicher: sende Befehlszähler an Speicher (Adressbus) liefere imm-wert (Datenbus) Rechenwerk: berechne imm+0, Flags werden nicht geändert Rechenwerk: Speichere Ergebnis in RB inkrementiere Befehlszähler (warum?)
MOV RA, addr sende Befehlszähler an Speicher (Adressbus) Speicher: liefere Befehl (Datenbus) inkrementiere Befehlszähler sende Befehlszähler an Speicher (Adressbus) Speicher: liefere addr-wert (Datenbus)
MOV RA, addr sende Befehlszähler an Speicher (Adressbus) Speicher: liefere Befehl (Datenbus) inkrementiere Befehlszähler sende Befehlszähler an Speicher (Adressbus) Speicher: liefere addr-wert (Datenbus) Rechenwerk: sende addr an Speicher (Adressbus) Rechenwerk: Berechne RA+0, Flags werden nicht geändert Rechenwerk: sende Ergebnis an Speicher (Datenbus) Speicher: speichere Ergebnis
MOV RA, addr sende Befehlszähler an Speicher (Adressbus) Speicher: liefere Befehl (Datenbus) inkrementiere Befehlszähler sende Befehlszähler an Speicher (Adressbus) Speicher: liefere addr-wert (Datenbus) Rechenwerk: sende addr an Speicher (Adressbus) Rechenwerk: Berechne RA+0, Flags werden nicht geändert Rechenwerk: sende Ergebnis an Speicher (Datenbus) Speicher: speichere Ergebnis inkrementiere Befehlszähler
JZ addr Speicher: sende Befehlszähler an Speicher (Adressbus) liefere Befehl (Datenbus) inkrementiere Befehlszähler
JZ addr Speicher: sende Befehlszähler an Speicher (Adressbus) liefere Befehl (Datenbus) inkrementiere Befehlszähler falls Zeroflag gesetzt: inkrementiere Befehlszähler sonst: sende Befehlszähler an Speicher (Adressbus) Speicher: liefere addr-wert (Datenbus) setze Befehlszähler auf addr
JMP addr Speicher: Speicher: sende Befehlszähler an Speicher (Adressbus) liefere Befehl (Datenbus) inkrementiere Befehlszähler sende Befehlszähler an Speicher (Adressbus) liefere addr (Datenbus) setze Befehlszähler auf addr