Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Maschinensprache (Assembler)
Wir lernen im Folgenden eine Programmiersprache, die sehr ähnlich ist zur Maschinensprache realer Prozessoren. Die Befehle dieser Sprache sind als Abfolge von Byte-Werten im Arbeitsspeicher des Rechners abgelegt. Jedem Befehl entspricht ein bestimmter Zahlencode ("Opcode"). Da es für uns Menschen recht mühselig ist, auswendigzulernen dass z.B. die Zahl 276 bedeutet "Lade den Wert der nachfolgenden Speicherstelle", schreiben wir Maschinensprachebefehle nicht als Zahl, sondern als sogenannte Mnemonics. Der Mnemonic für 276 ist beispielsweise "LOAD".
Wir brauchen dann einen Compiler, der die mit Mnemonics notierten Programme in die Zahlenfolgen übersetzt, die der Prozessor versteht. Solche Compiler nennt man Assembler. Die mithilfe von Mnemonics notierten Programme nennt man Assemblerprogramme, zu einer Assemblersprache sagt man umgangssprachlich auch kurz "Assembler".
Hier ein Beispielprogramm:
| Assemblerbefehl (Opcode mit Operanden) | Werte im Arbeitsspeicher | Bedeutung |
|---|---|---|
| LOAD 100 | 276 100 | Lade den Wert der Speicherzelle 100 in den Akkumulator |
| ADD 101 | 266 101 | Addiere den Wert der Speicherzelle 101 zum Akkumulator |
| STORE 102 | 277 102 | Schreibe eine Kopie des Akkumulatorwertes in die Speicherzelle 102 |
| HOLD | 99 | Stoppe den Prozessor |
Für die Zahldarstellung der Befehle werden wir uns im Folgenden nicht mehr interessieren.
⇒ Nicht auswendiglernen!
Die Minimaschine
Wir arbeiten im Folgenden mit einem Simulator einer Registermaschine, der Minimaschine.
Hier finden Sie den Downloadlink und auch die Dokumentation dazu.
Hier der Deeplink zur Dokumentation der Assemblersprache der Minimaschine.
Die wichtigsten Befehle
Nachfolgend eine Auswahl der für Sie wichtigsten Befehle der Minimaschine. Die gesamte Befehlsliste finden Sie hier.
Laden und Speichern
| Assemblerbefehl (Opcode mit Beispiel-Operanden) | Bedeutung |
|---|---|
| LOAD 100 | Lade den Wert der Speicherzelle 100 in den Akkumulator |
| LOADI 5 | Lädt den Wert 5 in den Akkumulator ("Load immediate") |
| STORE 102 | Schreibe eine Kopie des Akkumulatorwertes in die Speicherzelle 102 |
Arithmetische Befehle (2. Operand im Speicher)
| ADD 101 | Addiere den Wert der Speicherzelle 101 zum Akkumulator |
| SUB 101 | Subtrahiere den Wert der Speicherzelle 101 vom Akkumulator |
| MUL 101 | Multipliziere den Akkumulator mit dem Wert der Speicherzelle 101 |
| DIV 101 | Dividiere den Akkumulator durch den Wert der Speicherzelle 101 |
| MOD 101 | Berechne den Rest der Division des Akkumulators durch den Wert der Speicherzelle 101 und lege ihn dann im Akkumulator ab. |
Arithmetische Befehle (2. Operand "immediate")
| ADDI 12 | Addiere den Wert 12 zum Akkumulator |
| SUBI 12 | Subtrahiere den Wert 12 vom Akkumulator |
| MULI 12 | Multipliziere den Akkumulator mit dem Wert 12 |
| DIVI 12 | Dividiere den Akkumulator durch den Wert 12 |
| MODI 12 | Berechne den Rest der Division des Akkumulators durch den Wert 12 und lege ihn dann im Akkumulator ab. |
Logische Befehle (2. Operand im Speicher)
| AND 125 | Logische Und-Verknüpfung des Wertes im Akkumulator mit dem Wert der Speicherzelle 125 |
| OR 125 | Logische Oder-Verknüpfung des Wertes im Akkumulator mit dem Wert der Speicherzelle 125 |
| XOR 125 | Logische XOR-Verknüpfung des Wertes im Akkumulator mit dem Wert der Speicherzelle 125 |
| NOT | Bitweise logische Invertierung des Wertes im Akkumulator |
Logische Befehle (2. Operand "immediate")
| ANDI 12 | Logische Und-Verknüpfung des Wertes im Akkumulator mit dem Wert 12 |
| ORI 12 | Logische Oder-Verknüpfung des Wertes im Akkumulator mit dem Wert 12 |
| XORI 12 | Logische XOR-Verknüpfung des Wertes im Akkumulator mit dem Wert 12 |
Vergleichsbefehle
| CMP 125 | Vergleicht den Akkumulator mit dem Wert der Speicherzelle 125 und setzt Null- und Negativflag entsprechend |
| CMP 12 | Vergleicht den Akkumulator mit dem Wert 12 und setzt Null- und Negativflag entsprechend |
Sprungbefehle
| JMP Adresse | Springt immer zur Adresse ("unbedingter Sprungbefehl") |
| JEQ Adresse ("Jump if equal") | Springt zur Adresse, wenn das Z-Flag gesetzt ist, d.h. wenn das Ergebnis der letzten Operation 0 war bzw. wenn die letzten beiden mit CMP verglichenen Werte gleich waren. |
| JNE Adresse ("Jump if not equal") | Springt zur Adresse, wenn beim letzten Vergleich mit CMP der Wert des Akkumulators und der damit verglichene Wert nicht gleich waren. |
| JGT Adresse ("Jump if greater") | Springt zur Adresse, wenn das Ergebnis der letzen Operation positiv (> 0) war, d. h. weder N noch Z-Flag sind gesetzt bzw. wenn beim letzten Vergleich mit CMP der Wert im Akkumulator größer war als der damit verglichene Wert |
| JGE Adresse ("Jump if greater or equal") | Springt zur Adresse, wenn das Ergebnis der letzen Operation nicht negativ war, d. h. das N-Flag nicht gesetzt ist bzw. wenn beim letzten Vergleich mit CMP der Wert im Akkumulator größer oder gleich war als der damit verglichene Wert |
| JLT Adresse ("Jump if lower") | Springt zur Adresse, wenn das Ergebnis der letzen Operation negativ (< 0) war, d. h. das N-Flag ist gesetzt bzw. wenn beim letzten Vergleich mit CMP der Wert im Akkumulator kleiner war als der damit verglichene Wert |
| JLE Adresse ("Jump if lower or equal") | Springt zur Adresse, wenn das Ergebnis der letzen Operation nicht positiv war, d. h. das N-Flag oder das Z-Flag ist gesetzt bzw. wenn beim letzten Vergleich mit CMP der Wert im Akkumulator kleiner oder gleich war als der damit verglichene Wert |
Für die bedingten Sprungbefehle gibt es noch einen weiteren Satz von Mnemonics, deren Bedeutung direkt auf die maßgeblichen Flags im Statusregister abzielen. Sie sind aber beim Programmieren weniger intuitiv, z.B. sind folgende Befehle identisch:
| Befehl | …ist identisch mit | Bedeutung |
|---|---|---|
| JMPZ | JEQ | Jump if zero-flag is set |
| JMPN | JLT | Jump if negative-flag is set |
| JMPP | JGT | Jump if negative-flag is not set/"jump if positive" |
usw.
