Appearance
Befehlssatz
Der Befehlssatz ist die komplette Sammlung von Befehlen, welche ein Prozessor versteht und ausführen kann. Im Folgenden werden einige typische Befehle betrachtet.
Ein Befehl wird im Computer als binäre Zahl dargestellt. Ein Befehl besteht aus der Nummer des Befehls und der Adresse der Speicherzelle, auf welche sich der Befehl bezieht.
Die folgende Tabelle zeigt den Befehlssatz des Little Man Computers:
| Code | Name | Beschreibung |
|---|---|---|
| 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 ihn in den Akkumulator |
| 902 | OUT | Gibt den Wert im Akkumulator aus |
| 922 | OTC | Gibt den Wert im Akkumulator als ASCII-Zeichen aus |
LDA: Akkumulator Laden (Load Accumulator)
Mit diesem Befehl wird ein Wert aus dem Speicher in den Akkumulator des Rechenwerks geladen. Dazu wird der Inhalt des Adressregisters auf den Adressbus ausgegeben, um im Speicherwerk die gewünschte Speicherzelle auszuwählen. Der Inhalt dieser Speicherzelle wird via Datenbus in den Akkumulator kopiert.
STA: Akkumulator Speichern (Store Accumulator)
Mit diesem Befehl wird der Wert im Akkumulator in den Speicher gespeichert. Dazu wird der Inhalt des Adressregisters auf den Adressbus ausgegeben, um im Speicherwerk die gewünschte Speicherzelle auszuwählen. Der Inhalt des Akkumulators wird via Datenbus in diese Speicherzelle kopiert.
INP: Eingabe (Input)
Dieser Befehl liest einen Wert von einem Eingabegerät in den Akkumulator ein. Der Inhalt des Adressregisters wird auf den Adressbus ausgegeben, um das gewünschte Gerät auszuwählen. Das Ein-/Ausgabewerk empfängt den Wert vom ausgewählten Gerät und kopiert ihn via Datenbus in den Akkumulator.
OUT: Ausgabe (Output)
Dieser Befehl gibt den Wert des Akkumulators an ein externes Gerät aus. Der Inhalt des Adressregisters wird auf den Adressbus ausgegeben, um das gewünschte Ausgabegerät auszuwählen. Der Inhalt des Akkumulators wird via Datenbus an das Ein-/Ausgabewerk übermittelt, welches den Wert an das ausgewählte Gerät weiterleitet.
ADD: Addieren
Mit diesem Befehl werden zwei Zahlen addiert. Dazu wird der Inhalt des Adressregisters auf den Adressbus ausgegeben, um im Speicherwerk die gewünschte Speicherzelle auszuwählen. Der Inhalt dieser Speicherzelle wird via Datenbus an die Arithmetisch-logische Einheit (ALU) im Rechenwerk weitergeleitet. Dieser addiert den Wert zum Wert, der sich bereits im Akkumulator befindet. Das Resultat wird im Akkumulator gespeichert.
SUB: Subtrahieren
Dieser Befehl funktioniert analog zum Befehl «Addieren». Allerdings wird der Wert aus der Speicherzelle vom Wert im Akkumulator subtrahiert.
BRA: Programmzähler setzen (Branch)
Dieser Befehl überträgt den Inhalt des Adressregisters in den Programmzähler. Damit kann der Ablauf des Programms beeinflusst werden. Indem der Programmzähler auf einen kleineren Wert gesetzt wird, können Befehle wiederholt ausgeführt werden.
BRZ: Programmzähler setzen falls Null (Branch if Zero)
Dieser Befehl überträgt den Inhalt des Adressregisters in den Programmzähler, falls der Akkumulator den Wert Null enthält.
BRP: Programmzähler setzen falls Positiv (Branch if Positive)
Dieser Befehl überträgt den Inhalt des Adressregisters in den Programmzähler, falls der Akkumulator Null oder eine positive Zahl enthält.
HLT: Programm beenden (Halt)
Dieser Befehl beendet die Ausführung des Programms. Damit wird verhindert, dass Daten, welche im Speicherwerk nach den Befehlen abgelegt sind, fälschlicherweise als Befehl interpretiert und ausgeführt werden.
In echten Rechnerarchitekturen werden anstelle dieses Befehls Return-Befehle (RET) verwendet, welche die Programmkontrolle an ein anderes Programm (z.B. das Betriebssystem) übergeben.
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.
Öffnen Sie den Little Man Computer
Geben Sie die folgenden Werte in den Speicher ein:
Adresse 0 1 2 3 4 5 Wert 901 310 901 110 902 000 Klicken Sie auf Run und beobachten Sie, was passiert.
Erkennen Sie den Von-Neumann-Zyklus?
Bei welchen Befehlen werden nicht alle Schritte des Zyklus ausgeführt?
Beispielprogramme
Zwei Zahlen addieren
Das folgende Programm liest zwei Zahlen ein, addiert sie und gibt das Resultat aus.
| # | Befehl | Assembler | Was geschieht |
|---|---|---|---|
| 0 | 901 | INP | Eingabe → Akkumulator |
| 1 | 306 | STA 6 | Akkumulator → Speicherzelle 6 |
| 2 | 901 | INP | Eingabe → Akkumulator |
| 3 | 106 | ADD 6 | Akkumulator + Speicherzelle 6 → Akkumulator |
| 4 | 902 | OUT | Akkumulator → Ausgabe |
| 5 | 000 | HLT | Programm beenden |
| 6 | 000 | DAT 0 | Speicherplatz für ersten Wert |
Damit der erste eingelesene Wert nicht überschrieben wird, muss er zunächst im Speicher abgelegt werden. Dazu wird die Speicherzelle 6 verwendet. Sie ist die erste noch freie Speicherzelle nach dem HLT-Befehl. Nachdem der zweite Wert eingelesen wurde, wird der Wert aus der Speicherzelle 6 addiert und das Resultat ausgegeben.
Das Programm entspricht in etwa dem folgenden Python-Programm:
python
a = input("Zahl A")
b = input("Zahl B")
c = a + b
print(c)Zahlenraten
Das folgende Programm ist ein einfaches Computerspiel. Der Benutzer wird so lange nach einer Zahl gefragt, bis er die richtige Zahl erraten hat.
| # | Befehl | Assembler | Was geschieht |
|---|---|---|---|
| 0 | 901 | INP | Eingabe → Akkumulator |
| 1 | 207 | SUB 07 | Akkumulator - Speicherzelle 07 → Akkumulator |
| 2 | 704 | BRZ 04 | falls Akkumulator = 0: 4 → Programmzähler |
| 3 | 600 | BRA 00 | 0 → Programmzähler |
| 4 | 507 | LDA 07 | Speicherzelle 07 → Akkumulator |
| 5 | 902 | OUT | Akkumulator → Ausgabe |
| 6 | 000 | HLT | Programm beenden |
| 7 | 032 | DAT 32 | zu erratender Wert |
python
a = 0
zahl = 32
while not a == zahl:
a = int(input("Zahl erraten: "))
print("Richtig, die zu erratende Zahl war ", zahl)