" />

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

詳細(xì)理解函C語言的函數(shù)棧幀

 更新時(shí)間:2021年11月22日 11:49:07   作者:Ssorrymaker  
這篇文章主要為大家介紹了C語言的函數(shù)棧幀,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助,希望能夠給你帶來幫助

一、函數(shù)棧幀的創(chuàng)建

1.寄存器

一般來說,計(jì)算機(jī)中的寄存器有六種

分別是:eax, ebx, ecx,edx,ebp,esp

而ebp,esp這兩個(gè)寄存器中存放的是地址,與此同時(shí),這兩個(gè)地址是來維護(hù)函數(shù)棧幀的。

2.函數(shù)棧幀

每一個(gè)函數(shù)的調(diào)用,都需要在棧區(qū)為其開辟一個(gè)空間,這塊為其開辟的空間就是函數(shù)棧幀。

ebp:棧底指針

esp:棧頂指針

對于棧這種數(shù)據(jù)結(jié)構(gòu)一共有兩種棧操作
1.pop 出棧
2. push 壓棧

在這里插入圖片描述

如上圖所示,當(dāng)main函數(shù)創(chuàng)建是便是會為其開辟函數(shù)棧幀,而其函數(shù)棧幀的地址范圍則由棧頂指針:esp,棧底指針:ebp來標(biāo)識。同時(shí),ebp和esp所指示的位置會隨著函數(shù)棧幀的創(chuàng)建和銷毀而不斷的發(fā)生改變。

需要明白的是,在VS編譯器中,main函數(shù)也是由其他函數(shù)調(diào)用的

在main函數(shù)的棧幀創(chuàng)建完成之后呢,就會用一個(gè)特定值將函數(shù)棧幀內(nèi)的空間覆蓋,這個(gè)特定值就是0xcccccccc(十六進(jìn)制表示)。

相信大家在跑代碼的時(shí)候都遇到過打印好多“燙燙燙燙燙燙燙燙燙”的情況,這其實(shí)是訪問的內(nèi)存越界了,而錯(cuò)誤訪問的內(nèi)存中存放的正好就是上面那個(gè)特定值。

函數(shù)棧幀創(chuàng)建好以后,在函數(shù)中創(chuàng)建的變量便可以存放在函數(shù)棧幀中了。

3.函數(shù)中調(diào)用函數(shù)

1.如果調(diào)用的函數(shù)有參數(shù)的話,先要將參數(shù)壓棧,這里的參數(shù)是實(shí)參的一份臨時(shí)拷貝。

2.同時(shí)將調(diào)用函數(shù)結(jié)束之后的下一步操作的地址壓棧。(根據(jù)這個(gè)地址,我們們就可以在內(nèi)存中找到相應(yīng)的操作)

3.將調(diào)用之前的函數(shù)棧幀對應(yīng)的ebp地址壓棧,這是為了方便我們在函數(shù)調(diào)用結(jié)束之后找到對應(yīng)的函數(shù)棧幀的地址。

4.再次執(zhí)行函數(shù)棧幀的創(chuàng)建操作。

函數(shù)形參并不是在函數(shù)棧幀中創(chuàng)建的,而是在函數(shù)棧幀創(chuàng)建之前就已經(jīng)在棧中創(chuàng)建了(對應(yīng)第一步),當(dāng)要使用時(shí),就可以從相應(yīng)位置找到。

5.函數(shù)的返回值會存在一個(gè)寄存器中(當(dāng)函數(shù)棧幀釋放后,返回值不會隨之消失)。

二、函數(shù)棧幀的銷毀

1.將一些函數(shù)調(diào)用中使用的寄存器彈出棧。

2.修改相應(yīng)的ebp,esp的值,使其還原為函數(shù)調(diào)用前所指向的位置。具體為:出棧操作后,esp將指向當(dāng)前ebp所指向的位置,之后彈出棧中所存儲的ebp的地址,讓ebp也指向正確的位置。這也是為何要在函數(shù)調(diào)用之前存儲當(dāng)前ebp的地址。同時(shí),因?yàn)槌鰲2僮?,esp的位置也相應(yīng)的發(fā)生改變。

3.此時(shí)的棧頂元素對應(yīng)的是函數(shù)調(diào)用之后的下一條指令的地址(在調(diào)用函數(shù)之前我們就將其壓棧了),根據(jù)地址我們就可以執(zhí)行相應(yīng)的操作。之后出棧,變更esp地址。

4.執(zhí)行完第三步操作后,esp所指向的地址發(fā)生改變。同時(shí)釋放形參的空間,函數(shù)也相應(yīng)的結(jié)束了。

總結(jié)

這是函數(shù)棧幀的創(chuàng)建和銷毀,這里只是簡單的介紹,如果要理解的更透徹的話,可以查看匯編的代碼

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C++學(xué)習(xí)小結(jié)之?dāng)?shù)據(jù)類型及轉(zhuǎn)換方式

    C++學(xué)習(xí)小結(jié)之?dāng)?shù)據(jù)類型及轉(zhuǎn)換方式

    本文給大家分享的是本人在學(xué)習(xí)C++過程中的一個(gè)小心得,關(guān)于數(shù)據(jù)類型和轉(zhuǎn)換方式的,這里記錄下來,推薦給菜鳥們,高手大神請直接飄過。
    2015-07-07
  • 基于C++編寫一個(gè)Json解析器

    基于C++編寫一個(gè)Json解析器

    這篇文章主要為大家詳細(xì)介紹了如何基于C++編寫一個(gè)Json解析器,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下
    2023-03-03
  • C++基于遞歸和非遞歸算法判定兩個(gè)二叉樹結(jié)構(gòu)是否完全相同(結(jié)構(gòu)和數(shù)據(jù)都相同)

    C++基于遞歸和非遞歸算法判定兩個(gè)二叉樹結(jié)構(gòu)是否完全相同(結(jié)構(gòu)和數(shù)據(jù)都相同)

    這篇文章主要介紹了C++基于遞歸和非遞歸算法判定兩個(gè)二叉樹結(jié)構(gòu)是否完全相同,若判斷二叉樹的結(jié)構(gòu)和數(shù)據(jù)都相同則為完全相同.涉及C++二叉樹的創(chuàng)建、遍歷、比較等相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • C++中malloc與free、new與delete的詳解與應(yīng)用

    C++中malloc與free、new與delete的詳解與應(yīng)用

    今天小編就為大家分享一篇關(guān)于C++中malloc與free、new與delete的詳解與應(yīng)用,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 深入探索C++中stack和queue的底層實(shí)現(xiàn)

    深入探索C++中stack和queue的底層實(shí)現(xiàn)

    這篇文章主要介紹了C++中的stack和dequeue的底層實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • 用C語言實(shí)現(xiàn)圣誕樹(簡易版+進(jìn)階版)

    用C語言實(shí)現(xiàn)圣誕樹(簡易版+進(jìn)階版)

    大家好,本篇文章主要講的是用C語言實(shí)現(xiàn)圣誕樹(簡易版+進(jìn)階版),感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++超詳細(xì)分析紅黑樹

    C++超詳細(xì)分析紅黑樹

    這一篇我要跟大家介紹二叉搜索樹中的另一顆樹——紅黑樹,它主要是通過控制顏色來控制自身的平衡,但它的平衡沒有AVL樹的平衡那么嚴(yán)格
    2022-03-03
  • STL中的string你了解嗎

    STL中的string你了解嗎

    這篇文章主要為大家詳細(xì)介紹了STL中的string,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Matlab實(shí)現(xiàn)遺傳算法的示例詳解

    Matlab實(shí)現(xiàn)遺傳算法的示例詳解

    這篇文章主要為大家詳細(xì)介紹了什么是遺傳算法,以及如何利用Matlab從零開始自己寫一個(gè)遺傳算法函數(shù),文中的代碼對我們學(xué)習(xí)有一定幫助,需要的可以參考一下
    2022-03-03
  • C語言實(shí)現(xiàn)職工工資管理系統(tǒng)

    C語言實(shí)現(xiàn)職工工資管理系統(tǒng)

    這篇文章主要介紹了C語言實(shí)現(xiàn)職工工資管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評論

奉新县| 东至县| 邯郸市| 攀枝花市| 湘潭市| 高清| 寿光市| 平度市| 徐州市| 云南省| 铜山县| 宝鸡市| 新沂市| 淮北市| 新沂市| 灵台县| 昭平县| 张家川| 南宁市| 舒城县| 江油市| 阿拉善盟| 当阳市| 兴义市| 凉城县| 安陆市| 清徐县| 肇东市| 饶河县| 兴化市| 柏乡县| 盱眙县| 宜黄县| 都昌县| 盐池县| 历史| 朝阳区| 益阳市| 四平市| 吉林省| 鱼台县|