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
1 | movw r20,r18 |
Habe deine Frage zum Anlass genommen, mir das Kapitel mit den Makros reinzuziehen. Dein Beispiel würde folgendermaßen aussehen:
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 |
Eigentlich ganz ähnlich, nur dass die Argumente Namen haben.
@Yalu SUPER! Besten Dank für deine ausführliche Hilfe. Das Manual ist genau das, was ich gesucht habe. Noch mal danke!
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
1 | load_byte r10,tab |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.