assembly - assembler - ejemplos de push y pop en ensamblador
¿Cómo funciona el push y pop en el ensamblaje? (2)
PUSH hace:
ESP := ESP-4 ; for x86; -8 for x64
MEMORY[ESP]:=<operandvalue>
POP 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 escribes sus descripciones en un pseudo código como este. Los manuales de referencia de Intel están llenos de ese pseudo código, y vale la pena su tiempo y problemas para obtenerlos, y lea los detalles por usted mismo.
En cuanto a su pregunta específica: Su tienda de $ 5 a -4 (% esp) es una instrucción de máquina válida, y el procesador la ejecutará sin quejarse, pero 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, en raras ocasiones, los $ 5 se pierden. Eso hace que un programa extremadamente difícil de depurar.
El "agregar $ 4" mueve el ESP nuevamente al lugar antes de la instrucción push. Por lo tanto, no puede decir nada sobre el valor insertado en ebp, excepto que es "desconocido" como sugirió como una de sus opciones.
Me confundo sobre lo que realmente hace el pop
en el ensamblaje. ¿Mueve pop
el valor PUSH
ed en la pila al último (lo que significa que no se aplica si MOV
un valor después del último elemento PUSH
ed) o simplemente muestra el último valor de la pila (por lo tanto, se aplica a ambos MOV
y PUSH
), o aparece el valor que apunta el puntero de la pila? Considera el siguiente código:
push $4
mov $5, -4(%esp)
add $4, %esp (esp pointing to an unknown value)
pop %ebp
Entonces, ¿en este código el valor de pope en ebp
será 4, 5, o el valor desconocido apuntado por esp
?
El último
POP EBP
es equivalente a
MOV EBP, [ESP]
ADD ESP, 4 ; but without modifying flags, like LEA ESP, [ESP+4]
(en sintaxis Intel - objetivo a la izquierda, fuente a la derecha)