Forum: Compiler & IDEs AVR Studio Assembler in Win AVR "konvertieren"


von tib (Gast)


Lesenswert?

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!

von yalu (Gast)


Lesenswert?

> 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

von yalu (Gast)


Lesenswert?

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.

von tib (Gast)


Lesenswert?

@Yalu
SUPER!

Besten Dank für deine ausführliche Hilfe. Das Manual ist genau das, was 
ich gesucht habe. Noch mal danke!

von tib (Gast)


Lesenswert?

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.

von yalu (Gast)


Lesenswert?

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 :-)

von yalu (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.