mikrocontroller.net

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


Autor: tib (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
  movw r20,r18

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe deine Frage zum Anlass genommen, mir das Kapitel mit den Makros
reinzuziehen. Dein Beispiel würde folgendermaßen aussehen:
.macro load_byte reg,addr
  mov ZL,\reg
  clr ZH
  subi ZL,lo8(-\addr)
  sbci ZH,hi8(-\addr)
  lpm \reg,Z
.endm
Eigentlich ganz ähnlich, nur dass die Argumente Namen haben.

Autor: tib (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Yalu
SUPER!

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

Autor: tib (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
.macro load_byte reg,addr
  mov ZL,\reg
  clr ZH
  subi ZL,lo8(-(\addr))
  sbci ZH,hi8(-(\addr))
  lpm \reg,Z
.endm
Selber wieder etwas gelernt, ich programmiere nur ganz selten in
Asssembler :-)

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
  load_byte r10,tab

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.