Sprachdefinition

Das für den 8051-Microcontroller verwendete Assemblersprache setzt sich aus Befehlen und Direktiven zusammen. Die Befehle werden vom Assembler in Maschinencode übersetzt. Die Direktiven werden vom Assembler interpretiert und steuern die Code-Erstellung.
Assembler-Direktiven beginnen mit einem Punkt ".". Der 8051-Emulator besitzt zusätzlich einige spezielle Emulator-Direktiven, die vom echten Assembler nicht unterstützt werden und der Emulation des 8051 dienen. Diese Direktiven beginnen mit einem Dollar-Zeichen ";$". Das heißt, daß die Befehle vom echten Assembler als Kommentar angesehen werden (da sie mit einem ";" beginnen). Assembler-Befehle besitzen im Gegensatz zu den Direktiven keinerlei Namensprefix. Alle Zeichen, die in einer Zeile hinter einem Semikolon ";" stehen, werden als Kommentar gedeutet.

Emulator-Direktiven

;$LoadRAM Datei

Diese Direktive weist den Emulator an, vor dem Start des Programmes, den RAM-Inhalt aus Datei einzulesen. Damit können bestimmte Variablen in definierte Ausgangszustände versetzt werden.

;$ClearRAM

Löscht den Inhalt des gesamtes RAMs vor dem Programmstart, d.h. an allen Speicherstellen steht 0. Diese Direktive wird (unabhängig von ihrer Position in der Quellcodedatei) stets vor den Direktiven zum Laden von Variablen oder zum Setzen von Variablen ausgeführt.

;$LoadVar addr,value

Schreibt vor dem Programmstart an Speicheradresse addr die Zahl value.

;$Protect addr

Die Steuersoftware des echte 8051-Controllers kann zum Absturz gebracht werden, indem Speicherstellen überschrieben werden, die von der Steuersoftware verwendet werden. Der Emulator kann selbstverständlich nicht abstürzen, um aber bei dem Testen auf dem Emulator diese Besonderheit des echten Controllers berücksichtigen zu können, können mit dieser Direktive bestimmte Speicherstellen geschützt werden. Versucht der emulierte Prozessor schreibend auf diese Speicherstelle zuzugreifen, so erscheint eine Warnmeldung.

;$Protect deafult

Durch diese Direktive werden alle Speicherstellen, die vom Monitorprogramm verwendet werden, geschützt, d.h. es erscheint eine Warnung bei Schreibzugriffen auf diese Variablen. Folgende Speicherbereiche werden durch diese Direktive geschützt: 0x18 bis 0x1f, 0x20 bis 0x21, 0x6c bis 0x79, 0x59 und 0x90 bis 0x92. Diese selbe Schutzoption läßt sich auch über den Konfigurationsdialog aktivieren.

;$Protect nodeafult

Ist die Funktion zum Speicherschutz über den Konfigurationsdialog aktiviert und soll aber deaktiviert werden, so ist dies über diese Direktive möglich.

$Speedtest Takte

Dient zum Testen der Geschwindigkeit des Emulators. Als Takte muß die Zahl der Takte angegeben werden, die der echte Prozessor für das Programm benötigen würde. Wird das Programm nun über "Ausführen|Start" (also nicht im Einzelschrittmodus) ausgeführt, so zeigt der Emulator nach dem Programmende die Hertz-Zahl an, mit der der virtuelle 8051 lief.

Assembler-Direktiven

.end

Deutet das Ende der Datei an. Alle Zeilen nach dieser Direktive werden vom Assembler ignoriert.

.org addr

Legt die Speicheradresse fest, an der der nächste Befehl liegen soll. Liegt diese Direktive vor dem ersten Assemblerbefehl, so legt sie die gleichzeitig die Startadresse fest. Befindet sich diese Direktive zwischen zwei Assemblerbefehlen, so wird die entstehende Lücke mit nop-Begehlen aufgefüllt.

.equ name,value

Diese Direktive weist den Assembler an, überall im Programmcode, wo name auftritt value einzusetzen. Auf diese weise lassen sich praktisch Variablen definieren.

:name

Definiert eine Sprungmarke. Taucht im Assemblercode der Befehl ljmp name auf, so wird name vom Assembler durch die Adresse des Befehls direkt nach der Direktive ersetzt.

.word value, value, ...

Schreibt an die aktuelle Codespeicherstelle die angegeben Word-Werte.

.byte value, value, ...

Schreibt an die aktuelle Codespeicherstelle die angegeben Byte-Werte.

Assembler-Befehle

Die Befehle mit ihren Bedeutungen und ihren Opcodes sind auf der Seite Opcodes beschrieben.