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: {
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.
Die Compilerversion bekommt man beim GCC mit der -v (oder --version) Option raus.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.