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 bp

    also 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.


Anmelden zum Antworten