Comportamiento de ebp y esp en pilas usando función con parámetro

Quiero aprender más sobre la pila. Especialmente, lo que sucede cuando se llama una función con parámetro. Para esto, escribo el siguiente 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);

   }

y obtengo el siguiente código de ensamblaje (solo agregaré la parte delmain Función, porque primero quiero entender esta sección):

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

Entonces, para esta parte dibujaré un pequeño boceto para mí. Por favor, eche un vistazo :) Mi pregunta: ¿Dónde está en ese momento miebp? Debido a la línea 2 de mi código de ensamblador, debe estar en el mismo lugar como[esp], derecho ?

Ahora, la parte de la función de suma que sigue a mi segunda pregunta.

Así que aquí está el código de ensamblaje de eso:

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

Entonces, aprendí que podemos encontrar nuestros parámetros siempre en[eb+12] y[ebp+8]. (Salté el tercer parámetro porque quiero mantenerlo simple) Así que mi pregunta ahora es: si asumo queesp=ebp y miro mi boceto, luego veo que no hay nada en[esp+12] o ahora[ebp+12]. Pero sin embargo, se utiliza. ¿Cómo puedo imaginar eso?

¿Alguien me puede ayudar? He leído tantos artículos, pero nadie parece dibujar estas cosas. Por eso, es muy difícil entender eso.

¡Gracias!

Aquí está mi bosquejo:

Respuestas a la pregunta(2)

Su respuesta a la pregunta