Allgemeines
Der Weg zum
HEX-File
Ein
einfaches
Projekt mit MPLAB erstellen
Das
Gerüst
für ein Assemblerprogramm
Schreibregeln
Welche
Befehle gibt es?
Was ist das
"w"? Was ist "f"? Was ist "$"?
Wo sind
die Flags?
Weiter zu den Assembler-Befehlen
Hallo Anfänger.
Der Begriff Assembler wird
für zwei unterschiedliche Dinge verwendet:
ein einfaches
Projekt
Bei kleinen
Assembler-Projekten
kann man durchaus den gesamten Quellcode in ein *.ASM-File schreiben,
es
ist aber üblich, einzelne Programmblöcke in Include-Dateien
(*.INC) auszugliedern. Der Assembler tut dann so, als wäre das
Includefile
an einer bestimmten Stelle im Quellcode eingefügt.
Typische
Include-Files sind z.B. die Files, die die prozessorspezifischen
Definitionen
(z.B. von Registern) enthalten. Solche Files werden mit MPLAB für
jeden PIC-Typ mitgeliefert. Sie liegen nach der MPLAB-Installation
unter:
...\MPLAB
IDE\MPASM Suite\
Man kann aber auch Teile das Assemblertextes in eine Include-Datei auslagern, wenn man diesen ASM-Code wie einen Textbaustein für verschiedene Projekte verwenden will.
ein umfangreiches
Projekt
Bisher haben wir Assembler
und Linker als eine Einheit betrachtet, sie erfüllen aber
unterschiedliche
Aufgaben.
Der Assembler
wandelt
den menschenlesbaren Text des Assembler-Codes in einen Objektcode um.
Das
ist eine Art Maschinencode, der aber noch nicht auf spezifische
Adressen
im Prozessor bezogen ist. Er enthält also noch keine absoluten
Adressen.
(relocatable code)
Der Linker legt dann fest, wo dieser Objektcode im Programmspeicher des Prozessors stehen soll, und ersetzt die relativen Adressen des Objectcodes durch absolute Adressen des Prozessors. Erst danach ist der Code im Prozessor lauffähig. (executable code) Der Linker benötigt für seine Arbeit Informationen über den Speicheraufbau des jeweiligen PIC-Typs. Die entnimmt er einem Linker-Skript. Das ist ein File, dass für jeden PIC-Typ von MPLAB mitgeliefert wird (...\MPLAB IDE\MPASM Suite\LKR\).
Der Linker kann aus mehreren Objektcode-Files das endgültige Programm (wie aus Bausteinen) zusammenbauen. Bei größeren Projekten ist das von Vorteil, und man übersetzt nur die ASM-Files neu, in denen man Änderungen vorgenommen hat. Von allen anderen Programmteilen verwendet man die alten Objektcode-Files weiter.
Objecktcode wird nicht nur vom Assembler erzeugt. Auch z.B. C-Compiler erzeugen Objektcode-Files, die der Linker dann in ein HEX-File wandelt. Es ist möglich, Teile eines umfangreichen Projektes in C und andere in Assembler zu schreiben, und die aus den unterschiedlichen Programmiersprachen entstandenen Objektcode-Files vom Linker zusammen in ein HEX-File verarbeiten zu lassen.
Bibliotheken
Einige typische Probleme
tauchen in vielen Programmen immer wieder auf, z.B. mathematische
Berechnungen,
die die einfache ALU des PICs nicht beherrscht. Für solche
Probleme
muss man dann kleine Assember- oder C-Routinen schreiben. Es
wäre
aber mühselig, das Rad immer wieder neu zu erfinden. Deshalb
werden
solche hilfreichen Programmschnipsel zu Object-Files assembliert oder
compiliert,
und diese kleinen Objectfiles in Bibliotheken zusammengefasst.
Wenn man dann später z.B. eine 32-Bit-Division benötigt, dann programmiert man diese nicht neu, sondern verwendet eine fertige Divisionsroutine aus einer Billiothek. Solche Bibliotheken sind Files mit der Endung *.LIB'. Zum Lieferumfang von MPLAB gehörten keine Bibliotheken.
Wir benötigen aber ein ASM-File, in dem das Assembler-Programm als Text geschrieben wird. Desshalb erstellt man mit "File" - "New" und "File" - "Save as" eine Assemblerdatei mit der Extension ".ASM". Im kleinen Projekt-File-Fenster klickt man nun mit der rechten Maustaste auf 'Source Files', wählt 'Add Files..' und kann nun das erstellte ASM-File in das Projekt aufnehmen. Wer bereits ein ASM-File mit einem fertigen Programm hat, kann sich das erstellen eines ASM-Files natürlich sparen. Man kopiert es in den Projekt-Ordner und fügt es (wie gerade beschrieben) zum Projekt hinzu.
Auch wenn im Assembler-File eigentlich der verwendete PIC-Typ schon festgelegt ist, muss man MPLAB noch einmal extra sagen, welchen PIC-Typ man benutzen will. Die Einstellung dafür findet man in MPLAB unter "Configure" - "Selct Device".
Ist das Assemblerprogramm im ASM-File fertig geschrieben, kann man es vom im MPLAB enthaltenen Assembler/Linker in ein HEX-File wandeln lassen. Der Menüpunkt "Projekt" - "Make" oder "Build All" startet den Assembler und wenn im Programm keine Syntaxfehler enthalten sind, schreibt MPLAB eine ".HEX"-Datei in der das fertige Programm enthalten ist.
Es ist durchaus normal,
dass
der Assembler Warnungen der folgenden Form ausgibt. :
Message[302]
.............................
:
Register in operand not in bank
0.
Ensure that bank bits are correct.
Das ist keine
Fehlermeldung,
und behindert die Erstellung des HEX-Files nicht.
list p=16f84 ;der Prozessortyp wird festgelegt include "p16f84.inc" ;die include-Datei mit vielen Festlegungen wird geladen ;z.B. sind hier Standardnamen für wichtige ;Register und Bits festgelegt
org
0x00
;die
Startadresse
nach Reset ist 0, hier startet der PIC
org
0x04
;Interruptvector
ist
0x04, main
end
;das
Ende
des Programms |
Microchip
liefert
in
MPLAB für jeden PIC-Typ ein umfangreiches,
massgeschneidertes
Programmgerüst mit. Diese ASM-Files befinden sich nach der
Installation
von MPLAB im Verzeichnis
...\MPLAB
IDE\MPASM
Suite\Template\Code\
Man
kann diese Vorlagen in sein eigenes Projektverzeichnis kopieren, und
als
Grundlage eines eigenen ASM-Programms benutzen.
Will
man
aus
dem ASM-File ein Object-File erstellen lassen, so benutzt man
die
Vorlagen in
...\MPLAB
IDE\MPASM
Suite\Template\Object\
Schreibweisen der verschiedenen Zahlensysteme:
Zahlensystem | Schreibweise |
hexadezimal | 0x20
oder 20 |
dezimal | D'128'
oder .128 |
binär | B'10101010' |
Eine nicht besonders
gekennzeichnete Zahl wird normalerweise als hexadezimale Zahl
verstanden, dass kann aber mit der list
r= -Direktive umgestellt werden.
Ein Semikolon leitet
einen
Kommentar ein, mit dem man sinnvolle Erläuterungen in den
ASM-Quelltext
einfügen kann. Der Assembler ignoriert alles von einem Semikolon
bis
zum Ende der Zeile.
Bei mehrzeiligen
Kommentaren
muss an jedem Zeilenanfang wieder ein Semikolon stehen.
Dagegen steht "f" im
Befehl
für alle anderen Register. Natürlich muss der Name oder
die Adresse des Registers dann noch genau angegeben werden.
incf
0x20 ; incrementiere den Inhalt des
;
Registers
mit der hexadezimalen Adresse 0x20
clrf
STATUS ; lösche das STATUS-Register
Gelegentlich findet man
das
$-Zeichen innerhalb von Adress-Berechnungen. Dabei steht $ für den
momentanen Stand des Programmcounters (PC). Der PC weist zu diesem
Zeitpunkt
auf den aktuellen Befehl. $ kann somit zur Berechnung von Sprungziehlen
benutzt werden, ist aber viel unflexibler als die Verwendung von Marken.
goto
$+2 ; überspringe ein Wort im
Programmspeicher
clrw
;
irgendein
1-Wort-Befehl der übersprungen wird
incw
;
irgendein
Befehl zu dem gesprungen wird
das gleiche lässt
sich
sauberer wie folgt programmieren:
goto
ziel ; überspringe ein Wort im
Programmspeicher
clrw
;
irgendein
1-Wort-Befehl der übersprungen wird
ziel
incw
;
irgendein
Befehl zu dem gesprungen wird
btfsc
STATUS,Z ; teste das Bit Z (Zero) im Register STATUS (bt - bit
test),
;
wenn
es nicht gesetzt ist ignoriere den nächsten Befehl
;
(sc
- skip if clear)
goto
Nirwana ; ansonsten springe nach Nirwana
Weiter zu den Assembler-Befehlen
Autor: sprut
letzte Änderung: 30.03.2010