Forum: Compiler & IDEs GCC -> ASM


von Ludwig Meyerhoff (Gast)


Angehängte Dateien:

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Peter D. (peda)


Angehängte Dateien:

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.)

von Ludwig Meyerhoff (Gast)


Lesenswert?

Hallo!

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

Saluti!

Ludwig

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.