www.mikrocontroller.net

Forum: Compiler & IDEs AVR-GCC: Disassembler-Ansicht unvollständig


Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich fange gerade an mein ATMega32 mit AVRStudio in Verbindung mit WinAVR
zu programmieren. Als Optimierung ist -Os eingestellt. Wenn ich nun
meinen Quellcode compiliere sagt gcc, dass der Code 906 Bytes groß ist.
Wenn ich jetzt in die Disassembly Ansicht gehe, geht mein Code aber nur
bis 0x1C4 das würde also nur 382 Bytes entsprechen (code fängt ja erst
ab 0x47 an). Wenn ich das HexFile aber jetzt in Ponyprog lade geht der
Code aber bis 0x389 was also tatsächlich der Aussage von GCC
entspricht. Wieso kann ich das aber nicht im Disasseber sehen?
Im listfile ist das auch alles richtig. Oder ist AVRStudio dafür
einfach nicht ausgelegt?

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn ich jetzt in die Disassembly Ansicht gehe, geht mein Code aber
> nur bis 0x1C4 das würde also nur 382 Bytes entsprechen

Das ist eine 16-Bit-Adresse: Musst Du *2 nehmen.

> (code fängt ja erst ab 0x47 an).

Mhhh ... und davor? IR-Vektoren brauchst Du nicht, deshalb darf man den
Speicher nicht zählen?

Gruß, Stefan

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
??
Ui, das irretiert aber. Ich hatte mich so an Hexeditor gewöhnt. Naja,
dann hätte sich das ja geklärt.
Zu der Größe, Mein Code fängt nach diesem Kram an:

+00000000:   940C002A    JMP     0x0000002A       Jump
+00000002:   940C0045    JMP     0x00000045       Jump
+00000004:   940C0045    JMP     0x00000045       Jump
+00000006:   940C0045    JMP     0x00000045       Jump
+00000008:   940C0045    JMP     0x00000045       Jump
+0000000A:   940C0045    JMP     0x00000045       Jump
+0000000C:   940C0045    JMP     0x00000045       Jump
+0000000E:   940C0045    JMP     0x00000045       Jump
+00000010:   940C0045    JMP     0x00000045       Jump
+00000012:   940C0161    JMP     0x00000161       Jump
+00000014:   940C0045    JMP     0x00000045       Jump
+00000016:   940C0045    JMP     0x00000045       Jump
+00000018:   940C0045    JMP     0x00000045       Jump
+0000001A:   940C013C    JMP     0x0000013C       Jump
+0000001C:   940C0045    JMP     0x00000045       Jump
+0000001E:   940C0045    JMP     0x00000045       Jump
+00000020:   940C0045    JMP     0x00000045       Jump
+00000022:   940C0045    JMP     0x00000045       Jump
+00000024:   940C0045    JMP     0x00000045       Jump
+00000026:   940C0045    JMP     0x00000045       Jump
+00000028:   940C0045    JMP     0x00000045       Jump
+0000002A:   2411        CLR     R1               Clear Register
+0000002B:   BE1F        OUT     0x3F,R1          Out to I/O location
+0000002C:   E5CF        LDI     R28,0x5F         Load immediate
+0000002D:   E0D8        LDI     R29,0x08         Load immediate
+0000002E:   BFDE        OUT     0x3E,R29         Out to I/O location
+0000002F:   BFCD        OUT     0x3D,R28         Out to I/O location
+00000030:   E010        LDI     R17,0x00         Load immediate
+00000031:   E6A0        LDI     R26,0x60         Load immediate
+00000032:   E0B0        LDI     R27,0x00         Load immediate
+00000033:   E7E0        LDI     R30,0x70         Load immediate
+00000034:   E0F3        LDI     R31,0x03         Load immediate
+00000035:   C002        RJMP    PC+0x0003        Relative jump
+00000036:   9005        LPM     R0,Z+            Load program memory
and postincrement
+00000037:   920D        ST      X+,R0            Store indirect and
postincrement
+00000038:   36A0        CPI     R26,0x60         Compare with
immediate
+00000039:   07B1        CPC     R27,R17          Compare with carry
+0000003A:   F7D9        BRNE    PC-0x04          Branch if not equal
+0000003B:   E010        LDI     R17,0x00         Load immediate
+0000003C:   E6A0        LDI     R26,0x60         Load immediate
+0000003D:   E0B0        LDI     R27,0x00         Load immediate
+0000003E:   C001        RJMP    PC+0x0002        Relative jump
+0000003F:   921D        ST      X+,R1            Store indirect and
postincrement
+00000040:   36A4        CPI     R26,0x64         Compare with
immediate
+00000041:   07B1        CPC     R27,R17          Compare with carry
+00000042:   F7E1        BRNE    PC-0x03          Branch if not equal
+00000043:   940C0100    JMP     0x00000100       Jump
+00000045:   940C0000    JMP     0x00000000       Jump

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieser Kram sind die IR-Vektoren und die Variablen-Initialisierung, die
der Compiler vor dem Start von main() macht.

Ähnlich überflüssig wie die Reifen am Auto, die Du aber trotzdem immer
teuer mit dazukaufen musst ;-)

Gruß, Stefan

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Machen die kostenpflichtigen Compiler das auch (ICC oder IAR)?? Naja es
sind ja nur 68 Bytes, aber irgentwie schon nervig.
Trotzdem macht der GCC teilweise echt guten Code, aber bei Interrups
haben 32 Register echt Nachteile. Da müssen ja zig push's gemacht
werden und nachher wieder pop's. Naja muss man mit leben.

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Machen die kostenpflichtigen Compiler das auch (ICC oder IAR)?? Naja
> es sind ja nur 68 Bytes, aber irgentwie schon nervig.

Natürlich machen das auch andere Compiler. Was meinst Du, wo Deine
ganzen Variablen ihre Initialisierung herbekommen - und wenn es nur
eine Null ist?

> Trotzdem macht der GCC teilweise echt guten Code, aber bei Interrups
> haben 32 Register echt Nachteile. Da müssen ja zig push's gemacht
> werden und nachher wieder pop's. Naja muss man mit leben.

Ein IR sichert nicht alle Register auf den Stack, sondern nur die, die
er benötigt. Wenn Du allerdings Funktionen im IR aufrufst, dann zwingst
Du den Compiler, alle Register zu retten, die eine Funktion lokal
benutzen darf.
Auch bei Risen-IR-Funktionen habe ich es übrigens nie geschafft, dass
gcc mehr als 18 Register pusht.

Gruß, Stefan

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, ich mecker weiter rum wenn meine 32 kB voll sind. Danke für deine
Antworten

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.