Der Little Man Computer (LMC) ist ein Rechnermodell, welches 1965 zum besseren Verständnis der Von-Neumann-Architektur entwickelt wurde.
Unter dem folgenden Link ist eine LMC-Simulation verfügbar:
Aufbau
Der LMC hat einen Speicher mit 100 Speicherstellen, welche je eine natürliche Zahl zwischen 0 und 999 enthalten.
Der LMC hat folgende Register:
- Der Programmzähler (Program Counter) enthält eine Zahl zwischen 0 und 99. Er gibt an, in welcher Speicheradresse der nächste Befehl liegt.
- Im Akkumulator (Accumulator) ist der erste Operand sowie das Resultat der Rechenoperationen gespeichert.
- Im Befehls- und Adressregister (Instruction Register und Address Register) wird der Inhalt des aktuellen Befehls abgelegt.
Einagbe: Im Bereich Input kann der Benutzer eine Zahl eingeben.
Ausgabe: Im Bereich Output werden die letzten Ausgaben aufgelistet.

Funktionsweise
Der LMC führt Befehle gemäss dem Von-Neumann-Zyklus aus:
- Fetch: Der Progammzähler gibt vor, welche Speicherstelle gelesen wird. Der Inhalt dieser Speicherstelle wird in die CPU transportiert.
- Decode: Die erste Ziffer des Befehls wird in das Befehlsregister, die zwei weiteren Ziffern in das Adressregister kopiert.
- Execute: Der entprechende Befehl wird ausgeführt.
Befehlssatz
| Code | Name | Description |
|---|---|---|
| 000 | HLT | Programm anhalten |
| 1xx | ADD | Addiert den Inhalt in der Speicherstelle xx zum Akkumulator |
| 2xx | SUB | Subtrahiert den Inhalt in der Speicherstelle xx vom Akkumulator |
| 3xx | STA | Überträgt den Inhalt des Akkumulators in die Speicherstelle xx |
| 5xx | LDA | Überträgt den Inhalt der Speicherstelle xx in den Akkumulator |
| 6xx | BRA | Setzt den Programmzähler auf den Wert xx |
| 7xx | BRZ | Setzt den Programmzähler auf den Wert xx falls der Akkumulator gleich Null ist |
| 8xx | BRP | Setzt den Programmzähler auf den Wert xx falls der Akkumulator nicht negativ ist |
| 901 | INP | Liest einen Wert vom Benutzer ein und überträgt in in den Akkumulator |
| 902 | OUT | Gibt den Wert im Akkumulator aus. |
| 922 | OTC | Gibt den Wert im Akkumulator aus als ASCII-Zeichen aus |
Aufgabe: Addition mit Maschinencode
Wir machen Schritt für Schritt ein Einstiegsbeispiel, in welchem zwei Zahlen addiert werden. Diese Zahlen werden vom Benutzer als Input eingegeben. Das Resultat wird als Output ausgegeben.
Öffne den Little Man Computer
Gib die folgenden Werte in den Speicher ein:
Adresse 0 1 2 3 4 5 Wert 901 310 901 110 902 000 Klicke auf Run und beobachte was passiert.
Erkennst du den Von-Neumann-Zyklus?
Bei welchen Befehlen werden nicht alle Schritte des Zyklus ausgeführt?
Assemblersprache
Beim vorhergehenden Beispiel wurden die Instruktionen direkt in die Speicherstellen eingegeben. Diese Art zu Programmieren ist aber sehr mühsam. Deshalb wurden Assemblersprachen entwickelt.
In einer Assemblersprache werden die Instruktionen durch Text dargestellt. Häufig wird eine Instruktion durch drei Buchstaben gekennzeichnet.
Mit einem Assembler wird dieser Programmcode in die eigentlichen Instruktionen übersetzt.
In LMC kann im linken Fenster Assemblercode geschrieben werden. Mit Assemble into RAM wird der Assemblercode in die Instruktionen übersetzt und in den Speicher übertragen.
Dabei wird jede Zeile des Assemblerprogramms in eine entsprechende dreistellige Zahl übersetzt und in die jeweils nächste Speicherstelle geschrieben.
Aufgabe: Addition mit Assembler
Klicke auf OPTIONS und wähle clear memory aus.
Klicke in das linke Textfeld.
Kopiere diesen Code in das Textfeld and klicke auf Submit:
asmINP STA 12 INP ADD 12 OUT HLTKlicke auf Assemble into RAM
Vergleiche den Inhalt des Speichers mit der ersten Aufgabe.
Was ist gleich, was ist anders?
Was ist die Bedeutung der Zahl 12?
Was passiert, wenn 12 durch 4 ersetzt wird?
Labels und Daten
Die explizite Verwendung von Speicheradressen ist umständlich und fehleranfällig. Deshalb kann in Assembler jede Speicherstelle mit einem Label versehen werden. Dazu wird vor dem Befehl ein beliebiges Wort aus ASCII-Buchstaben geschrieben. Dieses Label kann im Code anstelle einer Speicheradresse verwendet werden.
Zusätzlich gibt es den Pseudobefehl DAT, welche eine Speicherstelle für einen Datenwert reserviert.
Das folgende Beispiel zeigt nochsmals das Programm, welches zwei Zahlen addiert:
INP
STA zahl
INP
ADD zahl
OUT
HLT
zahl DAT 0Die Zeile zahl DAT 0 reserviert eine Speicherstelle für Daten und initialisiert sie mit dem Wert 0. Die Instruktionen STA und ADD verwenden das Label zahl anstelle der fixen Speicheradresse.
Daten müssen immer nach der HLT-Instruktion stehen. Ansonsten wird deren Inhalt während dem Programmablauf als Instruktion interpretiert und ausgeführt.
Aufgabe: Addition mit Label
- Gibt den oben stehenden Code ein und assembliere ihn.
- Führe das Programm aus.
- Welche Speicherstelle wird für die
zahlverwendet?