摘要:函數(shù)棧幀的銷毀匯編語(yǔ)言了解函數(shù)傳參函數(shù)返回值如何返回函數(shù)中變量如何初始化和賦值函數(shù)執(zhí)行結(jié)束后系統(tǒng)進(jìn)行了什么操作
eax, ebx, ecx ...
ebp - 存放了指向函數(shù)棧幀棧底的地址
esp - 存放了指向函數(shù)棧幀棧頂?shù)牡刂?/strong>
函數(shù)被調(diào)用時(shí),系統(tǒng)會(huì)在棧區(qū)為該函數(shù)開辟一塊??臻g,這個(gè)棧空間就是該函數(shù)的函數(shù)棧幀。
以main函數(shù)的調(diào)用為例
????????棧幀也叫過程活動(dòng)記錄,是編譯器用來實(shí)現(xiàn)函數(shù)調(diào)用過程的一種數(shù)據(jù)結(jié)構(gòu)。從邏輯上講,棧幀為一個(gè)函數(shù)提供了執(zhí)行環(huán)境。
????????棧是先用高地址再用低地址,棧幀控制和保存了一個(gè)函數(shù)所需要的各種信息。
????????棧幀的維護(hù)離不開ebp和esp寄存器,ebp存放了指向棧幀的棧底地址的指針,esp則存放指向棧頂?shù)刂返闹羔槨?/span>
以main函數(shù)為例:
?
?
環(huán)境為VS2019
??#includeint 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); return 0;}??
要研究函數(shù)棧幀我們要研究c程序的匯編代碼。如圖所示:
?
?
?
?
?
?
?
?
?
?
?
?
main函數(shù)的函數(shù)棧幀的創(chuàng)建和數(shù)據(jù)初始化就完成了。
?add函數(shù)棧幀的創(chuàng)建和main函數(shù)棧幀創(chuàng)建是一樣的,值得注意的是,ADD函數(shù)執(zhí)行結(jié)束后的返回值保存在了寄存器eax中,就是避免ADD函數(shù)棧幀銷毀時(shí),主函數(shù)無法訪問ADD返回值。由此可見函數(shù)返回值是如何返回的。
1.函數(shù)傳參
?2.函數(shù)返回值如何返回
?3.函數(shù)中變量如何初始化和賦值
5.函數(shù)執(zhí)行結(jié)束后系統(tǒng)進(jìn)行了什么操作
?
?
?
?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/119302.html
摘要:這里分塊講解六函數(shù)棧幀的銷毀過程一解析的作用是將棧頂?shù)臄?shù)據(jù)彈出,彈出數(shù)據(jù)儲(chǔ)存到相應(yīng)寄存器中。 ?前言? 讀完這篇博客,你可以明白什么? ①局部變量到底是怎么在棧上創(chuàng)建的? ②為什么局部變量不初始化為隨機(jī)值? ③函數(shù)是怎么傳參的?傳參的先后順序是什么? ④形參和實(shí)參是什么關(guān)系? ⑤函數(shù)調(diào)用是怎...
摘要:調(diào)用棧是一種棧結(jié)構(gòu)它用來存儲(chǔ)計(jì)算機(jī)程序執(zhí)行時(shí)候其活躍子程序的信息。調(diào)用棧是解析器的一種機(jī)制。并形成一個(gè)棧幀任何被這個(gè)函數(shù)調(diào)用的函數(shù)會(huì)進(jìn)一步添加到調(diào)用棧中,形成另一個(gè)棧幀并且運(yùn)行到它們被上個(gè)程序調(diào)用的位置。然后調(diào)用棧繼續(xù)運(yùn)行其他部門。 大家在進(jìn)行javascript開發(fā)的時(shí)候,有沒有想過,我們寫的代碼是怎么樣運(yùn)行的呢?下面我們就來剖析一下代碼的執(zhí)行過程。 一 什么是調(diào)用棧 代碼在運(yùn)行過程...
摘要:定義默認(rèn)參數(shù)要牢記一點(diǎn)默認(rèn)參數(shù)必須指向不變對(duì)象尾遞歸調(diào)用函數(shù)本身,但是的返回值不包含表達(dá)式。而尾指針相當(dāng)于把常規(guī)的遞歸反過來,增加一層遞歸的同時(shí)釋放前一個(gè)遞歸指針,所以能夠始終保持只有一個(gè)棧幀在使用中。 教程 1、python大小寫敏感 如果字符串里面有很多字符都需要轉(zhuǎn)義,就需要加很多,為了簡(jiǎn)化,Python還允許用r表示內(nèi)部的字符串默認(rèn)不轉(zhuǎn)義 >>> print ...
摘要:下文將從字節(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前...
摘要:對(duì)于執(zhí)行引擎來說,在活動(dòng)線程中,只有位于棧頂?shù)臈攀亲钣行У姆Q為當(dāng)前棧幀與這個(gè)棧幀相關(guān)聯(lián)的方法稱為當(dāng)前方法。執(zhí)行引擎運(yùn)行的所有的字節(jié)碼指令都只針對(duì)當(dāng)前棧幀進(jìn)行操作。 showImg(https://segmentfault.com/img/bVbvueY?w=1600&h=800); 棧幀數(shù)據(jù)結(jié)構(gòu) 棧幀(Stack Frame)是用來支持虛擬機(jī)進(jìn)行方法調(diào)用和方法執(zhí)行的數(shù)據(jù)結(jié)構(gòu),它是虛...
閱讀 2544·2021-11-24 10:20
閱讀 2391·2021-09-10 10:51
閱讀 3381·2021-09-06 15:02
閱讀 3114·2019-08-30 15:55
閱讀 2841·2019-08-29 18:34
閱讀 3079·2019-08-29 12:14
閱讀 1218·2019-08-26 13:53
閱讀 2931·2019-08-26 13:43