Mini-CPU: der Little Man Computer

Das Programm liegt in denselben hundert Speicherfächern wie die Zahlen, mit denen es arbeitet. Geh es schrittweise durch und verfolge den Befehlszyklus aus Holen, Dekodieren und Ausführen: Lesezugriffe leuchten blau, Schreibzugriffe bernsteinfarben. Der nächste Befehl ist violett umrandet.

Interaktive Simulation wird geladen...

Lektion

Die Theorie — Mini-CPU: der Little Man Computer

Den Befehlszyklus aus Holen, Dekodieren und Ausführen durchläuft ein Prozessor für jeden Befehl. Beim Holen wird der Inhalt von PC nach MAR kopiert, das betreffende Speicherfach in MDR gelesen und dessen Inhalt nach CIR kopiert. Außerdem wird PC um 1 erhöht. Beim Dekodieren wird der Befehl in eine Operation (die Hunderterstelle) und eine Adresse (die letzten beiden Ziffern) zerlegt. Ausgenommen sind 901, 902 und 000: Diese Codes stehen als Ganzes für INP, OUT und HLT und enthalten keine Speicheradresse. Beim Ausführen wird die Operation durchgeführt. Dabei kann über MAR und MDR ein weiteres Speicherfach gelesen oder beschrieben werden.

Was die einzelnen Symbole bedeuten

PC
Befehlszähler: die Adresse des nächsten zu holenden Befehls
MAR
Speicheradressregister: die Adresse des Speicherfachs, das als Nächstes gelesen oder beschrieben wird
MDR
Speicherdatenregister: der gerade gelesene oder als Nächstes zu schreibende Wert
CIR
Befehlsregister: der gerade ausgeführte Befehl
ACC
Akkumulator: hier legen ADD, SUB und LDA ihr Ergebnis ab
Setzt voraus
Stuart Madnicks Little Man Computer (MIT, 1965) legt nicht fest, was passiert, wenn SUB ein Ergebnis unter 0 oder ADD eines über 999 liefert. Der Akkumulator dieses Simulators kann Werte von −999 bis 999 aufnehmen. BRP prüft daher das Vorzeichen. Ein Ergebnis außerhalb dieses Bereichs beendet den Programmlauf wegen Überlaufs; es wird nicht auf einen Wert im zulässigen Bereich zurückgeführt. Simulatoren für den Unterricht behandeln diesen Fall unterschiedlich. Solange der Akkumulator eines Programms zwischen 0 und 999 bleibt, läuft es auf allen gleich.

Die Maschine kann Zahlen und Befehle nicht unterscheiden 🖖

Klick auf Daten als Befehle. Das Programm besteht aus LDA n und OUT und soll 105 einmal ausgeben. Beim Schreiben wurde HLT vergessen. Deshalb rückt PC zu Speicherfach 02 vor, in dem 105 liegt, und die Maschine holt diesen Wert wie jeden anderen Befehl: 105 bedeutet ADD 05, und Speicherfach 05 enthält 20. In der nächsten DAT-Zeile steht 902, also OUT. Die Maschine gibt 125 aus. Danach folgt 0, also HLT. Einem Speicherfach ist nicht anzusehen, ob es einen Befehl oder eine Zahl enthält. Zeigt PC darauf, wird sein Inhalt als Befehl behandelt; nennt LDA, ADD oder SUB seine Adresse, dient der Inhalt als Zahl. Der erste Befehl hat diese 105 als Zahl gelesen, der dritte hat sie ausgeführt. Das ist das Prinzip des gespeicherten Programms, das im Juni 1948 auf dem Manchester Baby erstmals umgesetzt wurde.

Für den nächsten Listeneintrag schreibt sich dieses Programm selbst um 🖖

Klick auf Liste aufsummieren und beobachte Speicherfach 00. Anfangs steht dort 517, also LDA 17. Dieser Befehl lädt die erste Zahl der Liste. Bei einem LMC-Befehl steckt die Adresse im Befehl selbst. Es gibt kein Register, aus dem er eine Adresse beziehen könnte. Deshalb lässt sich „das Speicherfach nach dem gerade gelesenen“ nicht direkt ansprechen. Mit LDA 17, ADD 18, ADD 19 und so weiter lässt sich diese Liste aufsummieren, aber keine längere. Soll eine einzige Schleife für jede angegebene Listenlänge funktionieren, lädt das Programm seinen eigenen ersten Befehl als Zahl, addiert 1 und speichert ihn wieder an derselben Stelle. Aus 517 wird 518, also LDA 18. In 5 Durchläufen wird Speicherfach 00 insgesamt 5-mal beschrieben. Die letzte Fassung, LDA 22, wird nie ausgeführt, weil der Zähler vorher 0 erreicht. Genau dafür können reale Prozessoren eine Adresse aus einem Register beziehen. So lässt sich eine Liste durchlaufen, ohne das Programm selbst zu verändern.

Die meisten Lesezugriffe gelten dem eigenen Programm 🖖

Bevor ein Befehl etwas bewirken kann, muss die Maschine ihn aus einem Speicherfach holen. LDA, ADD und SUB lesen danach ein weiteres Fach, STA beschreibt eines. Sprungbefehle, INP und OUT brauchen keinen weiteren Speicherzugriff. Im Beispiel Durch Addition malnehmen erfordert 6 × 7 daher 65 Befehlsabrufe, 30 Lesezugriffe auf Operanden und 16 Schreibzugriffe. Bei 58,6 % aller Zugriffe zwischen Prozessor und Speicher holt die Maschine also ihre Befehle. Für alle Eingabepaare mit einem Produkt von höchstens 999 liegt dieser Anteil zwischen 57,2 % und 69,2 %. Programm und Daten gelangen nacheinander über denselben Weg zum selben Speicher. John Backus bezeichnete diesen Weg in seinem Vortrag zum Turing Award 1977 als Von-Neumann-Flaschenhals.

Aufgabe vollständig gelöst

  1. Warum 2 × 99 insgesamt 801 Befehle braucht und 99 × 2 nur 25 4 Schritte

    Klick auf 2 × 99, langsam und ändere dann die Eingaben auf 99, 2. Beide Durchläufe geben 198 aus. Zähle die ausgeführten Anweisungen für jeden Durchlauf und finde die Formel dafür. Wie viele Anweisungen braucht das Programm bei der ungünstigsten Reihenfolge, wenn das Produkt noch in ein Postfach passt?

    Öffne diese Aufgabe im Tool

    1. Vor der Schleife stehen 2 INP- und 2 STA-Befehle: insgesamt 4 Befehle. Der Schleifenrumpf führt LDA b, BRZ, SUB one, STA b, LDA total, ADD a, STA total und BRA loop aus. Das sind 8 Befehle, wiederholt so oft, wie der Anfangswert von b angibt.

    2. Sobald b den Wert 0 erreicht, führt die Schleife nur noch LDA b und BRZ aus. Danach beenden LDA total, OUT und HLT den Lauf: 5 weitere Befehle. Insgesamt braucht ein Lauf also 4 + 8b + 5 = 8b + 9 Befehle. Der Wert von a kommt in der Formel gar nicht vor.

    3. Für b = 99 ergibt das 8 × 99 + 9 = 801; für b = 2 sind es 25. Die Ergebnistabelle zeigt 801 für die erste Reihenfolge und 25 für die zweite.

    4. Das größte Produkt, das in ein Speicherfach passt, ist 999. Gibst du 1 und 999 ein, läuft die Schleife 999-mal: insgesamt 8.001 Befehle. Bei 999 und 1 läuft sie einmal: 17 Befehle.

    Antwort

    8b + 9 Befehle, wobei b die zweite Eingabe ist. Für dasselbe Produkt 999 braucht die eine Reihenfolge 8.001 Befehle, die andere 17, also etwa 470-mal so viele. Vergleicht ein Programm zuerst die Eingaben und verwendet den kleineren Faktor als Schleifenzähler, braucht es höchstens 8 × 31 + 9 Befehle zuzüglich des Vergleichs. Denn bei einem Produkt von höchstens 999 ist der kleinere Faktor höchstens 31.

Lernpfad

Wie ein Computer ein Programm ausführt

Quellen (4)