函數的堆棧中ebp和esp的行爲我想了解有關堆棧的更多信息。特別是,當調用帶參數的函數時會發生什麼。對於這一點,我寫了下面的代碼:使用帶參數
#include <stdio.h>
int sum(int d, int e, int f){
int result = d + e + f;
return result;
}
int main(void){
int a = 5;
int b = 4;
int c = 2;
int erg = sum(a,b,c);
printf("Result is: %d", erg);
}
,我得到以下彙編代碼(我只加main
功能的一部分,因爲首先我想了解這部分):
push ebp,
mov ebp, esp
and esp, -16
sub esp, 32
mov DWORD PTR[esp+28], 5
mov DWORD PTR[esp+24], 4
mov DWORD PTR[esp+20], 2
mov eax, DWORD PTR[esp+20]
mov DWORD PTR[esp+8], eax
mov eax, DWORD PTR[esp+24]
mov DWORTD PTR[esp+4], eax
mov eax, DWORD PTR[esp+28]
mov DWORD PTR[esp], eax
call sum
........
........
因此,對於這部分我爲自己畫了一個小圖。請看看:) 我的問題:在哪裏我的ebp
?由於我的彙編代碼的第2行,它必須在[esp]
的相同位置,對吧?
現在,我的第二個問題的部分和函數。
所以這裏的是彙編代碼:
push ebp
mov ebp, esp
sub esp, 16
mov eax, DWORD PTR[ebp+12]
mov edx, DWORD PTR[ebp+8]
mov edx, eax
------------
所以,我已經瞭解到,我們總能找到在[eb+12]
和[ebp+8]
我們的參數。 (我跳過了第三個參數,因爲我想保持簡單) 所以我的問題是現在: 如果我假設esp
= ebp
,我看我的草圖,然後我看到沒有什麼[esp+12]
或現在[ebp+12]
。但是,它被使用。 我怎麼想象?
有人可以幫助我嗎?我讀過很多論文,但似乎沒有人勾畫這些東西。因此,這很難理解。
謝謝!
這裏是我的草圖: