本文匯編代碼來(lái)自于程序反匯編Release模式下禁止優(yōu)化。 函數(shù)分為四個(gè)部分,返回值,參數(shù),函數(shù)名,函數(shù)體,其中返回值,參數(shù),還有函數(shù)內(nèi)部中的局部變量等都是數(shù)據(jù),函數(shù)體都是指令,函數(shù)名實(shí)際上內(nèi)存中就是一個(gè)4字節(jié)的地址。
下面首先寫(xiě)一個(gè)函數(shù)來(lái)解析一下函數(shù)的參數(shù): #include "stdafx.h" void add(int a) { int b=a; } int _tmain(int argc, _TCHAR* argv[]) { add(5); return 0; } 首先定義一個(gè)函數(shù)為add,參數(shù)為int類(lèi)型,寫(xiě)到這里不知道讀者是否有個(gè)疑問(wèn)參數(shù)a(粉紅色標(biāo)記)存放在什么地方了,看看調(diào)用add函數(shù)(談藍(lán)色部分)反匯編是怎么實(shí)現(xiàn)的: 013C1013 push 5 013C1015 call add (13C1000h) 013C101A add esp,4 其中紅色部分為對(duì)應(yīng)指令的地址,藍(lán)色部分為匯編指令:從中可以看出在調(diào)用函數(shù)之前做了一個(gè)工作就是壓棧,從中可以說(shuō)明函數(shù)的參數(shù)是放在棧中的。然后第二步是開(kāi)始調(diào)用函數(shù)add,()里的是函數(shù)的對(duì)應(yīng)地址,就是函數(shù)的首地址(函數(shù)名對(duì)應(yīng)的地址),接下來(lái)當(dāng)調(diào)用函數(shù)以后就會(huì)進(jìn)入函數(shù)內(nèi)部(這里在調(diào)用函數(shù)會(huì)做2步操作,其一:會(huì)把esp(堆棧指針)向低位偏移4個(gè)位置(堆棧是從高到低往上漲)然后把參數(shù)存到esp指向的位置 其二:jmp(跳轉(zhuǎn))到函數(shù)地址開(kāi)始執(zhí)行(13C1000h))。 然后在看看函數(shù)的匯編: 00C51000 push ebp 00C51001 mov ebp,esp 00C51003 sub esp,0Ch 從中可以發(fā)現(xiàn)進(jìn)入函數(shù)以后首先把上一個(gè)函數(shù)執(zhí)行到什么位置的下一條語(yǔ)句的指令地址壓棧(以便函數(shù)返回時(shí)能夠繼續(xù)向下執(zhí)行),然后是吧esp寄存器里存放的地址拷貝到ebp寄存器里 然后把esp寄存器存放的地址減去12個(gè)字節(jié)(0Ch 16進(jìn)制數(shù)12)就是把esp指針向上移動(dòng)12個(gè)字節(jié)(這里是關(guān)鍵局部函數(shù)就是這樣開(kāi)辟空間的(一個(gè)函數(shù)所能操作的棧大小取決于棧頂與棧底之間的差值,如果超出就會(huì)得到錯(cuò)誤的結(jié)果,當(dāng)超過(guò)整個(gè)操作系統(tǒng)分配給線程的棧大小時(shí),就會(huì)程序崩潰,棧溢出)),這是進(jìn)入函數(shù)需要做的準(zhǔn)備工作接下來(lái)就是函數(shù)里面具體指令: 00D71006 mov eax,dword ptr [a] 00D71009 mov dword ptr [b],eax 這里簡(jiǎn)單的一個(gè)賦值就不介紹了,接下來(lái)看看??臻g是如何回收的,函數(shù)怎么退出的: 00D7100C mov esp,ebp 00D7100E pop ebp 00D7100F ret 首先第一步是吧之前00C51001 存到寄存器ebp的值取回來(lái)存到esp中,通過(guò)這一步就重新回到了壓棧之后(00C51000)esp指向的代碼的位置(實(shí)際上是一個(gè)地址),接下來(lái)把esp指向的代碼的位置里放的值彈到ebp里,然后是ret退出這個(gè)函數(shù)(這里在調(diào)用函數(shù)會(huì)做2步操作,其一:jmp(跳轉(zhuǎn))到之前沒(méi)有進(jìn)入函數(shù)剛剛壓棧哪里,由于這里是先前壓的參數(shù)的地址 其二:會(huì)把esp(堆棧指針)向高位偏移4個(gè)位置(堆棧是從高到低往上漲),代碼地址在這個(gè)參數(shù)下面故要加4個(gè)字節(jié)): 013C101A add esp,4 |
|
來(lái)自: happy害蟲(chóng) > 《多線程》