Comportamento de ebp e esp em pilhas usando função com parâmetro

Eu quero aprender mais sobre pilha. Especialmente, o que acontece quando uma função com parâmetro é chamada. Para isso, escrevo o seguinte código:

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

   }

e recebo o seguinte Código de Montagem (adicionarei apenas a parte domain função, porque primeiro eu quero entender esta seção):

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

Então, para esta parte eu desenho um pequeno esboço para mim mesmo. Por favor, dê uma olhada :) Minha pergunta: Onde está nesse ponto o meuebp? Por causa da linha 2 do meu código assembler, ele deve estar no mesmo lugar como[esp], certo ?

Agora, a parte da função soma que segue a minha segunda pergunta.

então aqui está o código de montagem disso:

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

então, eu aprendi que podemos encontrar nossos parâmetros sempre em[eb+12] e[ebp+8]. (Eu pulei o terceiro parâmetro porque eu quero mantê-lo simples) Então, a minha pergunta é agora: Se eu assumir queesp=ebp e eu olho para o meu esboço, então eu vejo que não há nada[esp+12] ou agora[ebp+12]. Mas, no entanto, é usado. Como posso imaginar isso?

Alguém pode me ajudar? Li muitos jornais, mas ninguém parece esboçar essas coisas. Por causa disso, é muito difícil entender isso.

Obrigado!

Aqui está meu esboço:

questionAnswers(2)

yourAnswerToTheQuestion