国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

從匯編分析C++中的引用和指針用法

2020-02-24 14:35:15
字體:
供稿:網(wǎng)友

在c++中,引用和指針具有相同的作用,都可以用來在函數(shù)里面給變函數(shù)外面對象或者變量的值,一篇從匯編分析C++中的引用和指針用法分享給各位,下面就來看他們的原理,一起往下了解吧。

首先是引用情形下的c++源碼:


void add(int a, int b, int&c) {
??? c = a + b;
}

?


int main() {
??? int a = 1;
??? int b = 2;
??? int c = 0;
??? add(a, b, c);

}


下面是main對應(yīng)的匯編碼:

?

?


; 6??? : int main() {

?

??? push??? ebp
??? mov??? ebp, esp
??? sub??? esp, 12??????????????????? ; 為該調(diào)用函數(shù)的棧空間預(yù)留12byte,用來存儲局部變量a,b, c

; 7??? :???? int a = 1;

??? mov??? DWORD PTR _a$[ebp], 1;初始化a _a$為a存儲空間地址相對于ebp基址的偏移量

; 8??? :???? int b = 2;

??? mov??? DWORD PTR _b$[ebp], 2;初始化b _b$為b存儲空間地址相對于ebp基址的偏移量

; 9??? :???? int c = 0;

??? mov??? DWORD PTR _c$[ebp], 0;初試化c _c$為c存儲空間地址相對于ebp基址的偏移量

; 10?? :???? add(a, b, c);
??? lea??? eax, DWORD PTR _c$[ebp]; 獲取c存儲空間相對于ebp基址的偏移量(即c存儲單元的偏移地址),放在寄存器eax中
??? push??? eax;保存c存儲空間的偏移量到堆棧中
??? mov??? ecx, DWORD PTR _b$[ebp];將b存儲空間里面的值(即b的值)放在寄存器ecx中
??? push??? ecx;保存b存儲空間的值到堆棧中
??? mov??? edx, DWORD PTR _a$[ebp];將a存儲空間里面的值(即a的值)放在寄存器edx里面
??? push??? edx;保存a存儲空間的到堆棧

??? ;上面push eax push ecx push edx在棧里面存儲了原來局部變量a,b,c的值,只不過對于c來說,存儲的是c存儲空間的偏移地址
??? ;因此,對于a,b來說,也就是將他們的值得一份拷貝存了起來,也就是傳值;而c只是存儲了自己存儲空間的偏移地址,也就是傳地址
??? call??? ?add@@YAXHHAAH@Z??????????? ; 調(diào)用add函數(shù),上面的語句已經(jīng)為傳遞參數(shù)做好了準(zhǔn)備
??? add??? esp, 12??????????????????? ; 由于剛才為調(diào)用函數(shù)add傳遞參數(shù)進(jìn)行了壓棧,這里釋放棧空間,即釋放參數(shù)
??????????????????????????????? ;這就是為什么函數(shù)調(diào)用完成后局部變量和參數(shù)無效的原因,因?yàn)樗麄兊目臻g被釋放了

; 11?? :????
; 12?? : }

??? xor??? eax, eax
??? mov??? esp, ebp
??? pop??? ebp
??? ret??? 0


下面是函數(shù)add對應(yīng)的匯編碼:

?

?


; 1??? : void add(int a, int b, int&c) {

?

??? push??? ebp
??? mov??? ebp, esp

; 2??? :???? c = a + b;

??? mov??? eax, DWORD PTR _a$[ebp];取參數(shù)a的值到寄存器eax中
??? add??? eax, DWORD PTR _b$[ebp];取參數(shù)b的值與eax中a的值相加,結(jié)果放到eax中
??? mov??? ecx, DWORD PTR _c$[ebp];去c的偏移地址放到寄存器ecx中
??? mov??? DWORD PTR [ecx], eax;將eax中的結(jié)果寫到由ecx指定的地址單元中去,即c所在存儲單元

; 3??? : }

??? pop??? ebp
??? ret??? 0


從上面可以看到,對于傳值,c++確實(shí)傳的是一份值拷貝,而對于引用,雖然是傳值的形式,但是其實(shí)編譯器內(nèi)部傳遞的是值得地址

?

下面是指針的情形的c++源碼:


void add(int a, int b, int* c) {
??? *c = a + b;
}

?


int main() {
??? int a = 1;
??? int b = 2;
??? int c = 0;
??? add(a, b, &c);

}


mian函數(shù)對應(yīng)的匯編碼:

?

?


; 6??? : int main() {

?

??? push??? ebp
??? mov??? ebp, esp
??? sub??? esp, 12??????????????????? ;

; 7??? :???? int a = 1;

??? mov??? DWORD PTR _a$[ebp], 1

; 8??? :???? int b = 2;

??? mov??? DWORD PTR _b$[ebp], 2

; 9??? :???? int c = 0;

??? mov??? DWORD PTR _c$[ebp], 0

; 10?? :???? add(a, b, &c);

??? lea??? eax, DWORD PTR _c$[ebp]
??? push??? eax
??? mov??? ecx, DWORD PTR _b$[ebp]
??? push??? ecx
??? mov??? edx, DWORD PTR _a$[ebp]
??? push??? edx
??? call??? ?add@@YAXHHPAH@Z??????????? ; add
??? add??? esp, 12??????????????????? ;
; 11?? :????
; 12?? : }

??? xor??? eax, eax
??? mov??? esp, ebp
??? pop??? ebp
??? ret??? 0


add函數(shù)對應(yīng)的匯編碼:

?

?


; 1??? : void add(int a, int b, int* c) {

?

??? push??? ebp
??? mov??? ebp, esp

; 2??? :???? *c = a + b;

??? mov??? eax, DWORD PTR _a$[ebp]
??? add??? eax, DWORD PTR _b$[ebp]
??? mov??? ecx, DWORD PTR _c$[ebp]
??? mov??? DWORD PTR [ecx], eax

; 3??? : }

??? pop??? ebp
??? ret??? 0


可以看到,指針和引用的匯編碼一樣,因此兩者的作用也一樣

以上就是小編分享的從匯編分析C++中的引用和指針用法,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

?

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 齐齐哈尔市| 永德县| 昌邑市| 凌源市| 昭平县| 七台河市| 渭南市| 宜春市| 遂平县| 陆丰市| 丘北县| 永安市| 扶沟县| 凌源市| 吐鲁番市| 许昌县| 本溪市| 阿拉尔市| 宁都县| 饶平县| 楚雄市| 镇江市| 来凤县| 兴文县| 江川县| 桃园县| 新巴尔虎右旗| 鄂托克旗| 正镶白旗| 锦州市| 湟中县| 井研县| 溆浦县| 五原县| 泸溪县| 普格县| 普格县| 黄冈市| 辉南县| 扎鲁特旗| 昌平区|