Pregunta

La siguiente imagen es de Wikipedia entrada en la pila de llamadas y hay algo que Don 't entiende por completo:

text alt

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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top