Aktuelle Zeit: 09:21:46 25.05.2013
Dient dem Einfügen von Assembler-Sourcecode an aktueller Position.
Syntax:
Der als Inline-Assembler eingefügte Quelltext unterliegt bei Kommentaren und Angaben von Zeichenketten der Syntax von LunaAVR. Bei „normalem“ Assemblerquelltext werden Kommentare durch das Semikolon ; eingeleitet. Bei Inline-Assembler sind jedoch die Kommentar-Einleitungszeichen ' bzw. // zu verwenden. Desweiteren werden Zeichenketten immer in Gänsefüße " geklammert.
Für den Zugriff auf im Luna-Source verwendete Variablen, ist ein Blick in das vom Compiler erzeugte Assembler-Listing hilfreich (Dateiendung *.s, Ausgabeoption „a“). Die Zugriffe auf Variablen im Hauptprogramm, in Klassen oder auf lokale Variablen bzw. Parameter in Methoden unterscheiden sich.
Neben den Standard-Opcodes des jeweiligen Controllers sind folgende Zusatzfeatures implementiert:
Auf Grund des Klassenmodells werden Labels im Luna-Quelltext der Klasse zugeordnet in welcher sie angelegt werden. D.h. ein Label „myLabel“ wird auf Assemblerebene im Hauptprogramm zu „classAvrMyLabel“. In einer eigenen Klasse „myclass“ wiederum „classMyClassMyLabel“ usw. Dies betrifft auch Labels innerhalb des Inline-Assemblerquelltextes.
Diese Namenserweiterung ist wichtig um Konflikte verschiedener Namensräume auszuschließen und auch den Zugriff aus dem Luna-Source auf Inline-Assembler-Labels zu ermöglichen.
' Irgendwo im Hauptprogramm Asm classAvrMyLoop: nop rjmp classAvrMyLoop EndAsm
' Irgendwo im Hauptprogramm Asm MyLoop: 'wird erweitert zu "classAvrMyLoop" nop rjmp classAvrMyLoop EndAsm
Es können Ausdrücke und Operatoren in Verbindung mit Konstanten verwendet werden.
Folgende zusätzliche Befehle sind implementiert (nur im Assembler-Quelltext):
| Befehl | Beschreibung | Beispiel |
|---|---|---|
| .equ | Anlegen einer Konstante | .equ var = 123.45 |
| .set | Anlegen/Zuweisen einer Konstante | .set var = 123.45 |
| .def | Alias | .def temp = R16 |
| .device | Avr-Controller festlegen | .device atmega32 |
| .importClass | Avr-Klasse importieren. Setzt alle Definitionen und Konstanten des jeweiligen Controllers inkl. .device | .importClass atmega32 |
| .importObject | Importieren eines Bibliothek-Objektes | .importObject Macro_Delay |
| .importUsedObjects | Importiert automatisch alle im Source verwendeten Bibliothek-Objekte | .importUsedObjects |
| .cseg | Flash-Segment auswählen | .cseg |
| .dseg | Sram-Segment auswählen | .dseg |
| .eseg | Eeprom-Segment auswählen | .eseg |
| .org | Zeiger des aktuell aktiven Segments auf eine bestimmten Wert setzen | .org intVectorSize |
| low()/lo8() | Low-Byte eines Wertes | ldi R16,low(33000) |
| high()/hi8() | High-Byte eines Wertes | ldi R16,high(33000) |
| byten() | Byte eines Wertes 1-4 | ldi R16,byte1(33000) |
| single()/float() | IEEE Single-Kodierung eines Wertes | .set value = single(33000) |
| .if .else .endif | Fallunterscheidung Präprozessor auf Assemblerebene | |
| defined() | Präprozessorfunktion zur Ermittlung ob ein Symbol definiert ist. | |
' Assembler-Routine aufrufen call example ' Irgendwo im Programmcode Asm classAvrExample: add R16,R17 ori R16,&h33 ldi R16,(1<<3) or (1<<7) ; Bits 3 und 7 setzen ldi ZL,lo8(classAvrExample) ldi ZH,hi8(classAvrExample) inc R17 ret EndAsm