Поведение ebp и esp в стеках с использованием функции с параметром
Я хочу узнать больше о стеке. Особенно, что происходит, когда вызывается функция с параметром. Для этого я пишу следующий код:
#include
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]
, Но тем не менее он используется. Как я могу это представить?
Кто-нибудь может мне помочь? Я'Я прочитал так много статей, но никто, кажется, не зарисовывает эти вещи. Из-за этого это очень трудно понять.
Спасибо!
Вот мой эскиз: