avr-gcc Problem mit inline assembler?

OP #925582
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
Gast #925585
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.
OP #925588
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
Gast #925592
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");
Persönliche Seite #925594
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
Gast #931009
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren