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
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.
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
> 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.)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.