Aktuelle Zeit: 09:21:46 25.05.2013

  • Deutsch (German)
  • English

Asm-EndAsm

Dient dem Einfügen von Assembler-Sourcecode an aktueller Position.

Syntax:

  • Asm
    • Assembler-Sorcecode
  • EndAsm

Besonderheiten

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.

Zugriff auf Variablen aus dem Luna-Source

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.

Allgemein

Neben den Standard-Opcodes des jeweiligen Controllers sind folgende Zusatzfeatures implementiert:

Labels im Assemblerquelltext

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.

Beispiel 1

' Irgendwo im Hauptprogramm
Asm
  classAvrMyLoop:
    nop
    rjmp classAvrMyLoop
EndAsm

Beispiel 2

' Irgendwo im Hauptprogramm
Asm
  MyLoop:             'wird erweitert zu "classAvrMyLoop"
    nop
    rjmp classAvrMyLoop
EndAsm

Ausdrücke/Befehle

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 .endifFallunterscheidung Präprozessor auf Assemblerebene
defined() Präprozessorfunktion zur Ermittlung ob ein Symbol definiert ist.

Beispiel 3

' 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
Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0 chimeric.de = chi`s home
(c) 2011 rgf software, all rights reserved