C語(yǔ)言函數(shù)棧幀的創(chuàng)建和銷毀介紹
在初學(xué)c語(yǔ)言中,很多時(shí)候要記的內(nèi)容有點(diǎn)多,有時(shí)候并不能深入的了解它。關(guān)于函數(shù)的棧幀可以幫助我們深入了解函數(shù)傳參的過程,讓我們了解c語(yǔ)言。
以下是我們平時(shí)接觸過,但不了解的問題:
1.為什么局部變量在未賦值前是隨機(jī)的。
2.局部變量創(chuàng)建的過程。
3.函數(shù)傳參,傳參的順序問題、
4.形參與實(shí)參的關(guān)系什么。
5.調(diào)用函數(shù)是怎么調(diào)用的,調(diào)用的過程是什么。
6.調(diào)用函數(shù)結(jié)束后,是怎樣返回的。
這些問題我們?cè)趯W(xué)??赡懿⒉粫?huì)接觸,也不會(huì)出現(xiàn)在考試的試卷上,但是作為計(jì)算機(jī)專業(yè)的學(xué)生,做一些認(rèn)識(shí)和了解是很有必要的。這就相當(dāng)于我們的內(nèi)功,在以后深入學(xué)習(xí)時(shí),就能夠更快的理解和認(rèn)識(shí)。下面就是函數(shù)調(diào)用的整個(gè)過程,學(xué)習(xí)完之后,對(duì)以上的問題就有一個(gè)答案了。
函數(shù)棧幀就是系統(tǒng)分配給函數(shù)的空間,存放的是地址。
而esp ebp,作用是來(lái)維護(hù)函數(shù)棧幀。
esp ebp跟eax ebx ecx edx一樣,就是系統(tǒng)的寄存器,有一定的存儲(chǔ)功能。
下面就以這個(gè)函數(shù)為例
int Add(int x,int y) { int z=0; z=x+y; return z; } int main() { int a=10; int b=20; int c=0; c=Add(a,b); printf("%d\n",c); return 0; }
main函數(shù)和其他函數(shù)一樣,main函數(shù)也是被調(diào)用的函數(shù)。
其基本邏輯是mainCRTStartup調(diào)用_tmainCRTStartup調(diào)用main函數(shù)
?程序運(yùn)行時(shí),ebp與ebp維護(hù)_tmainCRTStartup,起初esp處在棧頂指針的位置,而ebp處于棧底的位置。
?首先push,繼續(xù)壓棧操作,把ebp的地址打印到esp的位置上?,再把esp的值代到ebp中,esp再加上oE4h的內(nèi)存編號(hào),就形成了下圖情況。
?此時(shí)ebp與esp就來(lái)維護(hù)main函數(shù),在進(jìn)行三次push壓棧,將ebx,esi,edi,壓到棧頂。其目的是讓系統(tǒng)正常的運(yùn)行。
接下來(lái)接是lev mov mov的操作,就讓esp與ebp之間的空間的內(nèi)容全部變?yōu)閏ccccc,這就是在變量未定義前,其值都是隨機(jī)值的原因。
?接下來(lái)就要定義變量abc了,那系統(tǒng)是怎樣在棧區(qū),給abc留有空間來(lái)定義的了?就是以下三步來(lái)實(shí)現(xiàn)的~這就為abc分配了空間。
?
結(jié)果如圖
?
當(dāng)abc定義后,接下來(lái)就是函數(shù)調(diào)用,函數(shù)傳參的過程。
?系統(tǒng)是先將ab的值分別放在eax ecx的寄存器中。
下面這個(gè)操作跟main函數(shù)開辟空間是類似的。
下面藍(lán)色部分,是函數(shù)的傳參過程,由圖易知。?函數(shù)傳參實(shí)際上只是將ab的值保存在寄存器中,在臨時(shí)拷貝給x和y。
?
此時(shí)ebp-8的位置就是z所在的空間,再儲(chǔ)存再寄存器中。
?然后再將edi esi ebx彈出,ebp的地址傳給esp,再將ebp彈出,ebp與esp回到原來(lái)的位置,重新來(lái)維護(hù)main函數(shù)。
?
把儲(chǔ)存在寄存器中z的值傳給c
整個(gè)過程就是??函數(shù)棧幀的創(chuàng)建和銷毀。說(shuō)到這些,前面所提的問題就有了一定的答案,可能我認(rèn)識(shí)的只是其中的一部分,但我相信在以后,會(huì)了解更多,了解更深人,在此進(jìn)行講述出來(lái),這也算是我的目標(biāo)吧。
到此這篇關(guān)于C語(yǔ)言函數(shù)棧幀的創(chuàng)建和銷毀介紹的文章就介紹到這了,更多相關(guān)C語(yǔ)言函數(shù)棧幀的創(chuàng)建和銷毀內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Cocos2d-x學(xué)習(xí)筆記之CCLayerColor層的使用實(shí)例
這篇文章主要介紹了Cocos2d-x學(xué)習(xí)筆記之CCLayerColor層的使用實(shí)例,CCLayerColor是一個(gè)顏色布景層類,本文依然使用Hello World作為例子講解,需要的朋友可以參考下2014-09-09C語(yǔ)言進(jìn)階教程之字符函數(shù)和字符串函數(shù)
C語(yǔ)言中對(duì)字符和字符串的處理很是頻繁,但是C語(yǔ)言本身是沒有字符串類型的,字符串通常放在常量字符串中或者字符數(shù)組中,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言進(jìn)階教程之字符函數(shù)和字符串函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-11-11VisualStudio2022提交git代碼的方法實(shí)現(xiàn)
本文主要介紹了VisualStudio2022提交git代碼的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07C++調(diào)用Python基礎(chǔ)功能實(shí)例詳解
c++調(diào)用Python首先安裝Python,本文以win7為例,給大家詳細(xì)介紹C++調(diào)用Python基礎(chǔ)功能,需要的朋友參考下吧2017-04-04C 語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 web 服務(wù)器的原理解析
這篇文章主要介紹了C 語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 web 服務(wù)器的原理解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11C語(yǔ)言驅(qū)動(dòng)開發(fā)之內(nèi)核使用IO/DPC定時(shí)器詳解
本章將繼續(xù)探索驅(qū)動(dòng)開發(fā)中的基礎(chǔ)部分,定時(shí)器在內(nèi)核中同樣很常用,在內(nèi)核中定時(shí)器可以使用兩種,即IO定時(shí)器,以及DPC定時(shí)器,感興趣的可以了解一下2023-04-04C++?11新特性之右值引用使用案例與應(yīng)用場(chǎng)景
右值引用和move語(yǔ)義是C++ 11中重要的特性之一,可以提高程序的效率和性能,右值引用是一種新的引用類型,下面這篇文章主要給大家介紹了關(guān)于C++?11新特性之右值引用使用案例與應(yīng)用場(chǎng)景的相關(guān)資料,需要的朋友可以參考下2024-01-01