GCC-Assembler: Fehlermeldung Pseudobefehl .byte

Gast #1745659
Lesenswert?

...

opc:

RJMP Getchar

High:

.byte hi8 (opc)

...


Das Assemblerprogramm soll das Highbyte des Labels "opc" mittels der 
.byte Anweisung hinter dem Label High ablegen.

Der GCC-Assembler für den AVR gibt die folgenden Fehlermeldung (Zeile 
mit dem .byte) aus:

Error: illegal relocation size: 1

Alternativ habe ich - ohne Erfolg - statt hi8(...) pm_hi8(...) 
verwendet.

Wo liegt der Fehler?
Gast #1745778
Lesenswert?

Wenn ich

.word foo
.word pm(foo)

assembliere bekomme ich die 4 Bytes

00 14
00 0A


assembliere ich

.word foo
.word foo

erhalte ich

00 14
00 14

???

Was ich möchte ist: die Highbytes von Labels hintereinander Byte für 
Byte ablegen.
Persönliche Seite #1745791
Lesenswert?

Nicht jeder Reloc ist überall erlaubt.

pm teilt die Adresse durch 2.

Die einzig sinnvolle Art, ein Label so zu speichern, ist ihn irgendwann 
als Zeiger für einen indirekten Sprung/Call zu verwenden. Weil AVR nur 
halbe Adressen verwendet (Code ist immer 2-Aligned), können 128kb bzw. 
64kw mit einer 16-Bit Adresse erreicht werden. Die Division durch 2 
macht pm()

Wenn du nur das Highbyte brauchst deutet das auf ein problematisches 
Design hin. Was soll's denn werden?
Moderator Persönliche Seite #1746668
Lesenswert?

Martin schrieb:
> mit dem AVR-Assembler von Atmel funktioniert es

Das ist auch ein ziemlich primitives Teil, und insbesondere ist
es kein verschieblicher Assembler, sondern ein Absolutassembler.
Damit weiß er natürlich, auf welche Adresse er konkret gerade
assembliert, während der GNU-Assembler alles erst einmal in
Verschiebeanweisungen für den Linker umwandeln muss, der es dann
später auf die eigentlichen Adressen bringt (die sogenannten
relocation entries).
Persönliche Seite #1746741
Lesenswert?

Martin schrieb:
> Es gibt zwei Arten von Assembler, die, die funktionieren und die, die
> nicht funktionieren. Der ATMEL-Assembler funktioniert.

Na, zu behaupten der GNU-Assembler funktioniere nicht...

Ich schätze, wesentlich mehr Leute setzen den avr-as ein als den 
Atmel-Assembler, nämlich zumindest die, die AVR mir avr-gcc oder avr-g++ 
programmieren (und damit bei jedem Mal implitit auch den avr-as aufrufen 
lassen).

Wie gesagt, was du da machen willst ich recht exotisch. Ich wüsste keine 
Anwendung, bei der man nur das High-Byte einer Adresse als Eintrag in 
einer Tabelle braucht.
Moderator Persönliche Seite #1746746
Lesenswert?

Martin schrieb:
> Der ATMEL-Assembler funktioniert.

Für deine Definition von "funktioniert".

Mach mal ein Projekt, was mehr als eine Quelldatei braucht...
Oder einfacher: linke deinen Assemblercode mal gegen eine der
Objektbibliotheken von Atmel, QTouch zum Beispiel.  Spätestens
dann wirst du wissen, warum ein Absolutassembler bereits 1980
als altmodisch galt.
#1746780
Lesenswert?

Johann L. schrieb:
> Wie gesagt, was du da machen willst ich recht exotisch. Ich wüsste keine
> Anwendung, bei der man nur das High-Byte einer Adresse als Eintrag in
> einer Tabelle braucht.

Nicht nur du. Offenbar haben die Entwickler der AVR-ELF-Variante, von 
denen ich bis zum Beweis des Gegenteils erstmal ausgehe, dass es keine 
Vollidioten waren, ebenfalls keine Anwendung dafür gesehen, so dass es 
schlicht und einfach keinen dafür passenden Relokationstyp gibt.

Andreas

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