【汇编】C++ 函数调用之——有参无返回调用(传指针)
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
一.傳值
二.傳指針(地址)
傳地址調(diào)用函數(shù)顧名思義,就是向被調(diào)函數(shù)傳遞的是一個(gè)地址值,而不是數(shù)據(jù)內(nèi)容,這個(gè)地址通常是一個(gè)32位無符號(hào)整數(shù),表示為十六進(jìn)制就是形如:0x???? ????,在實(shí)際內(nèi)存中是以(DWORD)形式存放?,這就是指針類型在內(nèi)存中通常占用4字節(jié)的原因。
有源代碼:
main函數(shù)中對應(yīng)的匯編碼如下所示:
//call func int a; func(&a); 00911438 lea eax,[ebp-0Ch] 0091143B push eax 0091143C call 009111D1 00911441 add esp,4 //可以看到,傳指針時(shí),有一個(gè)lea指令,該指令是將局部變量a的地址也就是ebp-0ch傳送給寄存器eax //然后將eax壓棧,換句話說壓棧的內(nèi)容是&a(ebp-0ch) //后續(xù)操作和之前介紹的傳值調(diào)用一致
為了更直觀一些,我們在內(nèi)存窗口查看這個(gè)地址放在哪兒了。然后由這個(gè)地址找到a所在內(nèi)存單元,看是不是0xCCCCCCCC(請參考)
&a=0x0109FEE0
PUSH &a
再看看func函數(shù):
*b=10; 009113EE mov eax,dword ptr [ebp+8] //從棧底偏移+8處取出調(diào)用時(shí)push的&a,從內(nèi)存中也可以看出正好是放在那里的 009113F1 mov dword ptr [eax],0Ah //注意這里eax存的是&a,作為地址然后找到對應(yīng)的內(nèi)存單元,向里面?zhèn)魉?0,就是實(shí)現(xiàn)了*b=10 內(nèi)存中是怎么樣的呢?
0x0109FEE0處:
可以看到確實(shí)變成了0a
和傳值調(diào)用唯一的不同就是參數(shù)壓棧時(shí)壓的是地址而已。
如果需要向函數(shù)傳一個(gè)對象,而這個(gè)對象占用很大的一塊內(nèi)存,如果使用傳值方式,則需要在被調(diào)函數(shù)棧底下面(參數(shù)表)push一個(gè)對象,相當(dāng)于完全拷貝這個(gè)對象,占用同樣的內(nèi)存空間。
而如果使用傳指針,那么僅僅需要push一個(gè)4字節(jié)的地址值而已,對象沒有發(fā)生拷貝,大大節(jié)省了內(nèi)存和時(shí)間。這就是使用指針的高效處。
轉(zhuǎn)載于:https://my.oschina.net/ybusad/blog/147395
總結(jié)
以上是生活随笔為你收集整理的【汇编】C++ 函数调用之——有参无返回调用(传指针)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cisco路由器AAA配置
- 下一篇: s3c2440移植MQTT