Ich habe mir gerade folgenden Eintrag zum Nachlesen bei wikibooks durchgelesen:
x86 Disassembly/Functions and Stack Frames
Allerdings bin ich bei folgendem Eintrag sehr stutzig:
Nach meiner Meinung wird dort der Stack doppelt abgebaut. Erst bei
und später nochmal bei
Ich habe dies gerade mit einem selbstgeschriebenem Programm getestet und auf dem Stack fehlen nach der Ausführung tatsächlich 8 Bytes (in meinem Programm habe ich ret 8 geschrieben).
Allerdings scheint der obige Code zu stimmen, da ich ähnliche Beispiele bei google gefunden habe. Normalerweise wird der Code
durch
abgekürzt.
Zur Verdeutlichung habe ich folgendes Programm geschrieben:
x86 Disassembly/Functions and Stack Frames
Allerdings bin ich bei folgendem Eintrag sehr stutzig:
Code:
_MyFunction3:
push ebp
mov ebp, esp
sub esp, 12 ; sizeof(a) + sizeof(b) + sizeof(c)
;x = [ebp + 8], y = [ebp + 12], z = [ebp + 16]
;a = [ebp - 4] = [esp + 8], b = [ebp - 8] = [esp + 4], c = [ebp - 12] = [esp]
mov esp, ebp ;WTF?
pop ebp
ret 12 ; sizeof(x) + sizeof(y) + sizeof(z)
Code:
mov esp, ebp
Code:
ret 12
Allerdings scheint der obige Code zu stimmen, da ich ähnliche Beispiele bei google gefunden habe. Normalerweise wird der Code
Code:
mov esp, ebp
pop ebp
Code:
leave
Zur Verdeutlichung habe ich folgendes Programm geschrieben:
Code:
.data
disp_string db "%x",13,10,0
wait_string db "%d",0
.data?
_unused dd ?
.code
start:
push 0DEADBEEFh
call _MyProc
pop eax ;sollte eigentlich 0xDEADBEEF sein
push eax ;nur noch mal zur verdeutlichung pushen
push offset disp_string
call crt_printf ;hier wird definitiv nicht DEADBEEF angezeigt
;========>Daraus folgere ich: Der stack wird korrumpiert. Aber warum?
_exit:
;wait
push offset _unused
push offset wait_string
call crt_scanf
;exit
push 0
call ExitProcess
_MyProc:
push ebp
mov ebp, esp
sub esp, 8 ;2x DWORD lokale variablen
;===========>
;=====>
mov esp, ebp
pop ebp
ret 8 ;2x DWORD
end start