Saltar al contenido

explicación sobre la instrucción push ebp y pop ebp en ensamblaje

Solución:

Quizás te estés preguntando sobre esto:

push    ebp
mov ebp, esp
sub esp, 12

Estas líneas se conocen como el prólogo de la función de ensamblaje. Las primeras 2 instrucciones guardan el puntero base anterior (ebp) y establecen EBP para que apunte a esa posición en la pila (justo debajo de la dirección de retorno). Esto configura EBP como un puntero de marco.

los sub esp,12 line ahorra espacio para las variables locales en la función. Ese espacio se puede abordar con modos de direccionamiento como [ebp - 4]. Cualquier push / pop de argumentos de función, o el call La instrucción en sí que empuja una dirección de retorno, o marcos de pila para funciones que llamamos, ocurrirá debajo de este espacio reservado, en el ESP actual.

Al final tienes:

mov esp, ebp         ; restore ESP
pop ebp              ; restore caller's EBP
ret                  ; pop the return address into EIP

Esto es lo inverso que hace el prólogo (es decir, el epílogo), por lo que se puede restaurar el contexto anterior. A esto a veces se le llama “derribar” el marco de la pila.

(EBP no es volátil, también conocido como llamada preservada en todas las convenciones estándar de llamadas x86: si lo modifica, debe restaurar el valor de la persona que llama).

los leave La instrucción hace exactamente lo que hacen estas dos instrucciones, y algunos compiladores la utilizan para ahorrar tamaño de código. (enter 0,0 es muy lento y nunca se usa (https://agner.org/optimize/); leave es tan eficiente como mov + pop.)


Tenga en cuenta que el uso de EBP como puntero de cuadro es Opcionaly los compiladores no lo hacen para la mayoría de las funciones en código optimizado. En su lugar, guardan metadatos separados para permitir el desenrollado / retroceso de la pila.

ebp se conoce como puntero base o puntero de marco. Al ingresar a su función, la empuja (para guardar el valor de la función que llama). Entonces, copia esp, el puntero de pila, en ebp, así que eso ebp ahora apunta al marco de pila de su función. Al final de su función, entonces aparece ebp para que se restaure el valor de la función que llama.

Para alguna aclaración sobre lo que está sucediendo exactamente, el push instrucción pone el valor del registro especificado (ebp en este caso), en la pila y disminuye el puntero de la pila en la cantidad adecuada. los pop La operación es la opuesta: incrementa el puntero de la pila y toma un valor de la pila y lo coloca en el registro especificado.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *