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