ensamblador ejemplos assembler assembly x86 stack push pop

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)