int
func2
(int x,
int y)
void
func1
(void
)
push ebp
mov ebp, esp
sub esp 0cch
lea edi [edp-0cch]
mov ecx 033h
mov eax 0cccccccch
rep stos dword ptr es:[edi]
mov [bsp - 4], 1
mov [bsp - 8], 2
mov [bsp - c], 0
mov eax [bsp - 8]
push eax
mov eax [bsp - 4]
push eax
call func2
…mov esp ebp
pop ebp
ret
1、將棧幀基位址壓棧(即呼叫者棧幀基位址ebp)2、更新棧幀基位址ebp為esp;
3、更新棧幀頂位址esp;
4、初始化棧空間為0xcccccccc;
5、初始化區域性變數;
6、在呼叫函式前,將函式實參壓棧;
7、呼叫call指令跳轉到被調函式位址去(先將call指令的下一條指令壓棧,再跳轉到中間位址,再用jmp跳轉到被調函式位址去);
8、進入被調函式,重複1~7流程。
函式呼叫過程(棧幀)
眾所周知,程式每呼叫乙個函式,系統都會為其開闢一塊空間,當它返回時,才收回這塊空間。程式崩潰有一部分原因就是因為無限制的呼叫函式,卻沒有及時返回,導致記憶體空間不夠。為了更好的維護這一塊空間 通常稱為棧空間 我們需要了解兩個暫存器,乙個為 esp 指向棧頂的指標 乙個為 ebp 指向棧底的指標 棧空...
函式棧幀(呼叫過程)
函式棧幀就是在呼叫函式是為其在棧空間上開闢了一段空間,指向過程呼叫,乙個過程呼叫包括將資料 以過程引數和返回值的形式 和控制從 的一部分傳遞到另一部分。我們以以下 為例講解整個函式呼叫過程 int my add int x,int y int main 一 呼叫main 函式 我們從main 函式的...
函式呼叫過程 棧幀 呼叫約定
考慮函式呼叫 func 1,2 需要把1和2這兩個引數進行傳遞,這裡的引數傳遞可以通過兩種方式 1.引數入棧 記憶體 2.引數傳遞到暫存器 大多數情況下,也是c c 的預設形式是通過棧進行傳遞,因為雖然暫存器傳遞方式快但是暫存器數量有限 引數壓入棧中 記憶體 cs ip指向下一條指令位址需要進行跳轉...