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,-1414 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
24 = 8 [5],var[6],var[7],var[8]; --> ADD ESP,-834 = 12
44 = 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,-14Dann 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.