Lernziele
- Sie beschreiben die Komponenten eines Computersystems und die Von-Neumann-Architektur.
- Sie erläutern Aufbau und Register einer Registermaschine.
- Sie beschreiben den Befehlszyklus in seinen Phasen.
- Sie setzen einfache Algorithmen in Assembler um und testen sie im Simulator.
- Sie erklären, wie Verzweigungen und Schleifen aus Vergleichen und Sprüngen entstehen.
- Sie beschreiben die Grenzen endlicher Zahlendarstellungen.
Schritt 1
Motivation
Die Maschine unter der Sprache.
Bis hierher war ein Programm eine Folge von Anweisungen in Java. Dieser Lernbereich geht eine Ebene tiefer: Was tut der Prozessor, wenn er eine solche Anweisung ausführt?
Die Antwort ist überraschend schlicht. Ein Prozessor kann sehr wenig – laden,
speichern, rechnen, vergleichen, springen. Alles andere ist daraus
zusammengesetzt. Eine if-Abfrage wird zu einem Sprung über den Teil hinweg,
der nicht gilt; eine Schleife zu einem Sprung nach hinten.
Schritt 2
Erklärung
Der Aufbau.
Die Von-Neumann-Architektur
1945 beschrieb John von Neumann eine Architektur, in der das Programm im selben Speicher steht wie die Daten. Davor waren Rechner fest verdrahtet: Wer eine andere Aufgabe rechnen wollte, baute die Maschine um.
Steuerwerk und Rechenwerk zusammen bilden den Prozessor.
Das Bussystem
Schritt 2
Erklärung
Die Registermaschine.
Register
Eine Registermaschine hat wenige, sehr schnelle Speicherplätze direkt im Prozessor:
Befehle
Ein Maschinenbefehl besteht aus Operationscode (was zu tun ist) und Adressteil (womit). Beides steht in je einer Speicherzelle – deshalb belegt ein Befehl mit Operand zwei Zellen, und der Programmzähler wächst je Befehl um zwei.
LOAD 100 Wert aus Zelle 100 in den Akkumulator
LOADI 100 die Zahl 100 selbst in den Akkumulator
STORE 100 Akkumulator in Zelle 100 speichern
ADD 100 Zelle 100 zum Akkumulator addieren
SUB 100 Zelle 100 vom Akkumulator abziehen
JMP marke unbedingter Sprung
JMPZ marke Sprung, wenn das Zero-Flag gesetzt ist
HOLD Programmende
Der Befehlszyklus
Für jeden Befehl läuft dieselbe Folge ab:
- FETCH – Der Programmzähler steht auf dem Adressbus, der Befehl kommt über den Datenbus ins Befehlsregister. Der Programmzähler wird erhöht.
- FETCH (Adressteil) – dasselbe noch einmal für den Operanden.
- DECODE – Das Steuerwerk erkennt, welche Operation gemeint ist.
- EXECUTE – Das Rechenwerk führt sie aus; das Ergebnis landet im Akkumulator, und die Flags werden gesetzt.
Dann beginnt der Zyklus von vorn – bis ein HOLD erreicht wird oder das
Programm nicht mehr anhält.
Schritt 2
Erklärung
Kontrollstrukturen in Assembler.
Flags, Vergleiche und Sprünge
Der Prozessor kennt kein „größer als". Er rechnet und schaut auf die Flags:
Ein Vergleich a > b wird zur Subtraktion a − b und der anschließenden Frage
nach dem Vorzeichen. Daraus folgt eine Reihenfolge, die man einhalten muss:
erst rechnen, dann springen – und dazwischen nichts, was die Flags
verändert.
Verzweigung und Schleife
; if (a > b) { ... }
LOAD a
SUB b
JMPN sonst ; a - b negativ, also a < b
... ; Then-Zweig
JMP ende
sonst: ... ; Else-Zweig
ende: ...
; while (i > 0) { ... }
wiederh: LOAD i
JMPZ ende
... ; Rumpf – hier muss sich i ändern!
JMP wiederh
ende: HOLD
Eine Schleife ist ein Sprung nach hinten plus ein Zähler, der endet. Ändert sich der Zähler im Rumpf nicht, läuft das Programm endlos – der Simulator bricht nach einer Schrittgrenze ab und meldet es.
Schritt 2
Erklärung
Wenn die Bits nicht reichen.
Zahlendarstellungen
Hexadezimal ist im Rechnerkontext üblich, weil eine Hexadezimalziffer genau vier Binärstellen entspricht – die Umrechnung ist dadurch mechanisch.
Überlauf
Ein Speicherwort hat feste Breite. Bei 16 Bit im Zweierkomplement reicht der Bereich von −32 768 bis 32 767. Addiert man zu 32 767 die Zahl 1, entsteht nicht 32 768, sondern −32 768: Das Ergebnis kippt ins Negative, und das Overflow-Flag wird gesetzt.
Schritt 8
Zusammenfassung
Das Wichtigste auf einen Blick.
- Die Von-Neumann-Architektur legt Programm und Daten in denselben Speicher; das macht Rechner universell einsetzbar – und verwundbar.
- Adressbus, Datenbus, Steuerbus verbinden Prozessor und Speicher; nur der Datenbus arbeitet in beide Richtungen.
- Der Akkumulator ist Ziel jeder Operation – außer bei
STORE, wo er die Quelle ist. - Ein Befehl mit Operand belegt zwei Zellen; der Programmzähler wächst entsprechend um zwei.
- Der Befehlszyklus ist für jeden Befehl derselbe: holen, decodieren, ausführen.
- Der Prozessor kennt keine Vergleiche – er rechnet und liest die Flags. Deshalb gilt: erst rechnen, dann springen.
- Eine Schleife ist ein Sprung nach hinten; ohne veränderten Zähler endet sie nie.
- Zahlendarstellungen sind endlich; ein Überlauf kippt das Vorzeichen und wird nur bemerkt, wenn man das V-Flag abfragt.