|
Pseudobefehle (Assembler-Direktiven)
Pseudobefehle erzeugen keine Maschinenbefehle sondern
- erzeugen Konstante (bytes, words, longwords, strings)
- beeinflußen den Adresspegel
- führen zu Adressbucheinträgen
- steuern den Übersetzungsvorgang
Der Assembler führt einen Zähler, der Auskunft über den aktuellenAdreßpegel gibt. Dieser 'Location Counter' dient beispielsweise zum Berechnernvon Sprungadressen. Die Pseudobefehle werden im OP-Code-Feld einer Assemblerzeileangegeben. Unser Assembler kennt folgende Direktiven:
ORG | Origin Der Location Counter wird auf die im Operandenfeld angegebene Adresse gesetzt, z. B.: ORG$8000 | EQU | Equate Definition eines Namens (Konstante, Marke). Der im Operandenfeld angegebene Wert wird dem im Markenfeld angegebenen Namen gleichgesetzt, z. B.: ETXEQU3 CR EQU$D LF EQU $A
PUFL EQU $100
|
DC.B |
Define Constant Byte
Reservierung von Speicherplatz und Belegung mit den
im Operandenfeld angegebenen konstanten Byte-Werten. Mehrere
Operanden durch Komma trennen! Z. B.:
TAB DC.B $0D,$0A,$03
Neben einfachen Konstanten sind in (einfache oder doppelte) Hochkomma
eingeschlossene Zeichenketten möglich. Die Hochkommas gehören
dabei nicht zur Zeichenkette. In den Zeichenketten sind folgende
Sonderzeichen erlaubt:
- \a Bell ($07)
- \f Formfeed ($0C)
- \n Newline ($0A)
- \r Carriage Return ($0D)
- \t Tabulator ($09)
- \\ \
Z. B.:
TEXT DC.B "Hello World!\n\r"
|
DC.W |
Define Constant Word
Reservierung von Speicherplatz und Belegung mit den
im Operandenfeld angegebenen konstanten 16-Bit-Werten. Mehrere
Operanden durch Komma trennen, z. B.:
ATAB DC.W $FF30,$FF45,$FFA0
|
DC.L |
Define Constant Longword
Reservierung von Speicherplatz und Belegung mit den
im Operandenfeld angegebenen konstanten 32-Bit-Werten. Mehrere
Operanden durch Komma trennen, z. B.:
XTAB DC.L $FF30FF45,$F000FFA0
|
DS.B DS.W DS.L |
Define Storage Bytes/Words/Longwords
Reservieren von Speicherbytes, Speicherworten (16 Bit) oder Langworten (32 Bit)
ohne Vorbelegung. Der Operand gibt die Anzahl der zu reservierenden Bytes an,
z. B.:
PUFFER DS.B 100
ADRTAB DS.W 23
|
INCLUDE |
Einfügen einer Quelldatei an der entsprechenden Stelle. Der Dateiname
wird entweder in < ... > (voreingestelltes Include-Verzeichnis)
oder " ... " (beliebiger Dateipfad) eingeschlossen, z. B.:
INCLUDE "definitionen.a"
INCLUDE <HC11.h>
|
NOLIST |
Unterdrücken der Erzeugung eines Programmlistings bis zum
nächsten LIST-Befehl.
|
LIST |
Fortsetzen des Listings nach einem voher pazierten NOLIST-Befehl.
|
END |
Ende des Assemblerprogramms. Optionaler Befehl am Programmende.
Wird aus Gründen der Kompatibilität vom Assembler akzeptiert,
kann aber weggelassen werden.
|
Anmerkung: Da bei einem Microcontroller zwischen ROM bzw. EEPROM-Speicher und RAM
unterschieden werden muß, ist auch die Reservierung von Speicher von dieser
Unterscheidung betroffen. Mit DC.B; DC.W oder DC.L vordefinierte Konstante liegen
im ROM/EEPROM-Bereich, Mit DS.B, DS.W oder DS.L reservierter Speicher im RAM-Bereich.
Grundsätzlicher Aufbau eines 68HC11-Assemblerprogramms
1. Konstantendefinitionen
Hier werden alle Definitionen für Werte und Adressen (EQU-Anweisung) vorgenommen.
Diese "Namensdefinitionen" belegen keinen Speicherplatz, sondern dienen
nur der besseren Lesbarkeit und Wartbarkeit des Programms. Zum Beispiel:
STACK EQU $7FFF Stackbereich
PROG EQU $8000 Programmbereich
DATA EQU $2000 Datenbereich (auch Adr. 0 möglich)
TVECT EQU $FFE0 Trace-Vektor
RVECT EQU $FFFE Reset-Vektor
SCCR1 EQU $102C
SCCR2 EQU $102D
CR EQU 13 Carriage-Return-Zeichen
LF EQU 10 Linefeed-Zeichen
ETX EQU 3 Textende
MAXDATA EQU 100
Wichtig sind die ersten fünf Zeilen, die bei keinem Programm fehlen dürfen.
Sie legen die Adressbereiche für RAM und EEPROM fest und definieren die Adressen
der beiden Vektoren, die immer gesetzt werden müssen.
2. Variablendefinitionen
Hier werden alle Daten definiert, die Speicherplatz belegen. Es ist ratsam, den
Datenbereich durch eine eigene ORG-Anweisung einzuleiten, um die Daten an definierter
Stelle im Speicher abzulegen. Bei einem Steuerungsrechner muß auf jeden Fall
in Datenbereich (RAM) und Programmbereich (PROM) unterschieden werden. Man kann
die Variablen auch nach dem Programmcode ablegen. Zum Beispiel:
ORG DATA Datenbereich z.B. ab Adresse $2000
COUNT DC.B 0 Wert mit Null vorbelegen
PUFFER DS.B 80 80 Byte Pufferbereich reservieren
TEXT DC.B 'Hello World' Text, abgeschlossen durch Zeilen-
DC.B CR, LF, ETX wechsel und Nullbyte
3. Programmbereich
Nun folgt das eigentliche Progamm. Es wird immer mit einer ORG-Anweisung an eine
definierte Adresse gelegt. Diese Adresse ist auch Startadresse des Programms.
Achtung: Der Assembler kümmert sich nicht um die Adreßlage des Programms,
auch Überlappungen mit dem Datenbereich werden nicht als Fehler gemeldet
aufpassen.
Es gibt zwei Möglichkeiten der Anordnung von Haupt- und Unterprogrammen. Üblich
ist es, das Hauptprogramm am Anfang zu postieren und dann die Unterprogramme folgen
zu lassen. Wer lieber die UP zuerst stehen hat, muß das HP mit einer Marke
versehen (z. B. "MAIN") und nach der ORG-Anweisung als erste Anweisung
einen Sprung zum HP eintragen, z. B.:
....... Definitionen (1. und 2.)
ORG PROG Programmbereich, z. B. $8000
JMP MAIN
....... Unterprogramme
MAIN LDS #STACK Stackpointer setzen, sonst geht nichts
.
.
.
.
ORG TVECT
DC.W $00D3 Trace-Vektor setzen (Enwicklungssystem
kann sonst keinen Trace
ORG RVECT
DC.W MAIN Reset-Vektor auf Programmanfang setzen
.
. ggf. weitere Vektoren setzen
. (z. B. INT)
.
END
|
|
|