¿Por qué se deja “mover esp, ebp” en el ensamblaje x86?

Se dice que la instrucción de leave es lo mismo que:

 mov esp,ebp pop ebp 

Pero, ¿qué es mov esp,ebp aquí? No me parece válido …

mov esp,ebp establece el puntero de stack en la dirección de marco base, liberando de manera efectiva todo el marco. (No olvide que esta es la syntax de Intel, el destino es lo primero). Si no lo hizo, una vez que llame a ret , aún estaría utilizando el marco de stack de la función llamada con su función de llamada, con consecuencias crashtastic.

Creo que su problema es el hecho de que hay dos formas diferentes de escribir el ensamblaje x86. Una es la notación AT & T y la otra es la notación Intel. El orden de los argumentos de una instrucción se invierte en la notación Intel en oposición a AT & T. Su versión del ensamblado parece estar en notación Intel, lo que significa que mov esp, ebp actaully mueve el valor en ebp a esp . En la notación más lógica (en mi opinión) de AT & T, sería mov %ebp, %esp .

El comstackdor utiliza esta instrucción para liberar el espacio utilizado mediante la función en la stack, la instrucción leave tiene el mismo comportamiento que mov esp, ebp con pop ebp .