Der Von-Neumann-Rechner
Informatik Leistungsfach · Gymnasium Baden-Württemberg · Mikrosim-Assembler
🎯 Worum geht's? Klasse 11–13 · 3–4 Unterrichtsstunden
Nach dieser Seite kannst du …
- den Aufbau eines Von-Neumann-Rechners beschreiben (Rechenwerk, Steuerwerk, Speicher, Bus)
- den Befehlszyklus Holen – Dekodieren – Ausführen an einem Beispiel durchspielen
- kurze Assembler-Programme lesen und ihren Ablauf in den Registern verfolgen
Vorwissen: Binärzahlen, einfache Programme
💡 Was ist das Von-Neumann-Prinzip?
John von Neumann beschrieb 1945 eine Rechnerarchitektur, die bis heute die Basis der meisten Computer bildet. Das revolutionäre Konzept: Programme und Daten liegen gemeinsam im selben Speicher und sind beide veränderbar.
🔑 Die 5 Kernprinzipien
- Universalrechner: Beliebige Aufgaben durch Austausch des Programms lösbar
- Gemeinsamer Speicher: Befehle und Daten liegen im selben Arbeitsspeicher
- Sequentielle Abarbeitung: Befehle werden der Reihe nach ausgeführt
- Binärdarstellung: Alle Informationen als Binärzahlen codiert
- Binäre Schaltlogik: Verarbeitung durch einfache logische Gatter
🔧 Aufbau der Von-Neumann-Architektur
Ein Von-Neumann-Rechner besteht aus 4 Grundkomponenten, die über einen gemeinsamen Bus kommunizieren:
Enthält sowohl Programm-Befehle als auch Daten – adressierbar über Speicheradressen
Tastatur, Maus, Sensoren …
Bildschirm, Drucker …
📦 Register im Mikrosim-Modell
| Register | Name | Funktion | Beispiel |
|---|---|---|---|
| AX | Akkumulator X | Allgemeines Rechenregister – Hauptoperand | MOV AX, 5 |
| BX | Basisregister X | Allgemeines Register, oft als Adresszeiger | ADD BX, AX |
| IP | Instruction Pointer | Zeigt auf den nächsten auszuführenden Befehl | Nach Fetch: IP+2 |
| SP | Stack Pointer | Zeigt auf die Spitze des Stacks | Nach PUSH: SP−1 |
| DR | Data Register | Zwischenspeicher für den Operanden (intern) | Automatisch |
| OP | Opcode Register | Enthält den aktuell geladenen Befehlscode | OP = 0x12 |
| FLAG | Flag-Register | Sign (negativ?) und Zero (null?) | Nach SUB: S/Z |
🔄 Der Fetch-Decode-Execute-Zyklus
Adr 00:
MOV OP,[IP] – Opcode laden |
Adr 03: INC IP |
Adr 04: MOV DR,[IP] – Operand laden |
Adr 06: INC IP |
Adr 07: EXECUTE
📌 Beispiel: MOV AX, 5
- FETCH: Speicher[IP]=0x12 → OP; IP++
- FETCH OP: Speicher[IP]=0x05 → DR; IP++
- DECODE: 0x12 = „Direktwert in AX laden"
- EXECUTE: AX ← DR = 5
💾 Speicherorganisation & Adressierungsarten
Beispielprogramm im Speicher:
| Adresse | Inhalt | Bedeutung |
|---|---|---|
| 00 | 12 | ← IP: MOV AX, nn |
| 01 | 05 | Operand: 5 |
| 02 | 24 | MOV BX, nn |
| 03 | 03 | Operand: 3 |
| 04 | 2E | ADD AX, nn |
| 05 | 02 | Operand: 2 |
| 06 | 7C | HALT |
| 10 | 0A | Datenwert 10 |
- nn Unmittelbar:
MOV AX, 5 - [nn] Direkt:
MOV AX,[10] - [BX] Indirekt:
MOV AX,[BX] - BX Register:
ADD AX, BX
📋 Befehlssatz (Kurzübersicht)
| Opcode | Befehl | Beschreibung |
|---|---|---|
| 🔀 Datentransfer (MOV) | ||
12 |
MOV AX, nn |
Lade Direktwert nn in AX |
10 |
MOV AX,[nn] |
Lade Speicher[nn] in AX |
13 |
MOV AX,[BX] |
Lade Speicher[BX] in AX |
24 |
MOV BX, nn |
Lade Direktwert nn in BX |
19 |
MOV [nn],AX |
Speichere AX nach Speicher[nn] |
28 |
MOV AX, BX |
Kopiere BX nach AX |
2A |
MOV BX, AX |
Kopiere AX nach BX |
| ➕ Arithmetik | ||
2E |
ADD AX, nn |
AX = AX + nn |
32 |
ADD AX, BX |
AX = AX + BX |
36 |
SUB AX, nn |
AX = AX − nn |
3C |
SUB AX, BX |
AX = AX − BX |
5B |
INC AX |
AX = AX + 1 |
5C |
INC BX |
BX = BX + 1 |
5E |
DEC AX |
AX = AX − 1 |
5F |
DEC BX |
BX = BX − 1 |
| 🔁 Sprünge | ||
63 |
JMP nn |
Unbedingter Sprung zu nn |
67 |
JS nn |
Sprung wenn S-Flag gesetzt (negativ) |
6A |
JNS nn |
Sprung wenn S-Flag nicht gesetzt (≥ 0) |
6B |
JZ nn |
Sprung wenn Z-Flag gesetzt (= 0) |
73 |
JNZ nn |
Sprung wenn Z-Flag nicht gesetzt (≠ 0) |
| 📞 Unterprogramme & Stack | ||
88 |
CALL nn |
Unterprogramm aufrufen |
90 |
RET |
Rückkehr aus Unterprogramm |
97 |
PUSH AX |
AX auf Stack legen |
9B |
POP AX |
Stack-Top in AX |
7C |
HALT |
Programm anhalten |
💻 Assembler-Beispielprogramme
⚖️ Von-Neumann vs. Harvard-Architektur
Von-Neumann
- Befehle & Daten im selben Speicher
- Ein gemeinsamer Bus
- Einfacher, günstiger
- Flaschenhals
- PCs, Server
Harvard
- Befehle & Daten getrennt
- Zwei separate Busse
- Gleichzeitiger Zugriff
- Schneller, aufwändiger
- Mikrocontroller
⚙️ Was ist die Firmware?
Die Firmware (Mikroprogramm) des Mikrosim-Rechners ist das Steuerwerk auf Mikroebene. Sie definiert für jeden Maschinenbefehl (Opcode), welche Mikrooperationen in welcher Reihenfolge ausgeführt werden. Jede Zeile der Firmware-Tabelle entspricht einem Mikroschritt – die Spalten 0–F und FA sind Steuerleitungen (Bits), und die letzte Spalte gibt die nächste Firmware-Adresse an.
AD Mnemonic 0 1 2 3 4 5 6 7 8 9 A B C D E F FA- AD – Firmware-Adresse (hexadezimal)
- Mnemonic – Name des Makrobefehls, den dieser Schritt implementiert
- 0–F, FA – Steuerleitungen (Mikrooperationen). Ein Punkt
.= inaktiv, eine Ziffer = aktiv - Letzte Spalte – nächste Firmware-Adresse (Sprung im Mikroprogramm)
🔩 Bedeutung der Steuerleitungen (0–F)
| Opcode | Mnemonic | Kategorie | Steuerleitungen (aktiv) | Info |
|---|
📄 Vollständige Firmware (Rohformat)
Dies ist der originale Firmware-Quelltext der Datei firmware2_vollstaendig.mpd:
Welche Aussagen beschreiben korrekte Grundprinzipien der Von-Neumann-Architektur?
✅ Richtig: a, c, e
- a ✓ Gemeinsamer Speicher: das zentrale Prinzip
- b ✗ Harvard-Architektur hat getrennte Busse
- c ✓ Sequentielle Abarbeitung
- d ✗ Universalrechner durch Programmaustausch
- e ✓ Binärdarstellung
Was ist die Aufgabe des Instruction Pointer (IP)?
✅ b) ist richtig
Der IP enthält die Adresse des nächsten Befehls. Sprungbefehle verändern IP gezielt.
Nummeriere die Schritte des Befehlszyklus von 1 (zuerst) bis 5 (zuletzt):
✅ Reihenfolge:
- FETCH
- INC IP
- FETCH OPERAND
- DECODE
- EXECUTE
Führe das Programm gedanklich aus. Was steht nach HALT in AX?
AX =
✅ AX = 13
| Befehl | AX |
|---|---|
| MOV AX, 10 | 10 |
| SUB AX, 3 | 7 |
| ADD AX, 7 | 14 |
| DEC AX | 13 |
Verfolge das Programm schrittweise und fülle die Trace-Tabelle aus (Summe 1+2+3+4+5):
| DL | BX vor ADD | AX nach ADD | BX nach INC | BX−6 | ZF | Sprung? |
|---|---|---|---|---|---|---|
| 1 | 1 | |||||
| 2 | ||||||
| 3 | ||||||
| 4 | ||||||
| 5 |
✅ Trace-Tabelle:
| DL | BX vor | AX nach | BX INC | BX−6 | ZF | Sprung |
|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 2 | −4 | 0 | Ja |
| 2 | 2 | 3 | 3 | −3 | 0 | Ja |
| 3 | 3 | 6 | 4 | −2 | 0 | Ja |
| 4 | 4 | 10 | 5 | −1 | 0 | Ja |
| 5 | 5 | 15 | 6 | 0 | 1 | Nein |
AX = 15 = 1+2+3+4+5
Ordne zu. Speicher: [10]=42, [11]=7. BX=10.
| Befehl | Adressierungsart | AX danach |
|---|---|---|
MOV AX, 42 |
||
MOV AX, [10] |
||
MOV AX, [BX] |
||
MOV AX, BX |
✅ Lösung:
MOV AX, 42→ Unmittelbar | AX = 42MOV AX, [10]→ Direkt | AX = 42MOV AX, [BX]→ Indirekt (Register) | AX = 42 (BX=10)MOV AX, BX→ Register | AX = 10
Finde das Minimum von Speicher[10] und Speicher[11]. Ergebnis → [20]. [10]=7, [11]=3.
✅ Musterlösung:
Erkläre in 3–5 Sätzen den Von-Neumann-Flaschenhals und wie die Harvard-Architektur ihn löst.
✅ Musterlösung:
Da Befehle und Daten denselben Speicher und Bus nutzen, kann die CPU nicht gleichzeitig einen Befehl laden und auf den Datenspeicher zugreifen – beide Zugriffe müssen nacheinander erfolgen. Das begrenzt den Durchsatz. Die Harvard-Architektur löst dies durch getrennte Speicher und Busse für Befehle und Daten, sodass gleichzeitige Zugriffe möglich sind.
Finde das größte Element aus [10..14]. [10]=3, [11]=8, [12]=2, [13]=9, [14]=5. Ergebnis → [20].
✅ Musterlösung:
Analysiere das folgende Programm:
a) Was berechnet quad?
b) Speicher[20] nach HALT =
c) Welche Adresse liegt auf dem Stack nach CALL?
✅ Lösung:
a) 4 × AX: BX=AX, dann AX+BX+BX+BX = 4·AX
b) Speicher[20] = 12 (4×3)
c) Adresse 04 – der Befehl nach CALL. RET liest sie und setzt IP=04.
Implementiere mult: AX × BX → AX. Hauptprogramm: 4 × 6 = 24.
✅ Musterlösung:
Analysiere die Firmware-Zeilen 00–07 und beantworte die Fragen:
a) Was passiert bei Befehlen ohne Operanden (z. B. HALT)?
b) Verfolge den IP für MOV AX, 7 →
HALT (Speicher: [00]=12, [01]=07, [02]=7C, [03]=00):
✅ Lösung:
a) Der Fetch-Zyklus ist für alle Befehle identisch. Bei 1-Byte-Befehlen wie HALT wird der folgende Speicherinhalt als Operand in DR geladen, aber bei der Ausführung ignoriert. IP erhöht sich trotzdem korrekt.
b) 00 → 01 → 02 → 03 → 04 → HALT bei 04