AVR Studio Assembler in Win AVR "konvertieren"

Gast #568398
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!
Gast
> 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
Gast
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.
Gast
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.
Gast
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 :-)
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.