最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解C++函數(shù)棧幀

 更新時(shí)間:2021年07月09日 10:02:13   作者:物隨心轉(zhuǎn)  
本文主要介紹了C++函數(shù)棧幀,詳細(xì)的介紹了C++函數(shù)棧幀的概念以及使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、什么是函數(shù)棧幀

每一次函數(shù)調(diào)用都是一個(gè)過(guò)程,為函數(shù)開(kāi)辟??臻g,用于本次函數(shù)調(diào)用中臨時(shí)變量的保存、現(xiàn)場(chǎng)保護(hù)。這塊??臻g我們稱(chēng)為函數(shù)棧幀。棧是從高地址向低地址延伸的。寄存器ebp指向當(dāng)前的棧幀的底部(高地址),寄存器esp指向當(dāng)前的棧幀的頂部(低地址)

注:esp:棧指針寄存器(extended stack pointer),其內(nèi)存放著一個(gè)指針,該指針永遠(yuǎn)指向系統(tǒng)棧最上面一個(gè)棧幀的棧頂。
bsp:基址指針寄存器(extended base pointer),其內(nèi)存放著一個(gè)指針,該指針永遠(yuǎn)指向系統(tǒng)棧最上面一個(gè)棧幀的底部。

入棧push和出棧pop

push ebp就等于將ebp的值保存到棧中,并且將當(dāng)前esp下移

pop ebp就等于將ebp的值從棧中取出來(lái),將ebp指向這個(gè)值

內(nèi)存空間大致可以用下圖表示:

二、具體原理

我們來(lái)通過(guò)運(yùn)行程序來(lái)分析,有如下程序

 int sum(int _a, int _b)
 {
	 int res = 0;
	 res = _a + _b;
 
	 return res;
 }
 
 
 int main()
 {
	 int a = 10;
	 int b = 20;
 
	 int ret = sum(a, b);
	 printf("ret=%d\n", ret);
         return 0;
}

使用vs2017調(diào)試,查看反匯編

2.1 main函數(shù)的調(diào)用

main在調(diào)用之前如圖:

2.2 sum函數(shù)的調(diào)用

sum函數(shù)在調(diào)用之前

sum函數(shù)內(nèi)的內(nèi)存分布

在上述的匯編碼中我們可以看到在函數(shù)開(kāi)始的時(shí)候,習(xí)慣上以這么l兩段代碼開(kāi)始

push ebp  
 
mov ebp,esp

按照字面上理解,上面兩句話的意思是將ebp推入棧中,之后讓ebp等于esp

在函數(shù)調(diào)用之前,將調(diào)用者的函數(shù)(caller)的ebp存入棧,以便于在執(zhí)行完畢后恢復(fù)現(xiàn)場(chǎng);

下一步,sum函數(shù)必須為它的局部變量分配空間,同時(shí),也必須為它可能用到的一些臨時(shí)變量分配空間;

 sub esp, 0cch; // 減去的值根據(jù)程序而定;

之后會(huì)根據(jù)情況看是否保存某些特定的寄存器(EBX,ESI和EDI);

而ebp的值會(huì)保持固定,局部變量和臨時(shí)存儲(chǔ)則都可以通過(guò)基準(zhǔn)指針ebp加偏移量找到;

在函數(shù)執(zhí)行完畢,控制流返回到調(diào)用者的函數(shù)(caller)之前會(huì)進(jìn)行下述操作

所謂有始有終,這是會(huì)還原上面保存的寄存器值,之后還原esp的值(上一個(gè)函數(shù)調(diào)用之前的esp被保存在固定的ebp中)與ebp值。這一過(guò)程被稱(chēng)為還原現(xiàn)場(chǎng)之后通過(guò)ret返回上一個(gè)函數(shù)。

參考:

https://blog.csdn.net/u011822516/article/details/20001765

https://blog.csdn.net/u012218309/article/details/81669227

https://www.cnblogs.com/sddai/p/9762968.html

https://blog.csdn.net/weixin_42572273/article/details/104611337

到此這篇關(guān)于深入理解C++函數(shù)棧幀 的文章就介紹到這了,更多相關(guān)C++函數(shù)棧幀 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++?異常處理機(jī)制與自定義異常體系處理方式

    C++?異常處理機(jī)制與自定義異常體系處理方式

    本節(jié)將詳細(xì)介紹C++異常處理的相關(guān)概念、用法以及如何通過(guò)自定義異常體系來(lái)滿足程序的需求,同時(shí),我們將對(duì)比C語(yǔ)言的傳統(tǒng)錯(cuò)誤處理方式,分析C++異常機(jī)制的優(yōu)缺點(diǎn),并探討標(biāo)準(zhǔn)庫(kù)中提供的異常體系,幫助開(kāi)發(fā)者更好地理解和使用C++的異常處理功能,感興趣的朋友一起看看吧
    2024-12-12
  • MFC實(shí)現(xiàn)漂亮界面之美化按鈕

    MFC實(shí)現(xiàn)漂亮界面之美化按鈕

    這篇文章主要為大家詳細(xì)介紹了MFC實(shí)現(xiàn)漂亮界面之美化按鈕,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Visual Studio 2019安裝、測(cè)試創(chuàng)建c語(yǔ)言項(xiàng)目(圖文教程)

    Visual Studio 2019安裝、測(cè)試創(chuàng)建c語(yǔ)言項(xiàng)目(圖文教程)

    這篇文章主要介紹了Visual Studio 2019安裝、測(cè)試創(chuàng)建c語(yǔ)言項(xiàng)目,Visual Studio 2019是完全免費(fèi)的,而且安裝比較簡(jiǎn)單,現(xiàn)在把安裝步驟分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • C++基類(lèi)指針和派生類(lèi)指針之間的轉(zhuǎn)換方法講解

    C++基類(lèi)指針和派生類(lèi)指針之間的轉(zhuǎn)換方法講解

    今天小編就為大家分享一篇關(guān)于C++基類(lèi)指針和派生類(lèi)指針之間的轉(zhuǎn)換方法講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • C++超詳細(xì)講解析構(gòu)函數(shù)

    C++超詳細(xì)講解析構(gòu)函數(shù)

    既然在創(chuàng)建對(duì)象時(shí)有構(gòu)造函數(shù)(給成員初始化),那么在銷(xiāo)毀對(duì)象時(shí)應(yīng)該還有一個(gè)清除成員變量數(shù)據(jù)的操作咯,析構(gòu)函數(shù)與構(gòu)造函數(shù)功能相反,析構(gòu)函數(shù)不是完成對(duì)象的銷(xiāo)毀,局部對(duì)象銷(xiāo)毀工作是由編譯器完成的。而對(duì)象在銷(xiāo)毀時(shí)會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù),完成類(lèi)的一些資源清理工作
    2022-06-06
  • C語(yǔ)言零基礎(chǔ)入門(mén)(2)

    C語(yǔ)言零基礎(chǔ)入門(mén)(2)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言零基礎(chǔ)入門(mén)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 詳解如何實(shí)現(xiàn)C++虛函數(shù)調(diào)用匯編代碼

    詳解如何實(shí)現(xiàn)C++虛函數(shù)調(diào)用匯編代碼

    多態(tài)是C++中最重要的特性之一,對(duì)虛函數(shù)的調(diào)用在C++代碼中是隨處可見(jiàn)的,本篇文章我們?cè)敿?xì)探討一下,感興趣的朋友快來(lái)看看吧
    2021-11-11
  • C語(yǔ)言中的socket編程實(shí)例代碼

    C語(yǔ)言中的socket編程實(shí)例代碼

    這篇文章主要介紹了如何用C語(yǔ)言實(shí)現(xiàn)socket編程,文中代碼非常詳細(xì),供大家學(xué)習(xí)參考,感興趣的朋友可以了解下
    2020-06-06
  • 常用排序算法的C語(yǔ)言版實(shí)現(xiàn)示例整理

    常用排序算法的C語(yǔ)言版實(shí)現(xiàn)示例整理

    這篇文章主要介紹了常用排序算法的C語(yǔ)言版實(shí)現(xiàn)示例整理,包括快速排序及冒泡排序等,基本上都給出了時(shí)間復(fù)雜度,需要的朋友可以參考下
    2016-03-03
  • Jsoncpp的安裝與使用方式

    Jsoncpp的安裝與使用方式

    JsonCpp是一個(gè)用于解析和生成JSON數(shù)據(jù)的C++庫(kù),它支持解析JSON文件或字符串到C++對(duì)象,以及將C++對(duì)象序列化回JSON格式,安裝JsonCpp可以通過(guò)命令安裝,默認(rèn)安裝動(dòng)態(tài)庫(kù),JsonCpp的使用主要涉及三個(gè)類(lèi):Json::Value用于表示JSON值
    2025-01-01

最新評(píng)論

安庆市| 玉山县| 方正县| 海兴县| 沛县| 岫岩| 麻城市| 青河县| 西贡区| 井陉县| 汤阴县| 松溪县| 沽源县| 兰西县| 牙克石市| 太和县| 开封市| 凭祥市| 宁远县| 江阴市| 正宁县| 昌平区| 大新县| 宁安市| 喀什市| 阿鲁科尔沁旗| 湛江市| 冀州市| 永修县| 浪卡子县| 武安市| 青冈县| 绥棱县| 遂溪县| 镇远县| 嘉兴市| 望江县| 涡阳县| 德化县| 绥中县| 肃宁县|