www.mikrocontroller.net

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


Autor: David Madl (md2k7)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: David Madl (md2k7)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: David Madl (md2k7)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.