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

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

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

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

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

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

入棧push和出棧pop

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

pop ebp就等于將ebp的值從棧中取出來,將ebp指向這個值

內(nè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ù)開始的時候,習(xí)慣上以這么l兩段代碼開始

push ebp  
 
mov ebp,esp

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

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

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

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

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

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

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

所謂有始有終,這是會還原上面保存的寄存器值,之后還原esp的值(上一個函數(shù)調(diào)用之前的esp被保存在固定的ebp中)與ebp值。這一過程被稱為還原現(xiàn)場之后通過ret返回上一個函數(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

    C語言零基礎(chǔ)入門(2)

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

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

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

    C語言中的socket編程實例代碼

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

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

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

    Jsoncpp的安裝與使用方式

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

最新評論

花莲县| 林西县| 高淳县| 渝中区| 永新县| 湛江市| 德阳市| 府谷县| 甘孜| 刚察县| 界首市| 瑞安市| 新余市| 衡东县| 宜兴市| 津南区| 靖州| 晋城| 清原| 兴海县| 临邑县| 常熟市| 承德县| 嘉峪关市| 萨嘎县| 广南县| 蒲江县| 长海县| 葵青区| 桐城市| 宽城| 禹州市| 吴忠市| 咸宁市| 怀宁县| 千阳县| 苏州市| 永顺县| 万全县| 金昌市| 廉江市|