Forum: Compiler & IDEs Was macht der Compiler am ANFANG ??


von Mark (Gast)


Lesenswert?

Was macht der Compiler


... wenn ich eine "leere" Funktion comp., also int main(){}, dann gibt 
es so einen großen Vorspann - warum ? ( zweite Frage:  wo kann ich denn 
die Version des Compilers nachschauen? )

+0000003E:   940C0063    JMP     0x00000063       Jump
+00000040:   940C0063    JMP     0x00000063       Jump
+00000042:   940C0063    JMP     0x00000063       Jump
+00000044:   940C0063    JMP     0x00000063       Jump
+00000046:   2411        CLR     R1               Clear Register
+00000047:   BE1F        OUT     0x3F,R1          Out to I/O location
+00000048:   EFCF        SER     R28              Set Register
+00000049:   E1D0        LDI     R29,0x10         Load immediate
+0000004A:   BFDE        OUT     0x3E,R29         Out to I/O location
+0000004B:   BFCD        OUT     0x3D,R28         Out to I/O location
+0000004C:   E011        LDI     R17,0x01         Load immediate
+0000004D:   E0A0        LDI     R26,0x00         Load immediate
+0000004E:   E0B1        LDI     R27,0x01         Load immediate
+0000004F:   EEE4        LDI     R30,0xE4         Load immediate
+00000050:   E0F0        LDI     R31,0x00         Load immediate
+00000051:   E000        LDI     R16,0x00         Load immediate
+00000052:   BF0B        OUT     0x3B,R16         Out to I/O location
+00000053:   C002        RJMP    PC+0x0003        Relative jump
+00000054:   9007        ELPM    R0,Z+            Extended load program 
memory and postincrement
+00000055:   920D        ST      X+,R0            Store indirect and 
postincrement
+00000056:   30A0        CPI     R26,0x00         Compare with immediate
+00000057:   07B1        CPC     R27,R17          Compare with carry
+00000058:   F7D9        BRNE    PC-0x04          Branch if not equal
+00000059:   E011        LDI     R17,0x01         Load immediate
+0000005A:   E0A0        LDI     R26,0x00         Load immediate
+0000005B:   E0B1        LDI     R27,0x01         Load immediate
+0000005C:   C001        RJMP    PC+0x0002        Relative jump
+0000005D:   921D        ST      X+,R1            Store indirect and 
postincrement
+0000005E:   30A0        CPI     R26,0x00         Compare with immediate
+0000005F:   07B1        CPC     R27,R17          Compare with carry
+00000060:   F7E1        BRNE    PC-0x03          Branch if not equal
+00000061:   940C0065    JMP     0x00000065       Jump
+00000063:   940C0000    JMP     0x00000000       Jump
@00000065: main
---- 5.c 
------------------------------------------------------------------------ 
------------------
6:        {

von Stefan (Gast)


Lesenswert?

Vor der ersten Funktion aus main.c werden vom Linker andere Funktionen 
eingebunden.

Dieser als Startupcode bezeichnete Teil hat u.a. die Aufgabe bestimmte 
Vektoren zu initialisieren, DATA aus dem nichtflüchtigen Speicher zu 
kopieren, BSS und Stack zu initialisieren, ggf. die C-Library zu 
initialisieren usw. Der Umfang des Startupcodes ist je nach µC und 
Entwicklungssystem stark unterschiedlich.

Lass dir mal ein Assemblerlistung von main.c alleine erzeugen (Bei GCC 
-S Option) und dann siehst du wie eine "leere" Funktion aussieht.

von Stefan (Gast)


Lesenswert?

Die Compilerversion bekommt man beim GCC mit der -v (oder --version) 
Option raus.

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Assemblerdatei erzeugen per Makefile geht übrigens mit:
1
$ make main.s

  

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.