Solución:
El último
POP EBP
es equivalente a
MOV EBP, [ESP]
ADD ESP, 4 ; but without modifying flags, like LEA ESP, [ESP+4]
(en la sintaxis Intel: destino a la izquierda, fuente a la derecha)
PUSH <src>
lo hace:
ESP := ESP-4 ; for x86; -8 for x64
MEMORY[ESP]:=<operandvalue>
POP <dst>
lo hace:
<operandtarget>:=MEMORY[ESP];
ESP:=ESP+4 ; for x86; +8 for x64
Es mucho más fácil entender qué hacen las instrucciones de la máquina si escribe sus descripciones en un pseudocódigo como este. Los manuales de referencia de Intel están llenos de este tipo de pseudocódigo, y vale la pena su tiempo y esfuerzo para obtenerlos y leer los detalles usted mismo. (por ejemplo, en el extracto HTML https://www.felixcloutier.com/x86/push y https://www.felixcloutier.com/x86/pop)
Respecto a tu pregunta específica: Tu tienda de $5
dentro -4(%esp)
es una instrucción de máquina válida, y el procesador la ejecutará sin quejarse, pero en realidad es una programación extremadamente insegura. Si el procesador toma una trampa o interrumpe justo después de esa instrucción, el estado del procesador (generalmente) se guarda “en la parte superior de la pila” y sobrescribirá su valor. Dado que las interrupciones ocurren de forma asincrónica, el comportamiento que verá es que, rara vez, los $ 5 se pierden. Eso lo convierte en un programa extremadamente difícil de depurar.
El “agregar $ 4” mueve el ESP de regreso al lugar antes de la instrucción de empuje. Por lo tanto, no puede decir nada sobre el valor que aparece en ebp, excepto que es “desconocido”, como sugirió como una de sus opciones.
Consulte el blog de Raymond Chen para obtener detalles sobre por qué escribir debajo de ESP no es seguro incluso en el espacio de usuario en Windows. (Las interrupciones no usarán la pila de espacio de usuario de forma asincrónica, pero algunas cosas pueden hacerlo). En los que no son Windows, los manejadores de señales POSIX pueden pisar el espacio debajo del ESP de espacio de usuario. (Excepto en x86-64 System V, donde la ABI define una “zona roja” de 128 bytes por debajo de RSP que es seguro de usar).