Esto seria lo normal:
push ebp ;salvo el valor actual de ebp
mov ebp, esp ; copio el la direccion en la que esta apuntando esp a ebp
sub esp, 16 ;bien ahora reservo 16 bytes en la pila
Cuando reservas los 16 bytes es como si estubieras haciendo los 4
push de tu code. Pero sin copiar los valores.
Bien
ebp se quedara apuntando al final de la pila por asi decirlo, y
esp al principio, abiendo entre la base
ebp y el principio
esp un espacio de 16 bytes.
Vale porque se usa ahora el
-, bien porque
ebp esta al principio como dije, y
esp se a ido sustrayendo.
push ebp
mov ebp, esp
sub esp, 16
mov [ebp-4], var1 ;
mov [ebp-8], var2 ; Pasamos las variables
mov [ebp-12], var3 ;
mov [ebp-16], var4 ;
mov esp, ebp ; dejamos esp apuntando donde estaba antes, al principio
pop ebp ; con ebp igual lo dejamos con su valor anterior
ret ; volveriamos al offset despues del call que llamo a esta funcion.
Bien este es el esquema normal, pero si te fijas, en tu code antes de llamar a la funcion pusiste los parametros antes, eso significa que no usaste
ebp si no
esp.
Vuelvo a repetir, que despues de hacer el
call, dejaste unos 20 bytes sustraidos sumando los 4 parametros y el offset para
ret.
Bien despues de hacer la llamada salvas de nuevo ebp, y copias el offset actual de
esp a este. Y luego reservas X bytes para variables o lo que sea, si quieres tomar los valores de los
push tienes que hacerlo con el sumar logico.
mov eax, [ebp+20] ;1 valor
mov ebx, [ebp+16] ; 2 valor
mov ecx, [ebp+12] ; 3 valor
mov edx, [ebp+8] ; 4 valor
En el
+4 estaria el offset de ret, y sin nada pues el valor de ebp. Y ahora podrias seguir el mismo metodo de arriba para variables o lo que sea.
No se si esto responde tu pregunta.
Un saludo.