Hallo!
Ich habe Assemblercode, den ich in AVR Studio erzeugt habe und den ich
in ein Win AVR Project mittels einer ".S"-Datei einbetten möchte. Damit
man dies tun kann muss man ja die verschiedenen Konventionen beachten,
z.B. ".byte" statt ".db". Das ist soweit klar. Nun zum Problem: Im Code
verwende ich Makros, die mit ".macro ... .endmacro" definiert sind und
an die Parameter via "@0, @1 ..." übergeben werden. Wie setze ich die
nun in WinAVR um? Habe nicht viel gefunden, außer der Deklaration
"func", aber ich glaube, die Makros gibt es auch, oder?
Hier ein Beispiel:
.macro load_byte //Look Up Table
mov ZL, @0 //@0 = Register
clr ZH
subi ZL, LOW(-@1) //@1 = Adresse
sbci ZH, HIGH(-@1)
lpm @0, Z
.endmacro
PS: Außerdem scheint es ein Problem mit movw zu geben. In AVR Studio
schreibe ich "movw R21:R20, R19;R18". In Win AVR sagt er mir was von
Konstante erforderlich.
Ich bin für jede Hilfe echt dankbar!
> Im Code verwende ich Makros, die mit ".macro ... .endmacro"> definiert sind und an die Parameter via "@0, @1 ..." übergeben> werden. Wie setze ich die nun in WinAVR um?
Ich kenne mich mit Makros nicht aus, aber in der Gebrauchsanleitung
des GNU-Assemblers
http://sourceware.org/binutils/docs-2.17/as/index.html
sind sie beschrieben:
http://sourceware.org/binutils/docs-2.17/as/Macro.html> In AVR Studio schreibe ich "movw R21:R20, R19;R18". In Win AVR sagt> er mir was von Konstante erforderlich.
Im GNU-Assembler heißt das einfach
Wenn ich die Makros aufrufe, z.B. mit "load_byte R10, (tab<<1)"
erscheint der Fehler "constant value required". "tab" ist in dem Fall
ein Label, das auf .byte Werte zeigt. Darf man nur Konstanten übergeben?
Beim Register ist das ja kein Problem. Aber das Label brauche ich ja,
weil ich nicht weiß, wo die Tabelle letztendlich stehen wird. Habe aber
mal nur zum Testen zwei Konstanten eingetragen, doch der Fehler
erscheint trotzdem und deutet auf die Zeile mit dem Aufruf. Da bin ich
überfragt.
Symbole, die als Label definiert sind, müssen bei Verwendung in
Ausdrücken geklammert werden, also bspw. -(tab) und nicht -tab.
Das hängt wohl damit zusammen, dass tab nicht zu einer einfachen Zahl,
sondern einem Section-Namen und einer Zahl evaluiert. Das Makro eines
diesbezüglichen Anfängers in meinem letzten Beitrag war also Murks und
sollte folgendermaßen geschrieben werden:
1
.macro load_byte reg,addr
2
mov ZL,\reg
3
clr ZH
4
subi ZL,lo8(-(\addr))
5
sbci ZH,hi8(-(\addr))
6
lpm \reg,Z
7
.endm
Selber wieder etwas gelernt, ich programmiere nur ganz selten in
Asssembler :-)
Habe noch etwas vergessen: Die Operation <<1 zur Umrechnung von Word-
in Byte-Adressen brauchst du nicht und führt ebenfalls zu einer
Fehlermeldung. Der GNU-Assembler setzt je nach Befehl automatisch die
richtig skalierte Adresse ein.
Der Makroaufruf lautet damit ganz einfach