Forum: Mikrocontroller und Digitale Elektronik Wie erzeuge ich ein Listing mit AVR-GCC?


von Christoph Lechner (Gast)


Lesenswert?

Hallo,

wie erzeuge ich mit avr-gcc (unter Linux) ein Listing, dass aussieht
wie das am Ende des Postings? Ich hab mit avr-objdump schon so ein
ähnliches Listing erzeugt, aber da fehlen die Kommentare, was die
Assemblerbefehle denn jetzt für eine C-Zeile repräsentieren.

MfG
- C. Lechner

---> schnipp! <---

   superFunc();
 148:  0e 94 f6 00   call  0x1ec

  ultraFunc(0x55);
 14c:  85 e5         ldi  r24, 0x55  ; 85
 14e:  0e 94 fb 00   call  0x1f6

  PORTD = gigaFunc();
 152:  0e 94 fd 00   call  0x1fa
 156:  82 bb         out  0x12, r24  ; 18

  PORTA = (addFunc(0xF0, 0x11) & 0xff);
 158:  61 e1         ldi  r22, 0x11  ; 17
 15a:  80 ef         ldi  r24, 0xF0  ; 240
 15c:  0e 94 ff 00   call  0x1fe
 160:  8b bb         out  0x1b, r24  ; 27
  PORTB = (addFunc(0xF0, 0x11) >> 8);
 162:  61 e1         ldi  r22, 0x11  ; 17
 164:  80 ef         ldi  r24, 0xF0  ; 240
 166:  0e 94 fc 00   call  0x1f8
 16a:  89 2f         mov  r24, r25
 16c:  99 27         eor  r25, r25
 16e:  88 bb         out  0x18, r24  ; 24

von Thomas (Gast)


Lesenswert?

Versuch mal das hier. Das ist über DJGPP (gcc für DOS), sollte aber
eigentlich mit allen gcc Versionen funktionieren (wenn es denn
funktioniert, probiert hab ichs nicht:):

http://www.delorie.com/djgpp/v2faq/faq8_20.html

von Christoph Lechner (Gast)


Lesenswert?

Hallo,

das kommt dem, was ich zu erreichen suche schon sehr ähnlich allerdings
hat der Linker da noch nicht zugeschlagen und daher enthalten alle
Adressen immer noch 0x00. Außerdem ist mir aufgefallen, dass manchmal
die Assembler-Befehle vor der C-Zeile im Listing kommen. Ich werd mal
g00gle fragen, jetzt habe ich ja in Form der Argumente, die bei DJGPP
vorkommen, neue Suchwörter.

- C. Lechner

von Thomas (Gast)


Lesenswert?

Also ich habs jetzt auch mal probiert, da kommen schon Adressen != 0,
aber selbstverständlich sind das noch nicht die fertig aufgelösten
Adressen, sondern der Programmzähler von gas während er das einzelne
Modul assembliert.

Kann sein dass die Assemblerzeilen und der C Code durcheinandergeworfen
werden, das passiert scheinbar bei gcc, wenn man Debuginformationen und
Optimierungen eingeschaltet hat (viele Compiler lassen es auch gar
nicht erst zu, Code zu optimieren und mit Debuginfos zu versehen).
Falls du -O, -O3 oder ähnlich angegeben hast, kannst du das ja mal
weglassen, aber dann sieht der Code natürlich dann anders aus, was
vermutlich nicht Sinn der Sache ist.

Brauchst auch nicht unbedingt nach DJGPP zu suchen, lies doch einfach
die Dokumentation von gcc und der binutils:

http://www.gnu.org/software/binutils/manual/
http://gcc.gnu.org/onlinedocs/

Ansatzpunkt wären da die Optionen die auf der DJGPP Site angegeben
sind...

von Christoph Lechner (Gast)


Lesenswert?

Hallo,

Die -O3, die ich tatsächlich im Makefile hatte, hab ich wieder
rausgemacht, sollte auch nur ein Test sein. In der Entwicklungsphase
tut man ja normalerweise erst dann auf Optimierung gehen, wenn man das
Produkt fehlerfrei hat bzw. glaubt dass es so ist.

Mit den "Adressen" meinte ich die Zieladressen von call, lds etc...
Die Adressen der OP-Codes sind doch AFAIK nur relativ zum Anfang des
Moduls, oder?

Werde mal die Doku zu den binutils, speziell zum "as" lesen, weil der
das Listing ja erzeugt.

THNX
- Christoph Lechner

von Thomas (Gast)


Lesenswert?

>Mit den "Adressen" meinte ich die Zieladressen von call, lds etc...
>Die Adressen der OP-Codes sind doch AFAIK nur relativ zum Anfang des
>Moduls, oder?

Jo, das ist richtig. Hab dich da falsch verstanden mit den Adressen.

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.