真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

c語(yǔ)言函數(shù)棧幀圖怎么畫(huà) c++棧幀

畫(huà)函數(shù)堆棧用什么工具站

畫(huà)函數(shù)堆棧用Python工具站

創(chuàng)新互聯(lián)建站專(zhuān)業(yè)為企業(yè)提供林周網(wǎng)站建設(shè)、林周做網(wǎng)站、林周網(wǎng)站設(shè)計(jì)、林周網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、林周企業(yè)網(wǎng)站模板建站服務(wù),10多年林周做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

Python由荷蘭數(shù)學(xué)和計(jì)算機(jī)科學(xué)研究學(xué)會(huì)的吉多·范羅蘇姆 于1990 年代初設(shè)計(jì),作為一門(mén)叫做ABC語(yǔ)言的替代品。 Python提供了高效的高級(jí)數(shù)據(jù)結(jié)構(gòu),還能簡(jiǎn)單有效地面向?qū)ο缶幊獭ython語(yǔ)法和動(dòng)態(tài)類(lèi)型,以及解釋型語(yǔ)言的本質(zhì),使它成為多數(shù)平臺(tái)上寫(xiě)腳本和快速開(kāi)發(fā)應(yīng)用的編程語(yǔ)言,隨著版本的不斷更新和語(yǔ)言新功能的添加,逐漸被用于獨(dú)立的、大型項(xiàng)目的開(kāi)發(fā)。

Python解釋器易于擴(kuò)展,可以使用C語(yǔ)言或C++(或者其他可以通過(guò)C調(diào)用的語(yǔ)言)擴(kuò)展新的功能和數(shù)據(jù)類(lèi)型。Python 也可用于可定制化軟件中的擴(kuò)展程序語(yǔ)言。Python豐富的標(biāo)準(zhǔn)庫(kù),提供了適用于各個(gè)主要系統(tǒng)平臺(tái)的源碼或機(jī)器碼。

棧幀是什么

棧幀也叫過(guò)程活動(dòng)記錄,是編譯器用來(lái)實(shí)現(xiàn)過(guò)程或函數(shù)調(diào)用的一種數(shù)據(jù)結(jié)構(gòu)。

C語(yǔ)言中,每個(gè)棧幀對(duì)應(yīng)著一個(gè)未運(yùn)行完的函數(shù)。棧幀中保存了該函數(shù)的返回地址和局部變量。

棧幀,顧名思義,就是棧中的一幀,棧分成很多幀,就如同一個(gè)視頻動(dòng)作分成好多幀一樣。每個(gè)棧幀,對(duì)應(yīng)一個(gè)函數(shù),就是這個(gè)函數(shù)在棧中占用的部分。

C語(yǔ)言函數(shù)調(diào)用棧

程序的執(zhí)行過(guò)程可看作連續(xù)的函數(shù)調(diào)用。當(dāng)一個(gè)函數(shù)執(zhí)行完畢時(shí),程序要回到調(diào)用指令的下一條指令(緊接call指令)處繼續(xù)執(zhí)行。函數(shù)調(diào)用過(guò)程通常使用堆棧實(shí)現(xiàn),每個(gè)用戶(hù)態(tài)進(jìn)程對(duì)應(yīng)一個(gè)調(diào)用棧結(jié)構(gòu)(call stack)。編譯器使用堆棧傳遞函數(shù)參數(shù)、保存返回地址、臨時(shí)保存寄存器原有值(即函數(shù)調(diào)用的上下文)以備恢復(fù)以及存儲(chǔ)本地局部變量。

不同處理器和編譯器的堆棧布局、函數(shù)調(diào)用方法都可能不同,但堆棧的基本概念是一樣的。

寄存器是處理器加工數(shù)據(jù)或運(yùn)行程序的重要載體,用于存放程序執(zhí)行中用到的數(shù)據(jù)和指令。因此函數(shù)調(diào)用棧的實(shí)現(xiàn)與處理器寄存器組密切相關(guān)。

AX(AH、AL):累加器。有些指令約定以AX(或AL)為源或目的寄存器。輸入/輸出指令必須通過(guò)AX或AL實(shí)現(xiàn),例如:端口地址為43H的內(nèi)容讀入CPU的指令為INAL,43H或INAX,43H。目的操作數(shù)只能是AL/AX,而不能是其他的寄存器。 [5]

BX(BH、BL): 基址寄存器 。BX可用作間接尋址的地址寄存器和 基地址寄存器 ,BH、BL可用作8位通用數(shù)據(jù)寄存器。 [5]

CX(CH、CL):計(jì)數(shù)寄存器。CX在循環(huán)和串操作中充當(dāng)計(jì)數(shù)器,指令執(zhí)行后CX內(nèi)容自動(dòng)修改,因此稱(chēng)為計(jì)數(shù)寄存器。 [5]

DX(DH、DL):數(shù)據(jù)寄存器。除用作通用寄存器外,在 I/O指令 中可用作端口 地址寄存器 ,乘除指令中用作輔助累加器。 [5]

2.指針和 變址寄存器

BP( Base Pointer Register):基址指針寄存器。 [5]

SP( Stack Pointer Register): 堆棧指針寄存器 。 [5]

SI( Source Index Register):源變址寄存器。 [5]

DI( Destination Index Register):目的變址寄存器。 [5]

函數(shù)調(diào)用棧的典型內(nèi)存布局如下圖所示:

圖中給出主調(diào)函數(shù)(caller)和被調(diào)函數(shù)(callee)的棧幀布局,"m(%ebp)"表示以EBP為基地址、偏移量為m字節(jié)的內(nèi)存空間(中的內(nèi)容)。該圖基于兩個(gè)假設(shè):第一,函數(shù)返回值不是結(jié)構(gòu)體或聯(lián)合體,否則第一個(gè)參數(shù)將位于"12(%ebp)" 處;第二,每個(gè)參數(shù)都是4字節(jié)大小(棧的粒度為4字節(jié))。在本文后續(xù)章節(jié)將就參數(shù)的傳遞和大小問(wèn)題做進(jìn)一步的探討。 此外,函數(shù)可以沒(méi)有參數(shù)和局部變量,故圖中“Argument(參數(shù))”和“Local Variable(局部變量)”不是函數(shù)棧幀結(jié)構(gòu)的必需部分。

其中,主調(diào)函數(shù)將參數(shù)按照調(diào)用約定依次入棧(圖中為從右到左),然后將指令指針EIP入棧以保存主調(diào)函數(shù)的返回地址(下一條待執(zhí)行指令的地址)。進(jìn)入被調(diào)函數(shù)時(shí),被調(diào)函數(shù)將主調(diào)函數(shù)的幀基指針EBP入棧,并將主調(diào)函數(shù)的棧頂指針ESP值賦給被調(diào)函數(shù)的EBP(作為被調(diào)函數(shù)的棧底),接著改變ESP值來(lái)為函數(shù)局部變量預(yù)留空間。此時(shí)被調(diào)函數(shù)幀基指針指向被調(diào)函數(shù)的棧底。以該地址為基準(zhǔn),向上(棧底方向)可獲取主調(diào)函數(shù)的返回地址、參數(shù)值,向下(棧頂方向)能獲取被調(diào)函數(shù)的局部變量值,而該地址處又存放著上一層主調(diào)函數(shù)的幀基指針值。本級(jí)調(diào)用結(jié)束后,將EBP指針值賦給ESP,使ESP再次指向被調(diào)函數(shù)棧底以釋放局部變量;再將已壓棧的主調(diào)函數(shù)幀基指針彈出到EBP,并彈出返回地址到EIP。ESP繼續(xù)上移越過(guò)參數(shù),最終回到函數(shù)調(diào)用前的狀態(tài),即恢復(fù)原來(lái)主調(diào)函數(shù)的棧幀。如此遞歸便形成函數(shù)調(diào)用棧。

EBP指針在當(dāng)前函數(shù)運(yùn)行過(guò)程中(未調(diào)用其他函數(shù)時(shí))保持不變。在函數(shù)調(diào)用前,ESP指針指向棧頂?shù)刂?,也是棧底地址。在函?shù)完成現(xiàn)場(chǎng)保護(hù)之類(lèi)的初始化工作后,ESP會(huì)始終指向當(dāng)前函數(shù)棧幀的棧頂,此時(shí),若

c語(yǔ)言 :函數(shù)調(diào)用時(shí),棧的變化問(wèn)題————(有請(qǐng)高手高手高高手)

其實(shí)想知道這些東西,單從C代碼上是看不出什么來(lái)的。反匯編后看匯編代碼一清二楚。當(dāng)一個(gè)父函數(shù)調(diào)用子函數(shù)時(shí),在父函數(shù)中先將子函數(shù)用到的參數(shù)壓入堆棧,然后再以一個(gè)call指令調(diào)用子函數(shù)。而call指令其實(shí)要做兩件事:將自己的EIP值壓入堆棧;以一個(gè)jmp跳轉(zhuǎn)到子函數(shù)代碼的開(kāi)始位置。而在子函數(shù)內(nèi),首先就是這樣:

MOV EBP,ESP

SUB ESP,0x100

... ...

也就是要將當(dāng)前ESP保存到EBP,然后用一個(gè)SUB指令開(kāi)辟子函數(shù)所用的局部?jī)?nèi)存空間。子函數(shù)對(duì)父函數(shù)的參數(shù)的引用一般都是EBP+4,EBP+8這樣的,這樣剛好就能訪問(wèn)父函數(shù)壓入堆棧的參數(shù)。而對(duì)自己申明的參數(shù)的訪問(wèn),就是EBP-0,EBP-4等等。對(duì)匯編不太熟悉的只從C代碼的邏輯上去分析這樣的問(wèn)題,而實(shí)際情況是C代碼要轉(zhuǎn)換成機(jī)器代碼,機(jī)器代碼做的一些工作只有在匯編中能看到。堆棧就是一個(gè)傳遞參數(shù)的內(nèi)存塊,編譯器在編譯代碼時(shí),自動(dòng)生成了子函數(shù)訪問(wèn)父函數(shù)參數(shù)的代碼。

不知道這樣說(shuō)能不能幫你解決問(wèn)題。


文章標(biāo)題:c語(yǔ)言函數(shù)棧幀圖怎么畫(huà) c++棧幀
文章分享:http://weahome.cn/article/ddcsssi.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部