Disassembler Dump Erklärung
-
Hi
Ich werde da leider nicht schlau draus:
C Code:
char Test (char i); char j; int main(void) { j = Test (2); return(0) } char Test (char i) { return(i); }
das gibt das:
02C2 55 PUSH BP 02C3 8BEC MOV BP,SP 02C5 B002 MOV AL,02 02C7 50 PUSH AX 02C8 E80A00 CALL 02D5 02CB 59 POP CX 02CC A28C02 MOV [028C],AL 02CF 33C0 XOR AX,AX 02D1 EB00 JMP 02D3 02D3 5D POP BP 02D4 C3 RET 02D5 55 PUSH BP 02D6 8BEC MOV BP,SP 02D8 8A4604 MOV AL,[BP+04] 02DB EB00 JMP 02DD 02DD 5D POP BP 02DE C3 RET
Ich versteh die Zeilen nicht:
1: 02CC A28C02 MOV [028C],AL
und
2: 02D8 8A4604 MOV AL,[BP+04]
Bei [1], in AL ist immernoch 02? Was ist [028C] (variable j?)
Bei [2], Was ist [BP+04] und der inhalt? Wie wird das berechnet?
danke im vorrus!
-
Disassembler schrieb:
Bei [1], in AL ist immernoch 02? Was ist [028C] (variable j?)
Nein, der Rückgabewert wird in rax/eax/ax/al übergeben (je nach größe). Da ein char ein byte groß ist wirds halt in al übergeben.
Bei [2], Was ist [BP+04] und der inhalt? Wie wird das berechnet?
bp zeigt auf den Stack auf folgenden Stack:
bp+4: erstes argument der Funktion
bp+2: ip vor dem jmp/call
bp: kopie von bpalso holt [bp+4] das erste (in dem Fall das einzige) argument der Funktion.
-
Hi
danke ich habs jetzt kapiert
-
Disassembler schrieb:
02D5 55 PUSH BP 02D6 8BEC MOV BP,SP 02D8 8A4604 MOV AL,[BP+04] 02DB EB00 JMP 02DD 02DD 5D POP BP 02DE C3 RET
gibt's kein 'mov al[sp+4]'? dann könnt man sich die 'bp' aktionen sparen. entweder mieser compiler oder übler prozessor.
~muss dieser vollspacken wieder lästern?~
-
Doch gibt es, aber das macht der Compiler aus debugging Gründen (Stack trace) nur wenn du (bei gcc) --fomit-framepointer als option angibst.
-
bluecode schrieb:
Doch gibt es, aber das macht der Compiler aus debugging Gründen (Stack trace) nur wenn du (bei gcc) --fomit-framepointer als option angibst.
hmm, das scheint kein GCC zu sein, da der wenn ich mich richtig erinnere andere Aufrufkonventionen hat (Parameterübergabe in Registern, der Stack wird erst ab n-Registern benutzt ...)
-
@rüdiger: Ich versteh nicht ganz den Zusammenhang. Die Aufrufkonvention hat erstmal nichts mit dem erstellen eines lokalen Stackframes zu tun...
-
bluecode schrieb:
@rüdiger: Ich versteh nicht ganz den Zusammenhang. Die Aufrufkonvention hat erstmal nichts mit dem erstellen eines lokalen Stackframes zu tun...
Deine Aussage hörte sich so an, als würdest du sagen, dass dies Code sei, den der GCC generiert hat
-
ne, ich wollt damit sagen, dass ich nur die Option vom gcc kenne. Ob/Wie man das bei anderen Compilern abstellen kann, weiß ich leider nicht.