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.