Maschinenbefehl: Aufbau und Ausführung erklärt
Du lernst, wie ein Prozessor Befehle ausführt, wie du ihre Teile erkennst und wie Befehle gespeicherte Werte verändern.
Kurz gesagt
Ein Maschinenbefehl ist eine Anweisung in einem Zahlencode, die ein passender Prozessor direkt ausführen kann. Er legt fest, was der Prozessor tun soll, etwa einen Wert kopieren oder zwei Werte addieren.
Ein Programm kann aus vielen kleinen Befehlen bestehen. An einer Addition verfolgst du, wo Werte gespeichert werden und welcher Befehl sie ändert. Danach vergleichst du eine gut lesbare Programmiersprache mit der Darstellung für den Prozessor.
Deine Lernziele
Ein Prozessor ist die Recheneinheit eines Computers. Er wird auch CPU genannt. Das Kürzel kommt von „Central Processing Unit“, auf Deutsch „zentrale Verarbeitungseinheit“. Ein Maschinenbefehl gibt ihm eine einzelne Anweisung in einem Zahlencode.
Die Menge der Befehle, die ein Prozessor versteht, heißt Befehlssatz. Ein Maschinenprogramm besteht aus solchen codierten Befehlen. Seine Zahlencodes heißen zusammen Maschinencode. Dieser muss zur CPU passen. Untereinander kompatible CPUs verstehen die dafür benötigten Befehle und können denselben passenden Maschinencode ausführen.
In unserem einfachen Modell liegen die Befehle im Hauptspeicher, dem Arbeitsspeicher des Computers. Die CPU liest einen Befehl, erkennt die angegebene Tätigkeit und führt sie aus. In den hier betrachteten Befehlsfolgen kommt danach der nächste Befehl an die Reihe. Werte kann die CPU dabei in Registern speichern. Ein Register ist ein Speicherplatz innerhalb der CPU.
Maschinenbefehl
Ein Maschinenbefehl ist eine durch Zahlen dargestellte Einzelanweisung aus dem Befehlssatz einer CPU.
Merke: Ein Befehl beschreibt eine Tätigkeit. Ein Register ist dagegen ein Speicherplatz für Werte. Der Befehlssatz umfasst die Befehle, die eine CPU versteht.
Teste dich
Der Opcode, kurz für Operationscode, ist der Zahlencode für die auszuführende Tätigkeit. Operanden geben an, mit welchen Werten oder Speicherorten ein Befehl arbeitet. Ein Operand kann beispielsweise ein Register, eine Speicheradresse oder ein direkt angegebener Zahlenwert sein. Eine Speicheradresse ist die Nummer eines Speicherplatzes.
In lesbarer Assemblerschreibweise siehst du einen Befehlsnamen wie „mov“. Dieser Name heißt Mnemonik. „mov“ bedeutet in unseren Beispielen: Kopiere den Wert der Quelle ins Ziel. Bei „mov ecx, 5“ bezeichnet ecx das Zielregister ECX. Der zweite Operand ist der direkt angegebene Zahlenwert 5, keine Speicheradresse. Der lesbare Name „mov“ ist nicht der Opcode als Zahl. Bei x86, einer Prozessorfamilie, kann der genaue Opcode auch von der Art der Operanden abhängen.
Bonsai ist ein vereinfachtes Rechnermodell zum Lernen. Dort ist „inc“ der lesbare Name eines Befehls mit dem Opcode 1. An den Opcode wird eine vierstellige Speicheradresse angehängt. Fehlende Stellen werden vorne mit Nullen ergänzt. Diese Zahlenschreibweise gilt für das Bonsai-Modell; sie beschreibt kein allgemeines Befehlsformat für CPUs.
Opcode
Der Opcode ist der Zahlencode, der die auszuführende Tätigkeit festlegt. Ein lesbarer Befehlsname wie „mov“ ist eine andere Darstellung.
Operand
Ein Operand bezeichnet einen Wert oder einen Speicherort, mit dem der Befehl arbeitet.
Beispiel: Einen Bonsai-Befehl zerlegen (ausgedachtes Beispiel)
- 1inc 24 → 10024 im Bonsai-Modell.
- 2Die führende Ziffer 1 ist der Opcode.
- 3Der vierstellige Adressteil 0024 bezeichnet den Speicherplatz mit der Nummer 24.
- 4Die Zahlencodierung gehört zu diesem Lernmodell.
Teste dich
In der Schreibweise „c = a + b“ bedeutet „+“ Addition. Das Zeichen „=“ steht hier für eine Zuweisung: Die Summe wird als neuer Wert von c gespeichert. In unserem Modell sind die Variablen a, b und c benannte Plätze im Hauptspeicher. EAX und ECX sind zwei Register. In den Befehlszeilen schreiben wir ihre Namen als eax und ecx.
Wir verwenden ein Lehrmodell nach dem Vorbild der x86-Assemblerschreibweise. Die Zeilen zeigen die Befehlswirkung, bilden aber kein vollständiges ausführbares Programm. Wir setzen voraus, dass die Speicherplätze passende Größen haben und alle verwendeten Werte und Ergebnisse darin Platz finden.
Bei unseren Befehlen steht das Ziel vor dem Komma und die Quelle danach. „mov ziel, quelle“ kopiert den Quellwert ins Ziel. Der Quellwert bleibt erhalten. „add ziel, quelle“ addiert die beiden bisherigen Werte und schreibt die Summe ins Ziel. Bei den hier verwendeten verschiedenen Registern bleibt die Quelle dabei unverändert. Die Befehle wirken nacheinander auf den jeweils aktuellen Zustand.
Für das ausgedachte Tabellenbeispiel gilt anfangs: a enthält 11, b enthält 8 und c enthält 6. EAX und ECX enthalten jeweils 0. Die Variablen a und b bleiben während der gesamten Folge unverändert.
| Befehl | Register danach | Variable c danach |
|---|---|---|
| Anfangszustand | EAX: 0; ECX: 0 | 6 |
| mov eax, a | EAX: 11; ECX: 0 | 6 |
| mov ecx, b | EAX: 11; ECX: 8 | 6 |
| add eax, ecx | EAX: 19; ECX: 8 | 6 |
| mov c, eax | EAX: 19; ECX: 8 | 19 |
Merke: „add eax, ecx“ schreibt die Summe nach EAX. In dieser Folge erhält c die Summe erst durch „mov c, eax“.
Teste dich
Eine Hochsprache ist eine Programmiersprache, in der du beispielsweise Rechnungen mit Variablen als zusammenhängende Ausdrücke beschreiben kannst. C ist eine solche Sprache. Die C-Anweisung „c = a + b;“ beschreibt die Addition und die Zuweisung an c. Im Lehrmodell des vorigen Abschnitts haben wir dafür mehrere einzelne Befehle verwendet.
Assemblersprache verwendet lesbare Namen wie „mov“ und „add“ zusammen mit Operanden. Sie ist eng an den Befehlssatz einer CPU gebunden. Maschinencode enthält dagegen die Zahlencodes der Befehle für eine passende CPU. Die Bonsai-Zahlencodierung aus dem zweiten Abschnitt ist ein eigenes Modellformat und keine Codierung unserer x86-nahen Befehlsfolge.
Ein Assemblierer ist ein Übersetzungsprogramm: Er übersetzt Assemblersprache in Maschinencode. Ein Compiler ist ebenfalls ein Übersetzungsprogramm. Ein möglicher Übersetzungsweg führt mit einem Compiler von einem C-Programm zu Maschinencode. Der Übersetzungsweg und die entstehenden Befehle hängen von der Sprache, den verwendeten Programmen und der Ziel-CPU ab. Unsere Lehrfolge ist deshalb keine behauptete Ausgabe eines bestimmten Compilers.
Übersetzen und Ausführen sind verschiedene Schritte. Der Übersetzer erzeugt eine andere Darstellung des Programms. Die CPU führt die passenden codierten Befehle aus.
| Darstellung | Woran du sie hier erkennst |
|---|---|
| Hochsprache | Rechenausdrücke und Zuweisungen mit Variablen. |
| Assemblersprache | Lesbare Befehlsnamen mit Operanden. |
| Maschinencode | Zahlencodes der Befehle für eine passende CPU. |
Merke: Eine Hochsprachenanweisung kann durch mehrere Maschinenbefehle umgesetzt werden. Die gezeigte Lehrfolge legt keine feste Übersetzung für jede CPU fest.
Teste dich
Alles auf einen Blick
Maschinenbefehl
Ein Maschinenbefehl ist eine codierte Einzelanweisung und muss zur CPU passen.
Der Opcode legt die Tätigkeit fest; vorhandene Operanden nennen Werte oder Speicherorte.
Eine Mnemonik wie mov ist ein lesbarer Name. Bei x86 kann der genaue Opcode auch von den Operanden abhängen.
mov kopiert im Lehrmodell den Quellwert ins Ziel und erhält den Quellwert.
In der gezeigten Folge schreibt add die Summe nach EAX. Erst mov c, eax schreibt sie nach c.
Hochsprache beschreibt Rechnungen mit Ausdrücken, Assemblersprache nutzt lesbare Befehle und Maschinencode enthält passende Zahlencodes.
Eine Summe mit Registerbefehlen berechnen (ausgedachtes Beispiel)
- 1Im Lehrmodell soll c die Summe aus a und b erhalten. Anfangs enthält a den Wert 18, b den Wert 7 und c den Wert 4. EAX und ECX enthalten jeweils 0.
- 2mov eax, a → EAX enthält 18; a bleibt bei 18.
- 3mov ecx, b → ECX enthält 7; b bleibt bei 7.
- 4add eax, ecx → EAX enthält die Summe 25. ECX bleibt bei 7 und c bleibt bei 4.
- 5mov c, eax → c enthält 25. EAX enthält weiterhin 25; a bleibt bei 18 und b bei 7.
Fehler finden
Fehler in Zeile 4Die Addition hat EAX als Ziel und schreibt noch nichts nach c. Richtig: Nach add eax, ecx enthält EAX den Wert 21; c bleibt bei 4. Erst mov c, eax kopiert 21 nach c.
Lückentext
Beim ausgedachten Bonsai-Zahlencode 10048 besteht die Adresse aus den letzten vier Stellen; der Adressteil lautet . In einem ausgedachten Fall enthält a vor „mov eax, a“ den Wert 4 und EAX den Wert 9; nach dem Kopieren enthält a weiterhin . In einem weiteren Fall enthält EAX vor „add eax, ecx“ den Wert 6 und ECX den Wert 11; danach enthält EAX .