Usando este ejemplo proveniente de wikipedia, en el que DrawSquare () llama a DrawLine (),
(Tenga en cuenta que este diagrama tiene direcciones altas en la parte inferior y direcciones bajas en la parte superior).
¿Alguien podría explicarme qué ebp
y esp
en este contexto?
Por lo que veo, diría que el puntero de la pila apunta siempre a la parte superior de la pila, y el puntero de base al comienzo de la función actual. ¿O que?
editar: me refiero a esto en el contexto de los programas de Windows
edit2: ¿Y cómo eip
funciona también?
edit3: Tengo el siguiente código de MSVC ++:
var_C= dword ptr -0Ch
var_8= dword ptr -8
var_4= dword ptr -4
hInstance= dword ptr 8
hPrevInstance= dword ptr 0Ch
lpCmdLine= dword ptr 10h
nShowCmd= dword ptr 14h
Todos ellos parecen ser dwords, por lo tanto toman 4 bytes cada uno. Entonces puedo ver que hay una brecha entre hInstance y var_4 de 4 bytes. ¿Qué son? Supongo que es la dirección de retorno, como se puede ver en la imagen de Wikipedia.
(Nota del editor: eliminó una larga cita de la respuesta de Michael, que no pertenece a la pregunta, pero se editó una pregunta de seguimiento):
Esto se debe a que el flujo de la llamada a la función es:
* Push parameters (hInstance, etc.)
* Call function, which pushes return address
* Push ebp
* Allocate space for locals
Mi pregunta (por último, ¡espero!) Ahora es, ¿qué es exactamente lo que sucede desde el instante en que hago estallar los argumentos de la función que quiero invocar hasta el final del prólogo? Quiero saber cómo evoluciona el ebp, especialmente durante esos momentos (ya entendí cómo funciona el prólogo, solo quiero saber qué está sucediendo después de haber introducido los argumentos en la pila y antes del prólogo).