Forum: Compiler & IDEs Unterschied zwischen Atmel-Assembler und AVR-GCC-Assembler


von Matthias (Gast)


Lesenswert?

Hallo zusammen

Ist es möglich, dass es Unterschiede in der Syntax des Assemblers von 
AVR-GCC im Vergleich zum Assembler von Atmel gibt?

Konkret handelt es sich bei meinem Problem um den Befehl ADIW (Add 
Immediate to Word)

Das "AVR Instruction Set" von Atmel gibt dazu folgendes Beispiel an:

Example:
adiw r25:24,1 ; Add 1 to r25:r24
adiw ZH:ZL,63 ; Add 63 to the Z-pointer(r31:r30)

Genau das funktioniert aber im Inline-Assembler von AVR-GCC nicht!
Der möchte NUR EIN Register angegeben bekommen, sodass es heissen muss:

adiw r24,1

Ist das korrekt so? Handelt es sich tatsächlich um einen Unterschied in 
der Syntax?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ja, diese Doppelregistersyntax kennt der gas nicht.  Es ist ja aus
dem Befehlscode klar, dass er nur auf ein Doppelregister anwendbar
ist (und dann auch wieder nur auf ein paar ganz bestimmte).

von Matthias (Gast)


Lesenswert?

Danke für diese klare Antwort.

Es stimmt, diese Syntax ist eigentlich logischer als diejenige des 
Atmel-Assemblers.

Ich nehme an, dass sich das bei den anderen Befehl für Register-Paare 
gleich verhält (MOVW,SBIW)?

Gibt es noch weitere Unterschiede zwischen dem GCC-Assembler und dem 
Atmel-Assembler?

Ist die Syntax des GCC-Assemblers irgendwo genau dokumentiert? (Bisher 
habe ich für den einfach das AVR Instruction Set von Atmel verwendet, 
aber das scheint ja offenbar nicht die beste Idee zu sein.)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Matthias wrote:

> Gibt es noch weitere Unterschiede zwischen dem GCC-Assembler und dem
> Atmel-Assembler?

Ja, vor allem die Pseudo-Ops sind komplett andere, da diese im gas
unabhängig von der Architektur implementiert sind.  Der gas ist hier
eher in der Linie der typischen Unix-Assembler, die er ja ersetzen
können will.

> Ist die Syntax des GCC-Assemblers irgendwo genau dokumentiert?

Der gas ist in sogenannten info-Dokumenten ganz gut dokumentiert,
aber das betrifft nur den reinen Assembler.  Die CPU-Befehle selbst
werden normalerweise 1:1 so implementiert, wie sie der CPU-Hersteller
benutzt und sind nicht in der gas-Doku enthalten.  Ich glaube aber,
dass die Sache mit den nicht implementierten Doppelregistern hier
der einzige Unterschied ist.  Die unterschiedlichen Pseudo-Ops
machen einem dagegen beim Portieren von Code, der für den Atmel-
Assembler geschrieben ist, mehr Kopfschmerzen bzw. Fleißarbeit.

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.