puntero de marco, EPB, y la dirección del remitente
-
09-10-2019 - |
Pregunta
La siguiente imagen es de Wikipedia entrada en la pila de llamadas y hay algo que Don 't entiende por completo:
pensé que el puntero de marco que se almacena en el registro ebp se inicializa como tal en el prólogo *:
push ebp ; Preserve current frame pointer
mov ebp, esp ; Create new frame pointer pointing to current stack top
sub esp, 20 ; allocate 20 bytes worth of locals on stack.
Si es así, entonces no debería el puntero de marco en la imagen después de estar apuntando a la dirección de retorno y antes de que debe ser la dirección de puntero de marco anterior y antes de que la dirección de retorno? ¿Qué me falta?
Gracias!
* Tomado de: ¿Qué es exactamente el puntero base y puntero de pila? ¿A qué apuntan?
Solución
Sí, tiene usted razón, puntero apunta a una dirección donde se almacena el puntero de marco anterior, antes de que la dirección del remitente. La imagen correcta sería
| locals
+---------
frame pointer->| prev frame pointer
+--------
| return address
+--------
Otros consejos
Cuando se invoca la función. La dirección de retorno se empuja en la pila y el puntero de pila ahora apunta a la dirección de retorno. Esto es lo que sucede dentro de la función:
push ebp ; Push the ebp; The ebp address will pushed on stack and sp will be decremented
mov ebp, esp ; EBP will now point the same as ESP which is previous value of EBP
sub esp, 20 ; ESP will be subtracted further to create frame for local variables
El resultado es: EBP está apuntando al valor anterior de EBP. ESP está apuntando más de 20 bytes de ESP. Estos 20 bytes se utilizarán para vars locales.