" />

亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

1.寄存器

一般來說,計算機中的寄存器有六種

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

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

2.函數(shù)棧幀

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

ebp:棧底指針

esp:棧頂指針

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

在這里插入圖片描述

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

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

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

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

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

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

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

2.同時將調(diào)用函數(shù)結(jié)束之后的下一步操作的地址壓棧。(根據(jù)這個地址,我們們就可以在內(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)第一步),當要使用時,就可以從相應(yīng)位置找到。

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

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

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

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

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

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

總結(jié)

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

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

相關(guān)文章

  • C語言之strtol函數(shù)用法詳解

    C語言之strtol函數(shù)用法詳解

    這篇文章主要介紹了C語言之strtol函數(shù)用法詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C與C++ 無參函數(shù)的區(qū)別解析

    C與C++ 無參函數(shù)的區(qū)別解析

    在《C++ 編程思想》:“關(guān)于無參函數(shù)聲明,C與C++有很大的差別。在C語言中,聲明int fun1(),意味著一個可以有任意數(shù)目和類型的函數(shù);而在C++中,指的卻是一個沒有參數(shù)的函數(shù)”
    2013-07-07
  • C/C++語言八大排序算法之桶排序全過程示例詳解

    C/C++語言八大排序算法之桶排序全過程示例詳解

    這篇文章主要為大家介紹了C/C++語言八大排序算法之桶排序算法過程的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • C語言中的遞歸,你真的懂了嗎?

    C語言中的遞歸,你真的懂了嗎?

    這篇文章主要給大家介紹了關(guān)于C語言中遞歸的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • C++ 智能指針深入解析

    C++ 智能指針深入解析

    以下是對C++中智能指針的使用進行了詳細的分析介紹,需要的朋友可以參考下
    2013-07-07
  • 在C++中反射調(diào)用.NET的方法(三)

    在C++中反射調(diào)用.NET的方法(三)

    在.NET與C++之間傳輸集合數(shù)據(jù)的方法是怎么樣的呢?接下來通過本文給大家分享在C++中反射調(diào)用.NET(三),需要的朋友參考下吧
    2017-02-02
  • C語言求2的n次方多種方法總結(jié)

    C語言求2的n次方多種方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于C語言求2的n次方多種方法的相關(guān)資料,求2的N次冪是一個常用的功能,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • C++ 基數(shù)排序的實現(xiàn)實例代碼

    C++ 基數(shù)排序的實現(xiàn)實例代碼

    這篇文章主要介紹了C++ 基數(shù)排序的實現(xiàn)實例代碼的相關(guān)資料,這里附有實例代碼,幫助大家學習理解,需要的朋友可以參考下
    2016-11-11
  • 關(guān)于STL中的map容器的一些總結(jié)

    關(guān)于STL中的map容器的一些總結(jié)

    對于map的學習,或者說是對STL中的容器的學習,要知道每種容器的實現(xiàn)原理,每種適合適合解決什么問題的,才是關(guān)鍵
    2013-09-09
  • C++通過COM接口操作PPT

    C++通過COM接口操作PPT

    這篇文章主要為大家詳細介紹了C++通過COM接口操作PPT的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05

最新評論