日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

              歡迎訪問 生活随笔!

              生活随笔

              當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

              c/c++

              【汇编】C++ 函数调用之——有参无返回调用(传指针)

              發(fā)布時(shí)間:2025/3/20 c/c++ 15 豆豆
              生活随笔 收集整理的這篇文章主要介紹了 【汇编】C++ 函数调用之——有参无返回调用(传指针) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

              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é)的原因。

              有源代碼:


              void func(int *b){*b=10; }int main(int argc,char *argv[]) {//call funcint a;func(&a);return 0; } 這段代碼就是通過func函數(shù)修改main函數(shù)的一個(gè)局部變量a。


              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)容,希望文章能夠幫你解決所遇到的問題。

              如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。