T03-ReTI-Befehlssatz-und-Maschinencode
ReTI Befehlssatz & Maschinencode
Zusammenfassung
ReTI (Rechner Technische Informatik) ist der in der Vorlesung verwendete Beispielrechner. Er wurde ursprünglich unter dem Namen ReSa ("Rechner Saarbrücken") in [Keller,Paul] eingeführt. ReTI dient als Illustrator und Anwendungsbeispiel für alle vorgestellten Konzepte der Vorlesung — von Kodierung über Datenpfade bis hin zur Kontrolllogik.
Die abstrakte ReTI-Maschine besitzt zwei unendlich große Speicher und vier Register. In der realen Implementierung werden Speicher und Register auf 32-Bit-Wörter (
Exam-Relevanz
- Aufgabe 2 (A2) in der Klausur: 16 Punkte — "ReTI Machine Code Quiz"
- Sowohl in der Exam-Klausur (WS 2024/25) als auch in der probeklausur (SoSe 2026) ist A2 identisch aufgebaut
- Gegeben: Ein ReTI-Programm mit 16 Instruktionen, bei denen jeweils ein Hex-Ziffer fehlt (
_), sowie die Befehlstabelle auf der nächsten Seite - Gefragt: Vervollständigung des Maschinencodes — eine Hex-Ziffer pro
_ - Die Befehlstabelle wird in der Klausur mitgegeben — man muss also nicht auswendig wissen, welche Bits welchen Befehl kodieren, aber man muss schnell und korrekt encode/decode können
- Zeitbudget: ~15 Minuten für 16 Fragen (90 min / 6 Aufgaben)
- Tool zum Üben:
retiquiz <matrikelnummer>aus dem reticode Repository
Die ReTI Maschine
Architektur (abstrakt)
| Komponente | Beschreibung |
|---|---|
| Datenspeicher |
Unendlich viele Zellen, |
| Programmspeicher |
Unendlich viele Zellen mit Maschinenbefehlen, |
| PC | Program Counter (Befehlszähler) |
| ACC | Akkumulator |
| IN1 | Indexregister 1 |
| IN2 | Indexregister 2 |
Architektur (real, 32-Bit)
- Ein gemeinsamer Speicher
der Größe für Daten und Befehle — jedes Element ist ein Wort (32-Bit-Bitvektor)- Register PC, ACC, IN1, IN2 nehmen jeweils
auf - Ein Wort kann interpretiert werden als:
- Binärzahl (z. B. Adresse in
) — Notation - Zweierkomplementzahl — Notation
- Bitstring (für Bitoperationen)
- Binärzahl (z. B. Adresse in
Notation
wobei
Programmablauf
- Beim Start: Programm in
, Daten in , - Inhalt von
wird nicht geändert - In jedem Schritt
: wird als Befehl interpretiert und ausgeführt - PC erhält neuen Wert (abhängig vom Befehl — meist
)
Befehlssatz
Der Befehlssatz umfasst vier Gruppen: Load, Store, Compute und Jump. Alle Befehle werden als 32-Bit-Wörter kodiert.
Register-Kodierung
| S / D | Register |
|---|---|
00 |
PC |
01 |
IN1 |
10 |
IN2 |
11 |
ACC |
Load-Befehle —
| Befehl | Wirkung | |
|---|---|---|
0100 |
LOAD D i |
|
0101 |
LOADIN1 D i |
|
0110 |
LOADIN2 D i |
|
0111 |
LOADI D i |
Für alle Load-Befehle:
Store-Befehle — MOVE: ,
| Befehl | Wirkung | |
|---|---|---|
1000 |
STORE i |
|
1001 |
STOREIN1 i |
|
1010 |
STOREIN2 i |
|
1011 |
MOVE S D |
Für alle Store-Befehle:
Compute-Befehle —
Immediate-Befehle (MI = 0)
| Befehl | Wirkung | |
|---|---|---|
000010 |
SUBI D i |
|
000011 |
ADDI D i |
|
000100 |
OPLUSI D i |
|
000101 |
ORI D i |
|
000110 |
ANDI D i |
Memory-Befehle (MI = 1)
| Befehl | Wirkung | |
|---|---|---|
001010 |
SUB D i |
|
001011 |
ADD D i |
|
001100 |
OPLUS D i |
|
001101 |
OR D i |
|
001110 |
AND D i |
Für alle Compute-Befehle:
Jump-Befehle —
| Befehl | Bedingung |
|
|---|---|---|
11000 |
NOP |
nie (nur |
11001 |
JUMP> i |
|
11010 |
JUMP= i |
|
11011 |
JUMP>= i |
|
11100 |
JUMP< i |
|
11101 |
JUMP!= i |
|
11110 |
JUMP<= i |
|
11111 |
JUMP i |
immer (unbedingt) |
Bedingte Sprungbefehle:
Unbedingter Sprung (JUMP i,
NOP (
Condition-Kodierung
Die 3-Bit-Bedingung
| Bit | Bedeutung wenn gesetzt |
|---|---|
Kombinationen:
Instruktionsformate
Allgemeines Format
Sei
| Bits | 31–30 | 29–28 | 27–26 | 25–24 | 23–0 |
|---|---|---|---|---|---|
| Feld | Typ | Modus/Funktion/Compare/Source | Destination | Immediate |
Typ-Kodierung (Bits 31–30)
| T | Typ |
|---|---|
01 |
Load |
10 |
Store |
00 |
Compute |
11 |
Jump |
Spezifische Formate
Load
| 31–30 | 29–28 | 27–26 | 25–24 | 23–0 | |
|---|---|---|---|---|---|
| Load | 01 |
M | ** |
D | i |
- M — Modus:
00=LOAD,01=LOADIN1,10=LOADIN2,11=LOADI **— irrelevant (kein Source-Register bei Load)- D — Destination Register
- i — 24-Bit-Immediate (Adresse, Offset oder Konstante)
Store
| 31–30 | 29–28 | 27–26 | 25–24 | 23–0 | |
|---|---|---|---|---|---|
| Store | 10 |
M | S | D | i |
- M — Modus:
00=STORE,01=STOREIN1,10=STOREIN2,11=MOVE - S — Source Register (nur bei
MOVErelevant) - D — Destination Register (nur bei
MOVErelevant) - i — absolute Adresse oder Indexregister-Offset
Compute
| 31–30 | 29 | 28–26 | 25–24 | 23–0 | |
|---|---|---|---|---|---|
| Compute | 00 |
MI | F | D | i |
- MI — Memory/Immediate:
0=Immediate,1=Memory - F — Funktion (3 Bits):
010=SUB,011=ADD,100=OPLUS,101=OR,110=AND - D — Destination Register (Source implizit
) - i — Immediate-Konstante oder Speicheradresse
Jump
| 31–30 | 29–27 | 26–24 | 23–0 | |
|---|---|---|---|---|
| Jump | 11 |
C | *** |
i |
- C — Condition (3 Bits, siehe Jump-Tabelle oben)
***— irrelevant- i — 24-Bit-Sprungweite als Zweierkomplementzahl
Sign Extension bei Immediate
LOADI: — die oberen 8 Bits werden mit 0 gefüllt (Zero-Extension)OPLUSI,ORI,ANDI: — ebenfalls Zero-Extension auf 32 BitADDI,SUBI: — wird als Zweierkomplement interpretiert (Sign-Extension)JUMP: — als Zweierkomplement (kann negativ sein für Rückwärts-Sprünge)
Encode/Decode
Encode: Instruktion → Maschinencode (Hex)
Vorgehen:
- Befehlstyp bestimmen → Bits 31–30
- Modus/Funktion/Condition bestimmen → Bits 29–26 (je nach Typ)
- Source/Destination-Register kodieren → Bits 27–24
- Immediate
als 24-Bit-Zweierkomplement → Bits 23–0 - Alle Bits zusammenfassen → 32-Bit-Wort → als Hex darstellen
Beispiel 1: LOADI IN2 42
- Typ: Load →
01 - Modus: LOADI →
11 - Irrelevant:
00(wird 0) - D = IN2 →
10 →0000000000000000000000101010(24 Bit)
Hex: 0111 0010 0000 0000 0000 0000 0010 1010 = 7200002A
Beispiel 2: MOVE IN2 ACC
- Typ: Store →
10 - Modus: MOVE →
11 - S = IN2 →
10 - D = ACC →
11 (irrelevant)
Hex: 1011 1011 0000 0000 0000 0000 0000 0000 = BB000000
Beispiel 3: JUMP 0 (unbedingt)
- Typ: Jump →
11 - C = immer →
111 - Irrelevant:
000
Hex: 1111 1000 0000 0000 0000 0000 0000 0000 = F8000000
Beispiel 4: ADD ACC -9
- Typ: Compute →
00 - MI = Memory →
1 - F = ADD →
011 - D = ACC →
11 als 24-Bit-Zweierkomplement:FFFFFF7
Hex: 0011 1011 1111 1111 1111 1111 1111 0111 = 3BFFFFFF7
Achtung: Das obige Beispiel zeigt die Struktur. Tatsächlich ergibt
00 1 011 11+ 24-Bit--9=0011 1011 1111 1111 1111 1111 1111 0111=3BFFFFFF7. In der Klausur (A2) stehtADD ACC -9mit Code_ffffff7— die fehlende Ziffer ist3(Bits 31–28 =0011).
Decode: Maschinencode → Instruktion
Vorgehen:
- Bits 31–30 lesen → Typ bestimmen
- Je nach Typ weitere Bits lesen:
- Load (
01): Bits 29–28 = M, Bits 25–24 = D - Store (
10): Bits 29–28 = M, Bits 27–26 = S, Bits 25–24 = D - Compute (
00): Bit 29 = MI, Bits 28–26 = F, Bits 25–24 = D - Jump (
11): Bits 29–27 = C
- Load (
- Bits 23–0 = Immediate
- Register und Befehlsname aus Tabellen ablesen
Beispiel: 9100000A dekodieren
- Binär:
1001 0001 0000 0000 0000 0000 0000 1010 - Bits 31–30 =
10→ Store - Bits 29–28 =
01→ Modus = STOREIN1 - Bits 27–26 =
00→ S = PC (irrelevant bei STOREIN1) - Bits 25–24 =
01→ D = IN1 (irrelevant bei STOREIN1) - Bits 23–0 =
000000000000000000001010= 10
→ STOREIN1 10
Klausur-Strategie für A2
Bei der Klausuraufgabe fehlt jeweils eine Hex-Ziffer (4 Bits) im Maschinencode. Vorgehen:
- Instruktion und ggf. Register und Immediate aus der linken Spalte ablesen
- Bestimmen, welche 4 Bits fehlen (welche Nibble-Position im 32-Bit-Wort)
- Diese Bits aus Befehlstabelle + Register-Kodierung + Immediate ableiten
- Als Hex-Ziffer eintragen
Wichtig: Für irrelevante Bits (* in der Befehlstabelle) wird 0 eingetragen!
Kontrolllogik
Die Kontrolllogik von ReTI wird als endlicher Automat realisiert. Die Befehlsabarbeitung ist in Fetch-Phase und Execute-Phase unterteilt, jede Phase besteht aus 4 Takten.
Phasensignale
| Signal | Bedeutung |
|---|---|
| Fetch-Phase | |
| Execute-Phase | |
| Binärkodierung der Taktnummer (0–3) innerhalb der Phase |
- Steigende Flanken (Taktbeginn):
- Fallende Flanken (Taktmitte):
ck, werden Phasensignale genannt
Kontrollsignale
| Signal | Typ | Beschreibung |
|---|---|---|
rcken |
Clock-Enable | Für Register |
/XYdoe |
Output-Enable (active low) | Für Treiber XYd |
| Funktions-Select | ALU-Funktionsauswahl | |
/PCclear, /PCload |
PC-Steuerung | Clear/Load des PC |
sext |
Sign-Extension | Füllbits bei 24-Bit-Immediate |
/SMDdoe |
Output-Enable (active low) | Speicher-Ausgangstreiber |
SMw |
Memory Write | Schreibsignal für Speicher |
Fetch-Phase ( , 4 Takte – )
: PC-Adresse auf Adressbus legen (PCAdenabled) : Befehl aus Speicher lesen (/SMDdoeaktiv), in Instruktionsregister laden (Icken) – : Befehl dekodieren, Vorbereitung der Execute-Phase : PC auf Bus legen für eventuelle PC-Modifikation (PCLdoe)
Execute-Phase ( , 4 Takte – )
– : Operanden laden, ALU-Operation ausführen – : Ergebnis in Zielregister schreiben (rckenaktiv) – : Bei Store-Befehlen: Speicher schreiben (SMwaktiv)
Beispiel: Icken (Instruktionsregister Clock-Enable)
Aktiv im Takt
Beispiel: ACCcken (ACC Clock-Enable)
Aktiv im Takt
Speicheransteuerung
/SMDdoe(Lesen): aktiviert von bis (nächster Takt) bei Fetch, Compute-Memory, LOAD, LOADINjSMw(Schreiben): aktiviert von bis der Execute-Phase bei STORE, STOREINj
Siehe k460-Kontrolllogik_von_ReTI für Details.
Typische Klausuraufgabe
A2 — ReTI Machine Code Quiz (16 Punkte)
Format (identisch in Exam und probeklausur):
$ ./retiquiz 202502260900
ReTI Machine Code Quiz Version 0.0.3-rc.3
retiquiz 202502260900 16
...
INSTRUCTION ; PC CODE
STOREIN1 10 ; 00000000 900000_a
JUMP>= 1 ; 00000001 _8000001
JUMP 0 ; 00000002 f_000000
...
- 16 Instruktionen, jeweils eine fehlende Hex-Ziffer (
_) - Gegeben: Instruktion (Assembler-Mnemonic + Operanden), PC, unvollständiger Maschinencode
- Befehlstabelle wird mitgeliefert (siehe oben)
- Für irrelevante Bits (
*):0eintragen
Lösungsschritte am Beispiel
STOREIN1 10 ; 900000_a — fehlt das letzte Nibble (Bits 3–0):
STOREIN1: Typ=10, Modus=01→ Bits 31–28 =1001=9✓ → Bits 23–0 =00000A- Letztes Nibble =
A→ Lösung:9000000A
JUMP>= 1 ; _8000001 — fehlt Bit 31–28 (erstes Nibble):
JUMP>=: Typ=11, C=011→ Bits 31–27 =11011- Bits 31–28 =
1101=D... aber Wait: Bits 31–30 =11, Bits 29–27 =011→ Bit 28 =0 - Bits 31–28 =
1100→D? Nein:110(Bit 29)1(Bit 28) →1101=D - Korrekt:
JUMP>=hat (Bits 29–27), Typ =11(Bits 31–30) - Bits 31–28 =
1 1 0 1→ Hmm, Bit 29 ist Teil von C. C =011→ - Bits 31–28 =
=D - Lösung:
D8000001
Tipp: Immer zuerst die Bits 31–30 (Typ) bestimmen, dann je nach Typ die weiteren Felder. Die Hex-Ziffern entsprechen jeweils 4 Bits.
Beispiel-Programme
Swap:
Vertauscht die Inhalte von Speicherzelle 0 und 1 über Hilfszelle 2.
LOAD 0 ; ACC := S(0) = x
STORE 2 ; S(2) := ACC = x (x sichern)
LOAD 1 ; ACC := S(1) = y
STORE 0 ; S(0) := ACC = y (y nach S(0))
LOAD 2 ; ACC := S(2) = x
STORE 1 ; S(1) := ACC = x (x nach S(1))
Indirekte Adressierung: Kopiere nach
LOAD 0 ; ACC := S(0) = x
MOVE ACC IN1 ; IN1 := ACC = x
LOAD 1 ; ACC := S(1) = y
STOREIN1 0 ; S(x) = S(IN1+0) := ACC = y
Multiplikation durch wiederholte Addition:
LOADI 0 ; ACC := 0
STORE 2 ; S(2) := 0 (Ergebnis)
LOAD 1 ; ACC := S(1) = y
SUBI 1 ; ACC := ACC - 1
STORE 1 ; S(1) := ACC (y dekrementieren)
JUMP< 5 ; falls ACC < 0: PC := PC + 5 (Schleife verlassen)
LOAD 2 ; ACC := S(2) (aktuelles Ergebnis)
ADD 0 ; ACC := ACC + S(0) = ACC + x
STORE 2 ; S(2) := ACC (Ergebnis aktualisieren)
JUMP -7 ; PC := PC - 7 (zurück zum Schleifenanfang)
JUMP 0 ; PC := PC + 0 (Endlosschleife = Halt)
GGT (Größter gemeinsamer Teiler)
Berechnet
Methode:
; Initial: M(40) = x, M(41) = y, M(42) = 0 (Ergebnis)
LOAD 41 ; ACC := y
JUMP= 10 ; falls y == 0: Sprung zum Ende
LOAD 40 ; ACC := x
SUB 41 ; ACC := x - y
JUMP> 4 ; falls x > y: x > y, also x durch Differenz ersetzen
; hier: x <= y, also y durch y - x ersetzen
LOAD 41 ; ACC := y
SUB 40 ; ACC := y - x
STORE 41 ; M(41) := y - x
JUMP 2 ; zurück zum Schleifenanfang
; hier: x > y
STORE 40 ; M(40) := x - y
JUMP -8 ; zurück zum Schleifenanfang (LOAD 41)
; Ende: y == 0, Ergebnis ist x
LOAD 40 ; ACC := x (= ggt)
STORE 42 ; M(42) := ggt
JUMP 0 ; Halt
Siehe Blatt02 Aufgabe 3 für die ursprüngliche Aufgabenstellung.
Fibonacci (iterativ)
Berechnet
Eingabe:
; Pseudocode:
; f0 := 0, f1 := 1
; for i := 0 to n:
; M(100+i) := f0
; temp := f0 + f1
; f0 := f1
; f1 := temp
LOADI 0 ; ACC := 0
STORE 100 ; M(100) := f(0) = 0
LOADI 1 ; ACC := 1
STORE 101 ; M(101) := f(1) = 1 (wird überschrieben in Schleife)
; Hauptschleife
LOAD 99 ; ACC := n
SUBI 1 ; ACC := n - 1
JUMP< 20 ; falls n-1 < 0 (d.h. n=0): fertig
STORE 99 ; n := n - 1 (Zähler)
LOAD 100 ; ACC := f0
ADD 101 ; ACC := f0 + f1
STORE 102 ; temp := f0 + f1
LOAD 101 ; ACC := f1
STORE 100 ; f0 := f1
LOAD 102 ; ACC := temp
STORE 101 ; f1 := temp
JUMP -10 ; zurück zum Schleifenanfang
JUMP 0 ; Halt
Übungsblätter
| Blatt | Aufgabe | Thema | Wikilink |
|---|---|---|---|
| 2 | 2c | Fibonacci in ReTI | Blatt02 |
| 2 | 3 | GGT in ReTI | Blatt02 |
| 4 | 2 | retiquiz Machine Code Quiz | Blatt04 |
| 11 | 2 | Treiber in Execute-Phase | Blatt11 |
| 11 | 3 | Minimale Befehlsmenge für alle Treiber | Blatt11 |
| 11 | 6 | Fibonacci in ReTI (mit Pseudocode) | Blatt11 |
Quellen
| Quelle | Titel | Wikilink |
|---|---|---|
| Folie 1.2 | Beispielrechner ReTI | k120-Beispielrechner_ReTI |
| Folie 2.3 | Anwendung ReTI (32-Bit, Formate) | k230-Anwendung_ReTI |
| Folie 4.6 | Kontrolllogik von ReTI | k460-Kontrolllogik_von_ReTI |
| Zusatzmaterial | Befehlstabelle der ReTI | Befehlssatz-ReTI |
| Klausur | A2 — ReTI Machine Code Quiz | Exam |
| Probeklausur | A2 — ReTI Machine Code Quiz | probeklausur |
Priorität
CRITICAL — 16 Punkte in der Klausur (A2). Die Aufgabe ist rein mechanisch (Encode/Decode), erfordert aber Übung für Geschwindigkeit. Die Befehlstabelle wird mitgeliefert, daher ist weniger Auswendigwissen nötig als oft angenommen — entscheidend ist:
- Register-Kodierung auswendig:
00=PC,01=IN1,10=IN2,11=ACC - Typ-Bits auswendig:
01=Load,10=Store,00=Compute,11=Jump - Schnelles Encode/Decode üben mit
retiquiz - Zweierkomplement für negative Immediates beherrschen
- Irrelevante Bits (
*) → immer0eintragen
Mindestens 3–4 Durchgänge mit retiquiz <matrikelnummer> vor der Klausur empfohlen.