Pfad: Home => AVR-Überblick => Programmiertechniken => Direktiven/Ausdrücke

Programmiertechniken in AVR Assemblersprache

Assembler-Direktiven

Assembler-Direktiven steuern den Assembler, sie erzeugen für sich betrachtet keinen eigenen Code. Der einleitende Punkt muss in Spalte 1 beginnen.
SegmentDirektiveBeschreibung
Kopf .DEVICEDefiniert den Typ des Zielprozessors und legt verfügbaren Satz an Instruktionen fest (ungültige Instruktionen für den Typ werden mit Fehlermeldung quittiert, Syntax .DEVICE AT90S8515)
.DEFLegt ein Synonym für ein Register fest (z.B. .DEF MeinReg = R16)
.EQUDefiniert ein Symbol und legt seinen Wert fest (kann später umdefiniert werden, Syntax .EQU test = 1234567, interne Speicherung des Wertes erfolgt als 4-Byte-Integer-Zahl)
.SETFixiert den Wert eines Symboles (keine spätere Neudefinition möglich)
.INCLUDEFügt eine externe Datei ein, als ob deren Inhalt an dieser Stelle stünde (Typisch z.B. Einbinden der Headerdatei: .INCLUDE "C:\avrtools\appnotes\8515def.inc")
Code .CSEGBeginn des Codesegmentes (alles was danach folgt, wird als Code übersetzt und in den Programmraum gespeichert)
.DBFügt ein oder mehrere konstante Bytes in das Programm (kann eine Zahl von 0..255 sein, ein ASCII-Zeichen 'c', eine Zeichenkette "abcde" oder ein Gemisch wie z.B. 1,2,3,'a',"abc". Im Programmraum muss die Anzahl der eingefügten Bytes geradzahlig sein, weil der Programmspeicher immer nur ganze 16-Bit-Worte enthalten kann, andernfalls wird vom Assembler ein Nullbyte angefügt.)
.DWFügt ein binäres Wort in den Programmraum ein (produziert z.B. eine Tabelle im Code!)
.LISTMACMakros werden in die Listdatei aufgenommen (ohne diese Angabe wird Code aus Makros nicht im .LST-file ausgegeben)
.MACROBeginn eines Makros (Code wird nicht erzeugt, erst bei Aufruf des Makros mit seinem Name (Syntax: .MACRO makroname parameter, Aufruf mit: makroname parameter)
.ENDMACROEnde des Makros
EEPROM .ESEGBeginn des EEPROM-Speichers (die erzeugten Inhalte landen beim Programmieren im EEPROM-Segment)
.DBFügt ein oder mehrere konstante Bytes in das EEPROM ein (kann eine Zahl von 0..255 sein, ein ASCII-Zeichen 'c', eine Zeichenkette "abcde" oder ein Gemisch wie z.B. 1,2,3,'a',"abc".)
.DWFügt ein binäres Wort in den EEPROM-Raum ein (Im EEPROM-Segment wird erst das niedrigere, dann das höhere Byte eingefügt)
SRAM .DSEGBeginn des Datensegments (hier dürfen dann nur BYTE-Direktiven und Labels stehen, bei der Übersetzung werden nur die Labels entsprechend ausgewertet)
.BYTEReserviert ein oder mehrere Bytes im Datensegment (fügt den Bytewert im Unterschied zu .DB nicht wirklich ein!)
Überall .ORGLegt die Anfangsadresse im jeweiligen Segment fest (z.B. .ORG 0x0000)
.LISTSchaltet die Listing-Ausgabe ein (der produzierte Code wird menschenlesbar in einer .LST-Datei ausgegeben)
.NOLISTSchaltet die Ausgabe in die .LST-Datei aus
.INCLUDEFügt eine externe Datei ein, als ob deren Inhalt an dieser Stelle stünde (Typisch z.B. Einbinden der Headerdatei: .INCLUDE "C:\avrtools\appnotes\8515def.inc")
.EXITEnde des Assembler-Codes (stellt weitere Übersetzung ein)

Fortgeschrittene Assemblerdirektiven

Fortgeschrittene Assemblerdirektiven erlauben Es ist wichtig zu beachten, dass sich die Direktiven nur an den Assembler richten und sein Verhalten steuern, im erzeugten Programm selbst finden keine Verzweigungen statt!

Nicht alle Assembler kennen diese Direktiven. Neuere Assembler von ATMEL, die neueren Studioversionen sowie gavrasm kennen diese Direktiven.

Die Syntax dieser Direktiven sieht so aus:

Assembler-Ausdrücke

Ausdrücke werden für Berechnungen im Assembler-Quelltext verwendet und werden bei der Übersetzung des Codes ausgewertet. Sie erzeugen keinen ausführbaren Code.
TypZeichenBeschreibung
Rechnen +Addition
-Subtraktion oder negative Zahl
*Multiplikation
/Ganzzahlen-Division
Binär &Bitweise UND-Verknüpfung
|Bitweise ODER-Verknüpfung
^Bitweise Exklusive-ODER-Verknüpfung
~Bitweise NICHT-Verknüpfung
<<Linksschieben
>>Rechtsschieben
Logisch <Kleiner als
>Größer als
==Gleich
<=Kleiner gleich
>=Größer gleich
!=Ungleich
&&UND-Verknüpfung
||ODER-Verknüpfung
!NICHT


Links schieben

Anmerkung zum Linksschieben (<<): sehr häufig sind z.B. folgende Zeilen zu sehen:

  ldi r16,1<<ADSC
  out ADCSRA,r16


Dabei ist ADSC ein in der Headerdatei definiertes einzelnes Bit in einem Port (hier: das Bit, das eine AD-Umwandlung startet, bei den meisten Mega-Typen eine 6), ADCSRA ist ein ebenfalls im Header definierter Port. Der Ausdruck << bewirkt dabei, dass eine Eins (binär 0000.0001) genau sechs Mal links geschoben wird und zu 0100.0000 wird. Diese Zahl wird an den Port ADCSRA ausgegeben.

Die Verwendung dieser Konstruktion hat den Vorteil, dass die genaue Lage des ADSC-Bits im Port ADCSRA gar nicht bekannt sein muss und sich von Headerdatei zu Headerdatei ändern kann, ohne dass der Quellcode geändert werden müsste. Gegenüber der Konstruktion

  ldi r16,0b01000000
  out 0x06,r16


erhöht sich auch noch immens die Transparenz, weil doch ziemlich kryptisch bleibt, was denn nun hier genau gemacht werden soll. Außerdem erspart man sich die Mühe, die Nullen exakt abzuzählen.

Was nun, wenn man gleichzeitig auch noch andere Bits in diesem Port setzen möchte, wie z.B. das Interrupt-Enable-Bit ADIE (Bit 3)? Dann muss bitweise ODER-verknüpft werden:

  ldi r16,(1<<ADSC) | (1<<ADIE)
  out ADCSRA,r16


Die Klammern setzen die richtigen Rechenprioritäten.

Zum Seitenanfang



©2002-2005 by http://www.avr-asm-tutorial.net