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

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

c語(yǔ)言函數(shù)庫(kù)棧 c語(yǔ)言的棧操作函數(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è)用戶態(tài)進(jìn)程對(duì)應(yīng)一個(gè)調(diào)用棧結(jié)構(gòu)(call stack)。編譯器使用堆棧傳遞函數(shù)參數(shù)、保存返回地址、臨時(shí)保存寄存器原有值(即函數(shù)調(diào)用的上下文)以備恢復(fù)以及存儲(chǔ)本地局部變量。

創(chuàng)新互聯(lián)自2013年創(chuàng)立以來(lái),是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元東遼做網(wǎng)站,已為上家服務(wù),為東遼各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108

不同處理器和編譯器的堆棧布局、函數(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)修改,因此稱為計(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ù)刂罚彩菞5椎刂?。在函?shù)完成現(xiàn)場(chǎng)保護(hù)之類的初始化工作后,ESP會(huì)始終指向當(dāng)前函數(shù)棧幀的棧頂,此時(shí),若

請(qǐng)問(wèn)c語(yǔ)言有沒(méi)有像c++一樣的stack庫(kù)函數(shù)?用來(lái)直接使用棧

C語(yǔ)言中包含一些標(biāo)準(zhǔn)的庫(kù)函數(shù),但是沒(méi)有像C++中的STL容器那部分全面的結(jié)構(gòu)和函數(shù)。

在C語(yǔ)言中如果想使用棧,需要自己編寫代碼,如果是簡(jiǎn)單的一次性應(yīng)用,可以用數(shù)組模擬棧的功能,如果是在一個(gè)大項(xiàng)目中反復(fù)使用,可以自己寫一個(gè)stack的庫(kù)函數(shù)。

自定義的庫(kù)函數(shù)中,至少應(yīng)該包含初始化、銷毀、入棧、出棧、取棧頂元素、判斷棧是否為空等操作。

C語(yǔ)言中的棧、堆是什么?

C語(yǔ)言中的堆和棧都是一種數(shù)據(jù)項(xiàng)按序排列的數(shù)據(jù)結(jié)構(gòu)。

棧就像裝數(shù)據(jù)的桶或箱子

我們先從大家比較熟悉的棧說(shuō)起吧,它是一種具有后進(jìn)先出性質(zhì)的數(shù)據(jù)結(jié)構(gòu),也就是說(shuō)后存放的先取,先存放的后取。

這就如同我們要取出放在箱子里面底下的東西(放入的比較早的物體),我們首先要移開(kāi)壓在它上面的物體(放入的比較晚的物體)。

堆像一棵倒過(guò)來(lái)的樹

而堆就不同了,堆是一種經(jīng)過(guò)排序的樹形數(shù)據(jù)結(jié)構(gòu),每個(gè)結(jié)點(diǎn)都有一個(gè)值。

通常我們所說(shuō)的堆的數(shù)據(jù)結(jié)構(gòu),是指二叉堆。堆的特點(diǎn)是根結(jié)點(diǎn)的值最小(或最大),且根結(jié)點(diǎn)的兩個(gè)子樹也是一個(gè)堆。

由于堆的這個(gè)特性,常用來(lái)實(shí)現(xiàn)優(yōu)先隊(duì)列,堆的存取是隨意,這就如同我們?cè)趫D書館的書架上取書。

雖然書的擺放是有順序的,但是我們想取任意一本時(shí)不必像棧一樣,先取出前面所有的書,書架這種機(jī)制不同于箱子,我們可以直接取出我們想要的書。

擴(kuò)展資料:

關(guān)于堆和棧區(qū)別的比喻

使用棧就象我們?nèi)ワ堭^里吃飯,只管點(diǎn)菜(發(fā)出申請(qǐng))、付錢、和吃(使用),吃飽了就走,不必理會(huì)切菜、洗菜等準(zhǔn)備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。

使用堆就象是自己動(dòng)手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由度大。

參考資料來(lái)源:百度百科-堆棧

C語(yǔ)言 入棧順序?yàn)槭裁春瘮?shù)入棧順序從右往左

C語(yǔ)言函數(shù)參數(shù)入棧順序從右到左是為了方便可變參數(shù)函數(shù)。

一、在函數(shù)調(diào)用時(shí),函數(shù)參數(shù)的傳遞,在C語(yǔ)言中是通過(guò)棧數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的。

在調(diào)用函數(shù)時(shí),先根據(jù)調(diào)用函數(shù)使用的參數(shù),自右向左依次壓入棧中,然后調(diào)用函數(shù),在函數(shù)開(kāi)始執(zhí)行時(shí),將參數(shù)再依次彈棧。根據(jù)棧數(shù)據(jù)結(jié)構(gòu)先進(jìn)后出的特點(diǎn),在函數(shù)中彈棧的順序就是從左向右的。

二、對(duì)于參數(shù)固定的函數(shù),無(wú)論是從左向右還是從右向左,都沒(méi)什么區(qū)別,最終都是所有參數(shù)全部傳遞。

三、對(duì)于可變參數(shù),比如printf,會(huì)在第一個(gè)參數(shù)格式字符串中,指明后續(xù)有幾個(gè)參數(shù),各自是什么類型的。于是在函數(shù)中,參數(shù)格式字符串必須第一個(gè)彈棧,否則無(wú)法獲取參數(shù)類型,也就無(wú)法獲知后續(xù)參數(shù)占幾個(gè)字節(jié),導(dǎo)致無(wú)法正確獲知參數(shù)。

四、理論上來(lái)說(shuō),如果從左向右壓棧,可變參數(shù)標(biāo)記格式字符串的參數(shù)放在最后,那么也是可以的。 不過(guò)最早設(shè)計(jì)C語(yǔ)言的人采用了這種方式,后續(xù)也就延續(xù)下來(lái)了。

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

必須出棧!

aa 和 bb 和c 都是函數(shù)內(nèi)部的局部變量,函數(shù)返回后就被釋放,也就是在棧中沒(méi)有了,返回后就剩下圖中main()函數(shù)所對(duì)應(yīng)的棧結(jié)構(gòu).

棧只能夠通過(guò)出棧來(lái)減少棧中數(shù)據(jù)的個(gè)數(shù),從反面來(lái)講,如果不出棧,funcA()函數(shù)返回后,棧指針還是指向c那,這肯定是不對(duì)的,因?yàn)楹瘮?shù)返回后棧指針就得指向man()的棧結(jié)構(gòu)了。

C語(yǔ)言函數(shù)調(diào)用(棧的實(shí)現(xiàn))

Status?StackTraverse(SqStack?S,?Status?(*pFun)(ElemType))

{

while(S.bottom?!=?S.top)

{

pFun(*--S.top);

}

return?OK;

}

//visit函數(shù)

Status?Visit(ElemType?e)

{

printf("%d\n",?e);

return?OK;

}

//調(diào)用

StackTraverse(S,?Visit);


網(wǎng)頁(yè)題目:c語(yǔ)言函數(shù)庫(kù)棧 c語(yǔ)言的棧操作函數(shù)
網(wǎng)站地址:http://weahome.cn/article/doddsis.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部