mikrocontroller.net

Forum: Compiler & IDEs GCC -> ASM


Autor: Ludwig Meyerhoff (Gast)
Datum:
Angehängte Dateien:
  • uart.s (6,54 KB, 145 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

ich habe ein C-Progrämmchen für einen Atmel geschrieben, und möchte
gerne sehen, was für ein ASM er draus gemacht hat.

Ich habe die Option "-S" entdeckt, die ein ASM erstellt, der ist aber
ziemlich unlesbar, mit dutzenden von nichtssagenden Direktiven.

Wie kriege ich ein "lesbares" ASM aus meinem C-Code oder alternativ
aus dem HEX-File?
Kann mir Jemand vielleicht die Struktur von einem ".s" File erklären?
Was sind die ganzen Sprungmarken? Was bedeuten die ganzen Direktiven?



Saluti!

Ludwig

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du die Option -g weglässt, wird das etwas übersichtlicher,
weil der Compiler dann keine Debuginfos mehr an den Assembler
weiterreichen muss.

Die ,,Sprungmarken'' sind keine, sondern es sind einfach nur
Marken.  Wenn du dir die dazugehörigen .stabn-Direktiven mal
genau ansiehst, die diese Marken referenzieren, dann wirst du
feststellen, dass darin die Zeilennummern-Information versteckt
ist.  Der Debugger benutzt diese Information, um den Adressen
dann die Zeilennummern zuzuordnen.

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du ein lesbares Assemblerlisting willst, dann muß -g unbedingt drin
sein, damit Du die zugehörenden C-Zeilen siehst.
Und dann dem Linker sagen, daß er alles zusammen manschen soll.

Ich compiliere mit ner Batch und da sieht das dann so aus:
----------------------------------------------------------
@echo off

set mcu=90s2313

set main=test

set ac=c:\avr\winavr
path %ac%\bin;%path%
avr-gcc.exe -xc -Os -mmcu=at%mcu% -Wall -g -o main.out *.c
avr-objdump.exe -t -h -S main.out >%main%.lst
avr-objcopy.exe -O ihex main.out %main%.hex
avr-size.exe -B main.out
----------------------------------------------------------

*.c wird zu allen C-Files im aktuellen Verzeichnis expandiert.

Ein Listing sieht dann z.B. so aus (siehe Anhang).

Nur die Tabelle der Initialisierungswerte erscheint ulkiger Weise nicht
im Listing. Das Listing ist also etwas kürzer als der gesamte Code.


Peter

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn Du ein lesbares Assemblerlisting willst, dann muß
> -g unbedingt drin sein, damit Du die zugehörenden C-Zeilen
> siehst.

Das ist die Frage der Definition von ,,lesbar''.

> Ein Listing sieht dann z.B. so aus (siehe Anhang).

Das ist kein Assemblerlisting, sondern ein Disassemblerlisting.
Das hat schon ein paar Unterschiede.

> Nur die Tabelle der Initialisierungswerte erscheint ulkiger
> Weise nicht im Listing.

Das ist einer der Artefakte, die man damit bekommt: man dröselt
ja die ganze Chose von hinten auf, folglich sieht man nur den
C-Code, für den es im Objektcode auch Debug-Informationen gab.
Die Initialisierung dagegen hat keinerlei Symbole dranhängen,
damit sieht der Disassembler sie nicht mehr.  Bei bestimmten
Optimierungen kann die Ausgabe auch ziemlich konfus aussehen,
weil ein Compiler, je ,,RISCiger'' ein Prozessor ist, um so mehr
Verbiegungen am generierten Code vornimmt, um ihn optimal auf
den Prozessor anzupassen.  Nun ist der AVR eigentlich nicht sehr
RISCig, aber eben schon drastisch mehr als das i386-Gerödel, das
an vom PC her kennt, und bei dem der Compiler sowieso unter
ständigem Registermangel leidet und danher nahezu alle Variablen
auch im RAM hält.  Bei ,,großen'' RISC-Maschinen kommt noch hinzu,
dass sie Register- und Speicheroperationen (letztere brauchen wie
auch beim AVR länger) effektiv ineinander schachteln können, um
die Ausführungszeit zu verkürzen.  Dann ,,hüpft'' der Objektcode
im Vergleich zum C-Code sehr oft nur noch hin und her.  Ein
Disassemblerlisting mit eingeflochtenem C-Code sieht auf so einer
Maschine wahrscheinlich deutlich unübersichtlicher aus, als wenn
man sich gleich in den generierten Assemblercode vertiefen würde
und versucht, ihn zu verstehen.  (Letzteres habe ich zu Motorola
m88k-Zeiten gemacht.  Ein Disassemblerlisting mit C-Code habe
ich mir dafür nie angeguckt.)

Autor: Ludwig Meyerhoff (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Vielen Dank für den Hinweis, ohne "-g" ist das auch schon viel
schöner!

Saluti!

Ludwig

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.