Forum: Mikrocontroller und Digitale Elektronik GNU-Assembler und die Zahlendarstellung von Labels


von David M. (md2k7)


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

von Andreas K. (a-k)


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?

von David M. (md2k7)


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

von Andreas K. (a-k)


Lesenswert?


von David M. (md2k7)


Lesenswert?

Die Recherche bei den URL's brachte die Erleuchtung:

Gefundenes Snippet:

  ldi  r24, lo8(pm(somefunc))
  ldi  r25, hi8(pm(somefunc))
  call  something

pm() wirkt hierbei die benötigte Division durch 2.


Dankeschön!

Gruß
David

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.