棧和調(diào)用函數(shù)的關(guān)系 棧用來調(diào)用函數(shù)時(shí)保護(hù)斷點(diǎn),局部變量為什么也入棧?
棧用來調(diào)用函數(shù)時(shí)保護(hù)斷點(diǎn),局部變量為什么也入棧?在堆棧中按下局部變量以釋放更多寄存器,這些寄存器可以靈活地用于實(shí)現(xiàn)特定的操作。當(dāng)操作不需要引用局部變量時(shí),局部變量在堆棧中。當(dāng)操作需要局部變量時(shí),局部變
棧用來調(diào)用函數(shù)時(shí)保護(hù)斷點(diǎn),局部變量為什么也入棧?
在堆棧中按下局部變量以釋放更多寄存器,這些寄存器可以靈活地用于實(shí)現(xiàn)特定的操作。當(dāng)操作不需要引用局部變量時(shí),局部變量在堆棧中。當(dāng)操作需要局部變量時(shí),局部變量的值從堆棧中取到寄存器。
局部變量也駐留在寄存器中,即在定義局部變量時(shí)添加寄存器。
堆棧頂部有一個(gè)指針寄存器SP。當(dāng)按下堆棧時(shí),您可以使用SP來確定某個(gè)偏移量(這些偏移量是在編譯時(shí)確定的,在運(yùn)行時(shí)找不到),以獲取存儲(chǔ)局部變量的位置,這樣您就可以從該位置讀取局部變量的值,而不必通過stack out操作獲取它們的值。
函數(shù)調(diào)用過程中棧到底是怎么壓入和彈出的?
例如:void fun(int a,int b,int c)調(diào)用fun(1,2,3)時(shí):-將斷點(diǎn)的程序指針按入堆棧-按順序?qū)?,2,1按入堆棧,并指定指向堆棧的參數(shù)變量指針。參數(shù)存儲(chǔ)位置為參數(shù)變量位置-按棧保存站點(diǎn)-執(zhí)行函數(shù)-彈出?;謴?fù)站點(diǎn)-棧指針減去參數(shù)占用字節(jié)數(shù)丟棄棧中參數(shù)-棧的先進(jìn)先出操作順序適合函數(shù)的嵌套調(diào)用,而隊(duì)列的先進(jìn)先出操作順序不合適。例如:(棧的操作在棧頂完成)main函數(shù)調(diào)用函數(shù),字段參數(shù)按棧。堆棧結(jié)構(gòu):[[top of Stack][call a field][bottom of Stack
一個(gè)函數(shù),然后調(diào)用B函數(shù):[[top of Stack
[call a field][bottom of Stack
top][call B site][call a site][Stack bottom
從B返回時(shí),可以得到剛進(jìn)入堆棧頂部的[call B site]參數(shù)。當(dāng)從返回時(shí),[call a site]參數(shù)返回到堆棧的頂部并被使用。如果是隊(duì)列,則如下所示:[[queue entry][call B site][call a site][queue exit
從B返回時(shí),隊(duì)列出口處的[call a site]參數(shù)為[call a site],因此堆棧結(jié)構(gòu)適合嵌套調(diào)用和循環(huán)。