亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

理解函數(shù)棧幀

番茄西紅柿 / 1700人閱讀

摘要:同時(shí),和所指示的位置會(huì)隨著函數(shù)棧幀的創(chuàng)建和銷毀而不斷的發(fā)生改變。再次執(zhí)行函數(shù)棧幀的創(chuàng)建操作。函數(shù)的返回值會(huì)存在一個(gè)寄存器中當(dāng)函數(shù)棧幀釋放后,返回值不會(huì)隨之消失。二函數(shù)棧幀的銷毀將一些函數(shù)調(diào)用中使用的寄存器彈出棧。

一、函數(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:棧頂指針

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


如上圖所示,當(dāng)main函數(shù)創(chuàng)建是便是會(huì)為其開辟函數(shù)棧幀,而其函數(shù)棧幀的地址范圍則由棧頂指針:esp,棧底指針:ebp來標(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í)候都遇到過打印好多“燙燙燙燙燙燙燙燙燙”的情況,這其實(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ù)棧幀對(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僮鳎?strong>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é)束了。

總結(jié)

這是函數(shù)棧幀的創(chuàng)建和銷毀,這里只是簡(jiǎn)單的介紹,如果要理解的更透徹的話,可以查看匯編的代碼,更能幫助我們理解。如果有問題,歡迎大家在評(píng)論區(qū)探討。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/124083.html

相關(guān)文章

  • C語言深層理解函數(shù)棧幀的創(chuàng)建與銷毀

    摘要:語言深層理解函數(shù)中棧幀的創(chuàng)建與銷毀引言引言問題一引言問題二引言問題三一棧的簡(jiǎn)單認(rèn)識(shí)內(nèi)存的簡(jiǎn)單了解棧的簡(jiǎn)單了解棧的定義棧的結(jié)構(gòu)二寄存器與簡(jiǎn)單的匯編指令寄存器的定義寄存器的分類簡(jiǎn)單的匯編指令三棧幀的創(chuàng)建于銷毀調(diào)試調(diào)用堆棧調(diào) ...

    archieyang 評(píng)論0 收藏0
  • 【Java系列】從字節(jié)碼角度深度理解Java函數(shù)調(diào)用傳參方式

    摘要:下文將從字節(jié)碼的角度,分析中基本類型傳參和對(duì)象傳參。主函數(shù)執(zhí)行時(shí),操作棧會(huì)推入主函數(shù)棧幀,其中包含了主函數(shù)的局部變量表,字節(jié)碼,返回值等信息。主函數(shù)的棧幀會(huì)被推入棧,成為當(dāng)前操作棧。 個(gè)人網(wǎng)站地址: http://kailuncen.me/2017/06/0... 一個(gè)小問題 在開源中國(guó)看到這樣一則問題 https://www.oschina.net/quest...,其中的變量a前...

    LdhAndroid 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<