Frage zu Variablen auf dem Stack



  • Hallo ich habe diese Programm mir mal im OllyDebugger 1.10 angeschaut.

    Wieso wird var hier jetzt so auf dem Stack gespeichert ?
    ADD ESP,-14

    14 Hex ist ja 20 Dezimal.

    #include <iostream>
    using namespace std;
    
    int main()
    {
    
    char var[17];
    
    cout << "test";
    return 0;
    }
    
    00401170 main            /.  55                             PUSH EBP
    00401171                 |.  8BEC                           MOV EBP,ESP
    00401173                 |.  83C4 EC                        ADD ESP,-14
    00401176                 |.  68 9A204000                    PUSH Project1.0040209A                     ;  ASCII "test"
    0040117B                 |.  FF35 E4504000                  PUSH DWORD PTR DS:[<&CC3280.std::cout>]    ;  CC3280.std::cout
    00401181                 |.  E8 0A000000                    CALL Project1.std::operator <<
    00401186                 |.  83C4 08                        ADD ESP,8
    00401189                 |.  33C0                           XOR EAX,EAX
    0040118B                 |.  8BE5                           MOV ESP,EBP
    0040118D                 |.  5D                             POP EBP                                    ;  kernel32.7C817077
    0040118E                 \.  C3                             RETN
    


  • data structure alignment? 😕



  • der stackpointer muss immer ein vielfaches von 4 sein (align 4) -> 17+3 = 5*4



  • 14 = 4 var[1],var[2],var[3],var[4]; --> ADD ESP,-4
    2
    4 = 8 [5],var[6],var[7],var[8]; --> ADD ESP,-8

    34 = 12
    4
    4 = 16 var[13],var[14],var[15],var[16] --> ADD ESP,-10
    5*4 = 20 var[17],var[18],var[19],var[20] --> ADD ESP,-14

    Dann wäre das doch so richtig oder ?

    Aber wenn ich jetzt z.b. habe char var[89]; gibt es auch eine Formel für so etwas das man das z.b. mit einem Taschenrechner ausrechnen kann.

    Weil sonst muss man ja immer Kopfrechnen machen oder sich so eine Tabelle machen wie ich es oben gemacht habe.



  • Du musst einfach auf das nächste Vielfache von 4 aufrunden. Dafür braucht man doch keine Formel ... Wie auch immer:

    if( sizeof(locals)%4 != 0 )
    {
        nBytes = sizeof(locals) + 4 - sizeof(locals)%4
    }
    else
    {
        nBytes = sizeof(locals)
    }
    

    BTW: deine 'Tabelle' verstehe ich nicht so recht



  • Hallo also dann so?

    Das nächste vielfache von 4 bei der Zahl 92 wäre dann 96 ?

    Also einfach immer + 4 rechnen ?



  • dbg schrieb:

    Also einfach immer + 4 rechnen ?

    😮

    Du nimmst die Größe der Variablen und teilst sie durch 4. Wenn der Rest (Modulo) ungleich 0 ist, ziehst du diesen von 4 ab und addierst das Ergebnis anschließend zur Größe der Variablen hinzu.



  • Oder einfacher:

    align = 4 * ((x + 3) / 4)
    


  • Th69 schrieb:

    Oder einfacher:

    align = 4 * ((x + 3) / 4)
    

    noch besser währe:

    align = (x+3)&(~3)
    

    🙂



  • Die Lösung von Th69 verstehe ich. :>

    thx @ all für die Hilfe.


Anmelden zum Antworten