函數(shù)調(diào)用棧圖解 計(jì)算機(jī)二級C語言。為什么棧,支持,子程序,調(diào)用?
堆棧是一個(gè)進(jìn)退線性表。只能從一端插入和刪除。當(dāng)主程序調(diào)用子函數(shù)時(shí),它保存主函數(shù)的當(dāng)前狀態(tài),然后轉(zhuǎn)移到子函數(shù)的執(zhí)行,最后將子函數(shù)的結(jié)果返回到主函數(shù)中子函數(shù)的位置,并繼續(xù)執(zhí)行,這被稱為堆棧支持的子例程。計(jì)
堆棧是一個(gè)進(jìn)退線性表。只能從一端插入和刪除。當(dāng)主程序調(diào)用子函數(shù)時(shí),它保存主函數(shù)的當(dāng)前狀態(tài),然后轉(zhuǎn)移到子函數(shù)的執(zhí)行,最后將子函數(shù)的結(jié)果返回到主函數(shù)中子函數(shù)的位置,并繼續(xù)執(zhí)行,這被稱為堆棧支持的子例程。
計(jì)算機(jī)二級C語言。為什么棧,支持,子程序,調(diào)用?
傳統(tǒng)方法不行。調(diào)用函數(shù)是一個(gè)堆棧壓縮過程。當(dāng)子函數(shù)返回時(shí),堆棧將彈出。堆棧溢出是可以的,這就是我們常說的“緩沖區(qū)溢出攻擊”,可以調(diào)用任意代碼(這是C的強(qiáng)項(xiàng))。
子程序調(diào)用子程序后可不可以直接返回主程序?
在各種通用平臺(tái)中,子程序的調(diào)用過程是相似的。讀取和解碼子程序調(diào)用指令后,首先保存當(dāng)前程序的斷點(diǎn)地址。不同的硬件平臺(tái)有不同的保存方式,有的按棧保存,有的保存到特定的寄存器中;然后將子程序的入口地址設(shè)置為當(dāng)前程序地址,然后讀取并執(zhí)行子程序。子程序結(jié)束后,通過指令返回調(diào)用點(diǎn),返回值通過寄存器或堆棧給出。CPU將取出先前保存的斷點(diǎn)地址并將其設(shè)置為當(dāng)前程序指針,然后繼續(xù)執(zhí)行主程序。因此,為了保證調(diào)用后的執(zhí)行環(huán)境與調(diào)用前相同,通常需要在子程序開始時(shí)保存相關(guān)寄存器環(huán)境,并在子程序結(jié)束前恢復(fù)這些寄存器。