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