1.cpu中的暫存器:
通用暫存器:eax,ebx,ecx,edx
程式計數器(eip(pc)):存放當前正在執行的指令的下一條指令的位址。
棧頂:esp暫存器
棧底:ebp暫存器
2.將記憶體中的指令複製到cpu中:
讀取指令--->分析指令--->執行指令
3.什麼是棧?
>棧是一種特殊的鍊錶形式的資料結構,只允許在鍊錶的一端進行新增和刪除。
>棧有棧底和棧頂。從棧頂入棧稱為push,從棧底入棧稱為pop。
>棧是先進後出,後進先出
4.什麼 是棧幀?
下面我們看乙個**:
#include
#include
int add(int x,int y)
int main()
(1)每一次函式呼叫都是乙個過程這個過程我們稱為函式的呼叫過程,這個過程要為函式開闢棧空間,用於本次函式的呼叫中臨時變數的儲存,現場保護。這塊棧空間我們稱為函式棧幀
(2)暫存器ebp:稱為「基址指標」:指向函式幀棧底的位址。
暫存器esp:稱為「棧指標」:指向函式棧幀棧頂的位址。
比如呼叫main函式分配棧空間:
(3)當我們要詳細研究函式呼叫過程,必須得對照的彙編**。
從main函式的地方開始,要展開main函式的呼叫就得為main函式建立棧幀。
>ebp和esp用來維護函式的棧底指標和棧頂指標,push ebp:將_tmaincrtstartup的函式ebp壓棧,在棧頂開闢一塊空間放入它的ebp。
>mov ebp,esp:將esp賦給ebp,esp和ebp同時指向新開闢空間的頂端。
>sub ebp,0e4h:棧空間中元素存放順序是由高位址到低位址,則該步驟在ebp的上面開闢了0e4h大小的記憶體空間.
>lea edi,[ebp-0e4h]:將ebp-0e4h這個位址放到edi中
>mov dword ptr [ebp-8],14h:給a賦值,在esp-4處賦上10.
>mov dword ptr [ebp-8],14h:給b賦值,在esp-8處開闢空間。
>呼叫call指令:call指令(1)對當前正在執行指令的下一條指令的位址進行儲存。儲存的目的是為了恢復。將位址儲存在棧上。 (2)跳轉至目標函式的位址處。
按f11進入到add函式中:
乙個變數修改另乙個變數,只需知道乙個變數的位址然後通過指標的來訪問:
#include
#include
int add(int x,int y)
int main()
不用改變a,b的值通過改變*p的值來修改變數,來修改結果。
函式的呼叫過程 棧幀的建立和銷毀
首先我們要了解一些概念。1.棧 stack 由編譯器自動分配釋放,存放為執行函式而分配的區域性變數 函式引數 返回函式 返回位址等。操作方式類似於資料結構中的棧。棧向下生成 先定義的位址高,後定義的位址低 2.堆 heap 由程式設計師分配釋放 若程式設計師不釋放,程式結束時可能由os 分配方式類似...
函式的呼叫過程,棧幀的建立和銷毀
我們大家學習c語言肯定都知道函式,但大家可能都只會用函式,對它的了解只是上層的,並不知道它的呼叫過程,今天我們就一起來深入的研究一下函式的呼叫過程。首先,我們要知道的是,在函式呼叫時,程式將使用乙個執行時堆疊,它裡邊存區域性變數和返回位址,執行時堆疊由ebp 存放維護這個棧的棧底指標 和esp 存放...
函式的呼叫過程 函式呼叫棧幀的建立
函式的呼叫過程 我們知道每一次函式呼叫都是乙個過程,這個過程我們通常稱之為 函式的呼叫過程。而這個過程要為函式開闢棧空間,用於本次函式呼叫中臨時變數的儲存,現場保護,這塊棧空間我們稱之為 函式棧幀。而函式棧幀的維護需要兩個暫存器 esp和ebp,在呼叫過程中,這兩個暫存器存放了維護這個棧的棧頂和棧底...