Поведение 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], (Я пропустил третий параметр, потому что хочу, чтобы он был простым). Итак, мой вопрос: если я предполагаю, что =espebp и я смотрю на свой набросок, то я вижу, что нет ничего в[esp+12] или сейчас[ebp+12], Но тем не менее он используется. Как я могу это представить?

Кто-нибудь может мне помочь? Я'Я прочитал так много статей, но никто, кажется, не зарисовывает эти вещи. Из-за этого это очень трудно понять.

Спасибо!

Вот мой эскиз:

Ответы на вопрос(2)

Ваш ответ на вопрос