溫馨提示×

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

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

怎么理解C語(yǔ)言的函數(shù)棧幀

發(fā)布時(shí)間:2021-11-22 13:32:32 來(lái)源:億速云 閱讀:111 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容介紹了“怎么理解C語(yǔ)言的函數(shù)棧幀”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

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

    1.寄存器

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

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

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

    2.函數(shù)棧幀

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

    ebp:棧底指針

    esp:棧頂指針

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

    怎么理解C語(yǔ)言的函數(shù)棧幀

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

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

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

    相信大家在跑代碼的時(shí)候都遇到過(guò)打印好多“燙燙燙燙燙燙燙燙燙”的情況,這其實(shí)是訪問(wèn)的內(nèi)存越界了,而錯(cuò)誤訪問(wèn)的內(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ù)棧幀對(duì)應(yīng)的ebp地址壓棧,這是為了方便我們?cè)诤瘮?shù)調(diào)用結(jié)束之后找到對(duì)應(yīng)的函數(shù)棧幀的地址。

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

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

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

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

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

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

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

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

    “怎么理解C語(yǔ)言的函數(shù)棧幀”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

    向AI問(wèn)一下細(xì)節(jié)

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

    AI