根據不同的
作業系統,乙個程序可能被分配到不同的記憶體區域去執行。但是不管什麼樣的作業系統、什麼樣的計算機
架構,程序使用的記憶體都可以按照功能大致分為以下4個部分:
(1)**區:這個區域儲存著被裝入執行的二進位制機器**,處理器會到這個區域取指並執行。
(2)資料區:用於儲存全域性變數等。
(3)堆區:程序可以在堆區動態地請求一定大小的記憶體,並在用完之後歸還給堆區。動態分配和**是堆區的特點。
(4)棧區:用於動態地儲存函式之間的關係,以保證被呼叫函式在返回時恢復到母函式中繼續執行。
對於_stdcall呼叫約定,函式呼叫時用到的指令序列大致如下:
push 引數3 ;假設該函式有3個引數,將從右向做依次入棧
push 引數2
push 引數1
push ebp ;儲存舊棧幀的底部
mov ebp,esp ;設定新棧幀的底部 (棧幀切換)
sub esp,*** ;設定新棧幀的頂部 (抬高棧頂,為新棧幀開闢空間)
以c語言
add esp,*** ;降低棧頂,**當前的棧幀
pop ebp ;將上乙個棧幀底部位置恢復到ebp
暫存器
(1)esp:棧指標暫存器(extended stack pointer),其內存放著乙個指標,該指標永遠指向系統棧最上面乙個棧幀的棧頂。
(2)ebp:基址指標暫存器(extended base pointer),其內存放著乙個指標,該指標永遠指向系統棧最上面乙個棧幀的底部。
函式棧幀:esp和ebp之間的記憶體空間為當前棧幀,ebp標識了當前棧幀的底部,esp標識了當前棧幀的頂部。
函式的呼叫過程(函式棧幀)
乙個完整的能實現一些基本功能的程式總要或多或少的呼叫一些函式,但函式的具體呼叫過程是怎樣的,從列印出來的結果來看,顯然是無法得知的,這就需要對函式的呼叫過程有乙個深入地研究。從簡單的 開始 include intadd int x,int y intmain 進行程式除錯,檢視 呼叫堆疊 如下 可以...
函式的呼叫過程 棧幀
在談棧幀之前,我們必須要先知道c c 程式記憶體的分配情況。乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放為執行函式而分配的局 部變數 函式引數 返回資料 返回位址等。其操作方式類似於資料結構中的 棧。2 堆區 heap 一般由程式設計師分配釋...
棧幀(函式的呼叫過程)
函式 乙個函式的呼叫包括將資料 以引數和返回值的形式 和控制從 的一部分傳遞到另一部分。另外,他還必須在進入時為函式的區域性變數分配空間。並在退出時釋放這些空間。而其中資料傳遞 區域性變數的分配和釋放都是通過操縱棧來實現的。棧幀 棧用來傳遞函式引數 儲存返回資訊 儲存暫存器用以以後的恢復 以及本地儲...