GNU-Assembler und die Zahlendarstellung von Labels

#606977
Lesenswert?

Hallo,

ich bin gerade dabei, meinen Assembler-Code so umzuschreiben, dass er 
"C-kompatibel" ist, also die Funktionen von C aus aufgerufen werden 
können etc.

(Prozessor: ATmega8)

Abgesehen von einigen Syntax-Unterschieden ging es bisher ganz gut und 
das Kompilieren funktioniert inzwischen. Beim Debuggen musste ich jedoch 
feststellen, dass gcc die Adressen der Labels als Byte-Adresse 
darstellt, während der ganz normale AVR-Assembler von Atmel diese als 
Word-Adresse darstellt. Fazit: gcc-Labels sind alle doppelt so groß!
Kleiner Beispielcode zum Verdeutlichen (high und low habe ich als hi8 
und lo8 definiert, weil gcc sonst meckert):

  ldi ZH, HIGH(label)
  ldi ZL, LOW(label)
  ijmp
  ...
label:
  ...

Hier springt gcc irgendwo ins Nirvana, da die Adresse doppelt so groß 
ist, wie eigentlich gedacht. Dabei funktioniert das im Avr-Assembler 
tadellos.
Ein Versuch, die Adresse durch 2 zu teilen, brachte folgendes "Ergebnis" 
(Fehlermeldung): "../bus.S:257: Error: invalid sections for operation on 
`label' and `L0?'"
Die Zeile, die diese Meldung verursacht:

ldi  ZL, LOW(label/2)


Anscheinend versteht es gcc nicht einmal, dass ich einfach einen 
konstanten Ausdruck da hingeschrieben habe. Ein Trauerspiel!


Fazit:

- GNU-Assembler kann keine konstanten Ausdrücke!
- GNU-Assembler kann keine Assembler-Makros der Art ".MACRO ... 
.ENDMACRO"!

Wie macht ihr das, wenn ihr eine Assembler-Bibliothek in C braucht?
Wo gibt es eine vollständige Syntax-Definition der 
Assemblerfunktionalität von avr-gcc?
Wieso ist das nicht kompatibel?

Gruß,
David
#606985
Lesenswert?

David Madl wrote:

> - GNU-Assembler kann keine konstanten Ausdrücke!

Der Ausdruck ist nicht konstant, da der Wert des Labels erst dem Linker 
bekannt ist. Es gibt eine Notation, mit der sich das ausdrücken lässt. 
Der Compiler macht es auch nicht anders - der erzeugt nämlich 
Assembler-Code.

> - GNU-Assembler kann keine Assembler-Makros der Art ".MACRO ...
> .ENDMACRO"!

Was kann der Assembler dafür, dass du nicht bereit bist, dessen Doku zur 
Kenntnis zu nehmen?

> Wieso ist das nicht kompatibel?

Kompatibel zu was? Zu Atmels Assembler, zu Intels Assembler, zu 
Motorolas Assembler, zu IBMs Assembler?
#607024
Lesenswert?

Andreas Kaiser wrote:
> Der Ausdruck ist nicht konstant, da der Wert des Labels erst dem Linker
> bekannt ist. Es gibt eine Notation, mit der sich das ausdrücken lässt.
> Der Compiler macht es auch nicht anders - der erzeugt nämlich
> Assembler-Code.

Hätte vielleicht jemand auch die Freundlichkeit, mir diese Notation 
näherzubringen?


> Was kann der Assembler dafür, dass du nicht bereit bist, dessen Doku zur
> Kenntnis zu nehmen?

Ich kann wohl was dafür, dass ich diese besagte Doku nirgendwo finde. 
Würde mir trotzdem bitte jemand eine URL posten, damit ich mich schlauer 
machen kann?

> Kompatibel zu was? Zu Atmels Assembler, zu Intels Assembler, zu
> Motorolas Assembler, zu IBMs Assembler?


Eigentlich hätte ich mir erwartet, dass es zu Atmels Assembler 
kompatibel ist... Andererseits ist es ja auch nur gcc, und der wurde 
halt nicht für AVR entwickelt, sondern nur portiert, du hast schon 
Recht.


Gruß
David

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