Zachowanie ebp i esp w stosach przy użyciu funkcji z parametrem

chcę dowiedzieć się więcej o stosie. Zwłaszcza, co się dzieje, gdy wywoływana jest funkcja z parametrem. W tym celu piszę następujący kod:

    #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);

   }

i otrzymuję następujący kod zgromadzenia (dodam tylko częśćmain funkcja, ponieważ najpierw chcę zrozumieć tę sekcję):

    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
    ........
    ........

Więc w tej części narysuję dla siebie mały szkic. Proszę spojrzeć :) Moje pytanie: Gdzie jest w tym momencie mojeebp? Ze względu na linię 2 mojego kodu asemblera musi znajdować się w tym samym miejscu, co[esp], dobrze ?

Teraz część funkcji sumy, która wynika z mojego drugiego pytania.

więc oto kod montażu tego:

    push ebp
    mov ebp, esp
    sub esp, 16
    mov eax, DWORD PTR[ebp+12]
    mov edx, DWORD PTR[ebp+8]
    mov edx, eax
    ------------

więc dowiedziałem się, że możemy zawsze znaleźć nasze parametry[eb+12] i[ebp+8]. (Pominąłem trzeci parametr, ponieważ chcę to uprościć). Moje pytanie brzmi teraz: jeśli założę toesp=ebp i patrzę na mój szkic, a potem widzę, że nic nie ma[esp+12] lub teraz[ebp+12]. Niemniej jednak jest on używany. Jak mogę to sobie wyobrazić?

Czy ktoś może mi pomóc? Przeczytałem tak wiele dokumentów, ale nikt nie wydaje się szkicować tych rzeczy. Z tego powodu bardzo trudno to zrozumieć.

Dziękuję Ci!

Oto mój szkic:

questionAnswers(2)

yourAnswerToTheQuestion