Assemblerdirektiven
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:
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