mikrocontroller.net

Forum: Compiler & IDEs avr-gcc Problem mit inline assembler?


Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

mir macht gerade ein Befehl etwas zu schaffen, der einfach nicht so 
will, wie ich:
asm volatile  (
              "movw  r8, r17"            
              ::: "r9", "r8"
            );
Als Fehlermeldung erhalte ich:
Temp/cc4qMo5a.s: Assembler messages:
Temp/cc4qMo5a.s:126: Error: even register number required

Es liegt an dem r17. Ändere ich es auf r16 oder r18 funktioniert es.

Ist das mein Fehler, oder der von avr-gcc??? Ich habe übrigens auf 
Version 4.3.0 geupdated, aber das Problem besteht weiterhin.

MfG, und vielen Dank, Ozzy

Autor: obake (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Christoph,

> Ist das mein Fehler, ...
Ja, denn so ist "MOVW" von Atmel erklärt:

MOVW Rd+1:Rd,Rr+1Rrd ∈ {0,2,...,30}, r ∈ {0,2,...,30}

Ziel und Quell-Register müssen beide gerade sein.

Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

vielen Dank, das hatte ich total überlesen!
Aber kannst Du mir vielleicht auch noch sagen, warum avr-gcc die Syntax 
aus dem ATmega Handbuch nicht annimmt:
movw r17:16,r1:r0
wenn ich so etwas schreibe bekomme ich immer folgende Fehlermeldung:

Temp/cczwDycd.s: Assembler messages:
Temp/cczwDycd.s:126: Error: even register number required
Temp/cczwDycd.s:126: Error: `,' required
Temp/cczwDycd.s:126: Error: garbage at end of line

Muss man da wirklich einfach nur ein "movw r16,r0" draus machen?


MfG, und vielen Dank, Ozzy

Autor: obake (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

>Muss man da wirklich einfach nur ein "movw r16,r0" draus machen?

Genau! Die Gründe dafür kenne ich nicht. Jörg Wunsch hat hier einmal 
erklärt, dass man 16-Bit-Variable in gcc z.B. so schreibt (also auch 
anders als Atmel es in den Datenblättern macht):

register uint16_t spibyte asm("r4");

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es zählt die Syntax des GNU-Assemblers (avr-as) und nicht des Handbuchs. 
Die Syntax unterscheidet sich zudem vom Atmel-Assembler.


Du kannst Dir Beispiele mit korrekter Syntax aus C/C++-Programmen 
erzeugen lassen mit der Option -save-temps am avr-gcc.

16-Bit-Variablen in gcc sind immer aligned auf gerade Register. Du wirst 
nie sehen, daß er eine 16- oder 32-Bit-Variable in einem ungeraden GPR 
anfangen lässt. Die höherwertigen Bytes folgen auf die Registeradresse 
mit dem LSB, welches als einziges angegeben wird (little Endian).

Johann

Autor: obake (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klarer wäre es gewesen, wenn ich im obigen Beitrg 
"16-Bit-*Register*-Variable" geschrieben hätte.

Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für Deine Antwort! Dann weiß ich ja Bescheid!

MfG, und vielen Dank noch einmal, Ozzy

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Du kannst Dir Beispiele mit korrekter Syntax aus C/C++-Programmen
> erzeugen lassen mit der Option -save-temps am avr-gcc.

Oder halt gleich einfach mit -S. Dann ruft er den Assembler gar nicht 
erst auf, sondern stoppt davor.

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.