Impressum
< Die Oberfläche des Assemblers Inhalt Fehlermeldungen des Assemblers >

Assemblerdirektiven

 
Das ausführbare Assemblerprogramm liegt meist als hex Datei vor. In dieser Datei ist lediglich der Inhalt des ROMs abgelegt und stellt eine Reihe von Befehlen und ggf. Daten dar.
Assemblerdirektiven sind weder Befehle noch Daten, welche im ROM auftauchen. Sie stellen vielmehr Kommandos für den Assembler selbst dar. Einige dienen dazu das Programmieren zu erleichtern, andere helfen bei der Ablage von Daten.

Direktiven für benannte Konstanten

Die DATA Direktive

Um Speicherzellen nicht nur über ihre Adresse ansperechen zu können, kann man Speicherzellen Namen geben. Dies geschieht mit DATA. Der Syntax lautet name DATA adresse.
P0 DATA 080h ; P0 = 80h SP DATA 081h ; SP=81h MEINER DATA 30h ; Meiner = 30h GEHEIM DATA 72h ; Geheim = 72h ... mov Meiner, P0 ; das gleiche wie: mov 30h, 80h mov A, #GEHEIM ; das gleiche wie: mov A, #72h mov SP,#015h ; das gleiche wie: mov 81h, #015h
Wie das obige Beispiel zeigt, kann man mit DATA definierte Konstanten sowohl als direkte Adresse, als auch als Wert verwenden, je nachdem ob man ein # voranstellt oder nicht.
Zusätzlich erhält man sogar noch eine gewisse Typüberprüfung, denn mit DATA definierte Werte können nicht als Bitadressen verwendet werden.

Die BIT Direktive

Da DATA nur für direkte Adressen funktioniert, nicht jedoch für Bit-Adressen kennt der Assembler hierfür eine weitere Direktive BIT mit dem Syntax name BIT bit-adresse.
Beispeile:
adr data 11h ; Datenadresse adr=11h an bit 22h.1 ; Bitadresse an=20h.1 = 11h mov adr, #adr ; korrekt => mov 11h, #11h mov an, #2 ; FEHLER an ist eine Bit-Adresse setb an ; korrekt => setb 20h.1 oder setb 11h (ist das Selbe) setb adr ; FEHLER zwar ist adr=11h aber es ist eine DATA und kein BIT setb 11h ; korrekt => setb 11h oder setb 20h.1

Die INCLUDE Direktive

Mittels Include datei kann eine externe Datei in das Assemblerprogramm eingebunden werden. Meist wird dies verwendet um eine Include-Datei einzubinden, in welcher für die Byte- und Bit-Adressen im SFR Namen definiert werden. Diese Dateien sehen z.B. wie folgt aus:
;BYTE Registers P0 DATA 080H DPL DATA 082H DPH DATA 083H TCON DATA 088H TMOD DATA 089H P1 DATA 090H P2 DATA 0A0H P3 DATA 0B0H ;BITRegisters ;PSW CY BIT PSW.7 AC BIT PSW.6 F0 BIT PSW.5 RS1 BIT PSW.4 RS0 BIT PSW.3 OV BIT PSW.2 F1 BIT PSW.1 P BIT PSW.0
Allerdings können auch andere Assemblerdateien mittels Include in das aktuelle Programm eingefügt werden. Angenommen es gibt eine Datei warte.a51 in welcher Unterprogramme wie wait1s definiert sind. So könnte ein Programm, dass P0 nach einer Sekunde auf 0 setzt und nach einer weiteren auf 0FFh wie folgt realisiert werden:
include reg8051.inc ; SFR-Registernamen ; einbinden z.B. für P0 loop: mov P0, #0 call wait1s mov P0, #0FFh call wait1s jmp loop include warte.a51 ; Code für Unterprogramm ; warte1s einbinden
Dieses Programm hat die gleiche Wirkung wie untenstehendes. Zu beachten ist, dass das Unterprogramm nach dem Hauptprogramm eingebunden werden muss, da sonst das Programm mit dem Code von warte1s beginnt.
include reg8051.inc ; SFR-Registernamen ; einbinden z.B. für P0 loop: mov P0, #0 call wait1s mov P0, #0FFh call wait1s jmp loop ; folgendes wird oben aus warte.a51 importiert warte1s: ; Code der Zeitschleife ret

Die ORG Direktive

Mittels ORG adr wird der Assembler gezwungen an einer bestimmten Stelle im ROM weiter zu schreiben. Dies ist z.B. bei Interrupts wichtig, da hier die Unterprogramme zur Interruptbehandlung (ISR=Interrupt Service Routine) an festen Stellen im ROM stehen müssen.
ORG wird jedoch auch verwendet, um Daten an festen Bereichen im ROM abzulegen:
... ; Programmcode mov DPTR, #100h ;Data Pointer auf 100h setzten ... ; Programmcode org 100h ; an Adresse 100h weitermachen db 20, 10, 200 ; 20 wird an 100h abgelegt ; 10 an 101h ; 200 an 102h u.s.w.

Direktiven um Konstanten im ROM abzulegen

Jeder Befehl wird vom Assembler in eine Folge von Bytes übersetzt, welche den Befehl und seine Parameter codieren. In etlichen Programmen werden jedoch neben den Befehlen auch Daten benötigt. Sind diese Daten konstant, so können diese mit dem Programm im ROM abgelegt werden. Als Beispiele für solche Anwendungen kann man sich z.B. Geräte vorstellen, welche Musik abspielen (Klingeltöne, Kinderspielzeug, ...) hier werden Tonhöhe und Tonlänge fest im ROM abgelegt. Das Programm liest diese Werte der Reihe nach aus und spielt die Töne ab.
Auch Benutzeroberflächen, z.B. auf Telefonen speichern die Muster für die Displays (das was angezeigt wird) fest im ROM ab.
Um Konstanten im ROM abzulegen unterstützt der Assembler zwei Direktiven: DB und DW

Die DB Direktive

Mit DB (define byte> kann der Wert eines Bytes im ROM abgelegt werden oder aber eine Folge von Bytes, welche durch Kommata getrennt werden. Als einfaches Beispiel werden hier 8 Byte abgelegt, welche ein 8-Bit-Lauflicht darstellen:
db 00000001b, 00000010b db 00000100b, 00001000b db 00010000b, 00100000b db 01000000b, 10000000b

Die DW Direktive

Die DW (define word) kann ein 16-Bit Wert im ROM abgelegt werden, wobei zuerst der höherwertige Teil der Zahl und danach der niederwertige Teil gespeichert wird. DW 0FE4Ah erzielt das gleiche wie DB 0FEh, 04Ah. Es ist aber an manchen Stellen einfacher den Assembler diese Aufteilung machen zu lassen, außerdem kann ein Programm lesbarer sein, wenn eine Zahl nicht händisch in Bytes zerlegt werden muss.
dw 0FFEDh, 20152 ; hier werden 2 Wörter abgelegt ; d.h. 4 Byte: FFh, EDh, 4Eh, B8h ; da 20152=4EB8h ist