Forum: Compiler & IDEs GCC .lst Ausgabe hexadezimal erzwingen?


von Ulrich P. (uprinz)


Lesenswert?

Hi!

Ich brauche einen Tip, wie man die GCC Chain dazu bringt, alle Ausgaben 
in den .lst Dateien in hex auszugeben, statt der dezimalen Form.

Beispiel:
68 0044 28309FE5     str  r3, [r2, #-971]
69 0048 CB3302E5     .loc 1 247 0

Für mich wäre #FFFFFC34 besser lesbar als #-971.
Bisher verwende ich die Optionen -Wa,-adhlns=$(<:.c=.lst)

Habe schon in den binutils Dokus herum gesucht, aber es irgendwie nicht 
innerhalb der gas -Wa Optionen gefunden.

Danke und Gruß

Ulrich

von Hc Z. (mizch)


Lesenswert?

Bei den binutils bist Du vermutlich verkehrt, das wird der Compiler so 
übergeben.  Du kannst Dich ja mal durch dessen Switches durchwühlen, ob 
es da was Passendes gibt; vermutlich eher nicht.

Bringt Dir vielleicht ein „arm-...-objdump -dSl file.elf“ ein Format, 
das näher am Gewünschten liegt?  Ich kann's nicht ausprobieren, da ich 
hier auf diesem Rechner nichts für ARM habe.

von Ulrich P. (uprinz)


Lesenswert?

Hi!

  300144:  e3e02a01   mvn  r2, #4096  ; 0x1000
  300148:  e51233c3   ldr  r3, [r2, #-963]  ; 0x3c3
  30014c:  e3c33a03   bic  r3, r3, #12288  ; 0x3000
  300150:  e50233c3   str  r3, [r2, #-963]  ; 0x3c3

Sieht auch nicht wirklich besser aus...
Zumal die Ausgabe etwas komisch ist, denn #4096 entspricht ja 0x1000
aber #-963 ist 0xFFFFF3C2, dachte ich...

Gruß, Ulrich

von Hc Z. (mizch)


Lesenswert?

Ulrich P. schrieb:
> #-963 ist 0xFFFFF3C2

Irgendwie nicht ... die linke Zahl ist ungerade, die andere gerade, das 
kann nicht sein ... mal nachsehen: -963 ist -0x3c3.

Damit hast Du natürlich noch nicht die gewünschte Darstellung im 
Zweierkomplement (0xfffffc3d), aber da weiß ich Dir sonst keinen Rat.

von Tom M. (Gast)


Lesenswert?

Ulrich P. schrieb:
> ch brauche einen Tip, wie man die GCC Chain dazu bringt, alle Ausgaben
> in den .lst Dateien in hex auszugeben, statt der dezimalen Form.

Die .lst Dateien werden in meiner Toolchain durch avr-objdump erzeugt. 
Diese Variante des gnu objdump Programms zeigt die Zahlen hexadezimal 
an. Einstellen kann man das gem. manpage aber nicht - im Gegensatz zum 
avr-nm (gnu nm), der kennt die Option --radix

Bei mir läuft:
$ avr-objdump --version
GNU objdump (GNU Binutils) 2.20

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


Lesenswert?

Tom M. schrieb:
> Die .lst Dateien werden in meiner Toolchain durch avr-objdump erzeugt.

Die heißen dort aber ".lss" und sind in Wirklichkeit Disassembler-
Listings.  Ein Assembler-Listing könntest du bei Bedarf ebenfalls
haben (mit den oben erwähnten Optionen).

Das -Wa besagt dabei nur, dass der Compiler die nachfolgenden Optionen
ohne eigene Begutachtung direkt an den Assembler weiterreichen soll.

Ich fürchte aber auch, dass das einfach mal (im obigen Context) der
Compiler ist, der das so generiert.

von Ulrich P. (uprinz)


Lesenswert?

Hc Zimmerer schrieb:
> Ulrich P. schrieb:
>> #-963 ist 0xFFFFF3C2
>
> Irgendwie nicht ... die linke Zahl ist ungerade, die andere gerade, das
> kann nicht sein ... mal nachsehen: -963 ist -0x3c3.
>
> Damit hast Du natürlich noch nicht die gewünschte Darstellung im
> Zweierkomplement (0xfffffc3d), aber da weiß ich Dir sonst keinen Rat.

Also die Adresse scheint eher ein 0xFFFFFFFF-963 zu sein, denn sonst 
würde es nicht passen. Ich kenne keinen ARM, der einen Zugriff auf eine 
ungerade Adresse innerhalb seiner eigenen Register klaglos hin nimmt.

@Tom:
Es ist in meinem Fall ein arm-none-eabi-objdump mit der Version
GNU objdump (GNU Binutils) 2.20.1.20100303

@Jörg:
Ich werde es noch mal mit der -Wa,-adhlns=$(<:.c=.lst) Option für den 
Compile-Lauf versuchen. Zwar löst es nicht das Problem, dass man alle 
Register Adressen zurück rechnen muss, aber wenigstens ist hier der 
C-Code und der Assembler Output sauber verschachtelt.

Gruß, Ulrich

von Hc Z. (mizch)


Lesenswert?

Ulrich P. schrieb:
[  zu str  r3, [r2, #-963]  ; 0x3c3 ]
> Also die Adresse scheint eher ein 0xFFFFFFFF-963 zu sein, denn sonst
> würde es nicht passen. Ich kenne keinen ARM, der einen Zugriff auf eine
> ungerade Adresse innerhalb seiner eigenen Register klaglos hin nimmt.

Das ist ein Offset von -0x3c3 zu r3 und kein Zugriff auf eine ungerade 
Adresse.  Wo das zugreift, hängt vom Register ab.

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Ulrich P. schrieb:
> Hc Zimmerer schrieb:
>> Ulrich P. schrieb:
>>> #-963 ist 0xFFFFF3C2
>>
>> Irgendwie nicht ... die linke Zahl ist ungerade, die andere gerade, das
>> kann nicht sein ... mal nachsehen: -963 ist -0x3c3.
>>
>> Damit hast Du natürlich noch nicht die gewünschte Darstellung im
>> Zweierkomplement (0xfffffc3d), aber da weiß ich Dir sonst keinen Rat.

Klingt jetzt wie Haarspalterei, aber der Grund warum die Zahl nicht im
ZK dargestellt wird, ist der vorzeichenlose immediate Wert "963",
der als Offset verwendet wird. Dieser Offset kann entweder addiert
oder subtrahiert werden. Im Opcode selbst wird der Wert gewissermaßen
im sign/magnitude Format abgelegt.

> Also die Adresse scheint eher ein 0xFFFFFFFF-963 zu sein, denn sonst
> würde es nicht passen.

Das hat GCC noch nie davon abgehalten das zu generieren }:^) So einen
Fall hatte ich erst vor kurzem beim Kunden.

> Ich kenne keinen ARM, der einen Zugriff auf eine ungerade Adresse
> innerhalb seiner eigenen Register klaglos hin nimmt.

Was meinst Du mit "innerhalb seiner eigenen Register"? Sämtliche V6
und v7 Prozessoren (ARM11 und alle Cortex Prozessoren) können
unaligned Speicherzugriffe tätigen. Die älteren können das auch, nur
erscheint der zurückgelieferte Wert bisweilen etwas merkwürdig.

Gruß
Marcus

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.