Cdecl/stdcall在不同的編譯器下實(shí)現(xiàn)有會(huì)所有不同,本人是在gcc 3.4.5下測(cè)試的。
1.無局部變量
a.剛進(jìn)入函數(shù)時(shí):

b.然后在函數(shù)體一開始執(zhí)行了以下代碼之后:
push ebp
mov ebp,esp
sub esp,0x8
......
c.函數(shù)末尾執(zhí)行:
leave
ret
Leave其實(shí)就是使ESP+0xc,更通用一些就是EBP+0x4,ESP指向Ret EIP,然后返回,最后由函數(shù)的調(diào)用者清理堆棧,如果是stdcall的話,則在函數(shù)內(nèi)執(zhí)行清理堆棧操作,再執(zhí)行返回操作。
2.有N個(gè)int型局部變量
a.剛進(jìn)入函數(shù)時(shí):
b.然后在函數(shù)體一開始執(zhí)行了以下代碼之后:
push ebp
mov ebp,esp
sub esp,( MIN(X)*0x10+0x8 );滿足:MIN(X)*0x10>=N*0x4
......
也就是說,跟據(jù)局部變量的多少,臨時(shí)空間的開辟是以0x10為增長量,也許是為了內(nèi)存對(duì)齊吧,而且不同的編譯器實(shí)現(xiàn)也不一樣.比如有5個(gè)int型臨時(shí)變量則sub esp,0x28;有8個(gè)int型臨時(shí)變量也是sub esp,0x28;到有9個(gè)int型臨時(shí)變量則為sub esp,0x38