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.