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


von Oz z. (ozzy)


Lesenswert?

Moin,

mir macht gerade ein Befehl etwas zu schaffen, der einfach nicht so 
will, wie ich:
1
asm volatile  (
2
              "movw  r8, r17"            
3
              ::: "r9", "r8"
4
            );
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

von obake (Gast)


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.

von Oz z. (ozzy)


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

von obake (Gast)


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");

von Johann L. (gjlayde) Benutzerseite


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

von obake (Gast)


Lesenswert?

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

von Oz z. (ozzy)


Lesenswert?

Vielen Dank für Deine Antwort! Dann weiß ich ja Bescheid!

MfG, und vielen Dank noch einmal, Ozzy

von Rolf Magnus (Gast)


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.

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.