Benutzer-Werkzeuge

Webseiten-Werkzeuge


rechner:assembler:start

Dies ist eine alte Version des Dokuments!


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 ArbeitsspeicherBedeutung
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 mitBedeutung
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.

Sprungmarken statt Speicheradressen

Es ist müßig, die Zieladressen der Sprungbefehle jeweils "von Hand" zu ermitteln. Daher nutzen wir im folgenden Sprungmarken, deren Bezeichner wir uns frei ausdenken dürfen. Der Assembler bestimmt beim Übersetzen des Programms dann automatisch die korrekte Zieladresse.

Beispiel:

    LOADI 0
s1: ADDI 1
    CMP 100
    JLT s1
    HOLD
rechner/assembler/start.1762630907.txt.gz · Zuletzt geändert: von Martin Pabst

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki