溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何進行C語言函數(shù)棧幀的創(chuàng)建和銷毀分析

發(fā)布時間:2021-12-18 09:41:59 來源:億速云 閱讀:124 作者:柒染 欄目:開發(fā)技術(shù)

如何進行C語言函數(shù)棧幀的創(chuàng)建和銷毀分析,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

以下是我們平時接觸過,但不了解的問題:

1.為什么局部變量在未賦值前是隨機的。

2.局部變量創(chuàng)建的過程。

3.函數(shù)傳參,傳參的順序問題、

4.形參與實參的關(guān)系什么。

5.調(diào)用函數(shù)是怎么調(diào)用的,調(diào)用的過程是什么。

6.調(diào)用函數(shù)結(jié)束后,是怎樣返回的。

這些問題我們在學(xué)??赡懿⒉粫佑|,也不會出現(xiàn)在考試的試卷上,但是作為計算機專業(yè)的學(xué)生,做一些認識和了解是很有必要的。這就相當于我們的內(nèi)功,在以后深入學(xué)習(xí)時,就能夠更快的理解和認識。下面就是函數(shù)調(diào)用的整個過程,學(xué)習(xí)完之后,對以上的問題就有一個答案了。

函數(shù)棧幀就是系統(tǒng)分配給函數(shù)的空間,存放的是地址。

而esp ebp,作用是來維護函數(shù)棧幀。

esp ebp跟eax ebx ecx edx一樣,就是系統(tǒng)的寄存器,有一定的存儲功能。

下面就以這個函數(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ù)

 程序運行時,ebp與ebp維護_tmainCRTStartup,起初esp處在棧頂指針的位置,而ebp處于棧底的位置。

如何進行C語言函數(shù)棧幀的創(chuàng)建和銷毀分析

 首先push,繼續(xù)壓棧操作,把ebp的地址打印到esp的位置上 ,再把esp的值代到ebp中,esp再加上oE4h的內(nèi)存編號,就形成了下圖情況。

如何進行C語言函數(shù)棧幀的創(chuàng)建和銷毀分析

如何進行C語言函數(shù)棧幀的創(chuàng)建和銷毀分析

 此時ebp與esp就來維護main函數(shù),在進行三次push壓棧,將ebx,esi,edi,壓到棧頂。其目的是讓系統(tǒng)正常的運行。

接下來接是lev mov mov的操作,就讓esp與ebp之間的空間的內(nèi)容全部變?yōu)閏ccccc,這就是在變量未定義前,其值都是隨機值的原因。

如何進行C語言函數(shù)棧幀的創(chuàng)建和銷毀分析

如何進行C語言函數(shù)棧幀的創(chuàng)建和銷毀分析

 接下來就要定義變量abc了,那系統(tǒng)是怎樣在棧區(qū),給abc留有空間來定義的了?就是以下三步來實現(xiàn)的~這就為abc分配了空間。

 如何進行C語言函數(shù)棧幀的創(chuàng)建和銷毀分析

結(jié)果如圖

 如何進行C語言函數(shù)棧幀的創(chuàng)建和銷毀分析

當abc定義后,接下來就是函數(shù)調(diào)用,函數(shù)傳參的過程。

如何進行C語言函數(shù)棧幀的創(chuàng)建和銷毀分析

 系統(tǒng)是先將ab的值分別放在eax ecx的寄存器中。

下面這個操作跟main函數(shù)開辟空間是類似的。

如何進行C語言函數(shù)棧幀的創(chuàng)建和銷毀分析

下面藍色部分,是函數(shù)的傳參過程,由圖易知。 函數(shù)傳參實際上只是將ab的值保存在寄存器中,在臨時拷貝給x和y。

如何進行C語言函數(shù)棧幀的創(chuàng)建和銷毀分析

 如何進行C語言函數(shù)棧幀的創(chuàng)建和銷毀分析

此時ebp-8的位置就是z所在的空間,再儲存再寄存器中。

如何進行C語言函數(shù)棧幀的創(chuàng)建和銷毀分析

 然后再將edi esi ebx彈出,ebp的地址傳給esp,再將ebp彈出,ebp與esp回到原來的位置,重新來維護main函數(shù)。

如何進行C語言函數(shù)棧幀的創(chuàng)建和銷毀分析

 如何進行C語言函數(shù)棧幀的創(chuàng)建和銷毀分析

把儲存在寄存器中z的值傳給c

如何進行C語言函數(shù)棧幀的創(chuàng)建和銷毀分析

關(guān)于如何進行C語言函數(shù)棧幀的創(chuàng)建和銷毀分析問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI