Cdecl/stdcall在不同的编译器下实现有会所有不同,本人是在gcc 3.4.5下测试的。
1.无局部变量
a.刚进入函数时:
b.然后在函数体一开始执行了以下代码之后:
push ebp
mov ebp,esp
sub esp,0x8
......
c.函数末尾执行:
leave
ret
Leave其实就是使ESP+0xc,更通用一些就是EBP+0x4,ESP指向Ret EIP,然后返回,最后由函数的调用者清理堆栈,如果是stdcall的话,则在函数内执行清理堆栈操作,再执行返回操作。
2.有N个int型局部变量
a.刚进入函数时:
b.然后在函数体一开始执行了以下代码之后:
push ebp
mov ebp,esp
sub esp,( MIN(X)*0x10+0x8 );满足:MIN(X)*0x10>=N*0x4
......
也就是说,跟据局部变量的多少,临时空间的开辟是以0x10为增长量,也许是为了内存对齐吧,而且不同的编译器实现也不一样.比如有5个int型临时变量则sub esp,0x28;有8个int型临时变量也是sub esp,0x28;到有9个int型临时变量则为sub esp,0x38