一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

深度剖析函數(shù)四個(gè)部分(返回值,參數(shù),函數(shù)名,函數(shù)體)

 happy害蟲(chóng) 2014-03-14
    本文匯編代碼來(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   

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多

    欧美野外在线刺激在线观看| 99久久精品视频一区二区| 99国产高清不卡视频| 国产超碰在线观看免费| 亚洲国产天堂av成人在线播放| 欧美欧美欧美欧美一区| 好吊日视频这里都是精品| 久久亚洲精品成人国产| 国产一区二区熟女精品免费| 国产黑人一区二区三区| 亚洲一区二区三区一区| 精品欧美日韩一区二区三区| 肥白女人日韩中文视频| 国产精品国产亚洲看不卡| 欧美国产日本高清在线| 亚洲国产一级片在线观看| 欧美黑人精品一区二区在线| 亚洲中文字幕综合网在线| 少妇毛片一区二区三区| 日韩欧美精品一区二区三区| 精品国模一区二区三区欧美| 欧美一级特黄特色大色大片| 欧美日韩无卡一区二区| 精品一区二区三区不卡少妇av| 国产精品一区二区丝袜| 在线日韩中文字幕一区 | 人妻偷人精品一区二区三区不卡| 国产精品一区二区香蕉视频 | 91人妻人人做人碰人人九色| 国产亚洲欧美自拍中文自拍| 大胆裸体写真一区二区| 国产精品美女午夜视频| 亚洲熟女熟妇乱色一区| 国产精品美女午夜视频| 国产亚洲精品一二三区| 日韩在线中文字幕不卡| 好吊妞在线免费观看视频| 久一视频这里只有精品| 久热99中文字幕视频在线| 成人免费观看视频免费| 日本精品视频一二三区|