<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
大家在學習的時候一定有以下困惑: 區域性變數是怎麼建立的?為什麼區域性變數的值是隨機值?函數是怎麼傳參?傳參的順序是怎樣的?形參與實參是什麼關係?函數呼叫是怎麼做到的?函數呼叫完成不是銷燬了嗎,如何帶回的返回值?
以上這些都可以通過了解函數棧幀的建立與銷燬來理解。接下來我就帶大家來了解函數棧幀的建立與銷燬。
本次使用的編輯器是VS2013,因為越先進的編輯器,越不容易觀察到底層。好了,我們回到正題。
暫存器裡有eax,ebx,ecx,edx,ebp,esp等,我們今天要重點了解的是ebp與esp這兩個暫存器。
這兩個暫存器中存放的是地址,整兩個地址使用來維護函數棧幀的。每一個函數呼叫,都要在棧區建立一個空間,這塊空間叫做函數棧幀,用esp與ebp來維護。
#include<stdio.h> int Add(int x, int y) { int z = 0; z = x + y; return z; } int main() { int a = 10; int b = 20; int ret = Add(a, b); printf("ret=%dn", ret); return 0; }
這個程式碼只是一個很簡單的實現了加法函數,不用多說。
接下來開始偵錯程式來看底層程式碼如何實現,首先開啟呼叫堆疊
從這裡可以清楚地知道,main函數之前還有兩個函數在呼叫,所以大家平時認為的main函數就是最初的開始是錯誤的哦。
在棧的使用中,是從高地址開始的。其中ebp指向棧底,esp指向棧頂。
main函數被呼叫後,程式會為main函數分配棧空間。接下來偵錯並右擊滑鼠轉到反組合。可以看到
這些程式碼的意思是
將ebp的值壓棧,然後將esp賦給ebp,給esp減去0E4h的大小,之後分別將ebx,esi,edi壓棧
壓棧的意思是將元素放到棧頂。在上面呼叫堆疊可以看到main函數由__tmainCRTStartup呼叫。圖解如下:
值得一提的是,在棧頂放元素是esp會自動指向新放元素的上方。
上圖中我們很容易的看出在呼叫main函數是為main函數開闢的棧空間即棧幀,並且將esp的值給ebp,ebp和esp指向同一塊空間,然後esp變小指向上面的區域,接下來將ebx,esi,edi壓棧。
接下來這四句,lea是載入有效地址,從上圖中,我們知道ebp指向的地址,那麼edi存放的就是ebp-0E4h的地址也就是③esp處的地址,最後一句rep stos dword ptr es:[edi] 意思是從edi裡面重複拷貝ecx次eax的內容。一次拷貝四個位元組,dword是四個位元組的意思。
接下來這三個組合程式碼的意思就是將值放入相應的空間。至於為什麼是為什麼是ebp-8和ebp-20,這個和編譯器有關,就不過多敘述。
由組合程式碼可知,接下來就開始建立形式引數,將要傳遞的引數值存入eax與ecx這兩個暫存器中並壓入棧頂,所以建立的形式引數並不在add函數的函數棧幀哦,並且我們之前常說的形參是實參的一份臨時拷貝無疑是非常正確的。
接下來開始add函數呼叫。call是呼叫的意思,後面是add函數的地址用來找到呼叫函數。這裡值得一提的是call指令下一條指令的地址被儲存來方便執行完add函數可以跳回來。
Add函數建立棧幀的過程其實和main函數一樣的,先將ebp壓棧方便找到指向main函數棧底的空間,再將esp的地址存放到ebp裡面,此時,esp和ebp指向同一位置,再將esp上移0CCh個位置,然後就是ebx,esi,edi壓棧,這裡不多作說明,由下圖可清晰理解:
接下來初始化z與執行加法也沒什麼要說的,z=x=y是找到之前建立的形參來進行加法。並將結果移動到z裡。
返回z的操作是將z的值存放到eax這個暫存器中,所以函數銷燬變數與返回的值這個操作並不衝突。
最後銷燬add函數棧幀,pop就是彈出元素然後把元素放入後面的暫存器,每次pop都會銷燬一個棧頂元素然後esp自動++往下挪移。三下pop之後要回收空間了,操作是把ebp的值傳給esp這樣esp指向的空間是main函數的棧頂,然後popebp這個操作會將之前棧底存放的之前存放的main函數的棧底指標傳給ebp,這樣ebp就指向了main函數的棧底。如下圖:
接下來銷燬main函數的操作也與之前一樣,就不細說了。
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45