Ensamblaje x86 – Instrucción “dejar”

6 minutos de lectura

Ensamblaje x86 Instruccion dejar
alexswo

Se dice que la instrucción “dejar” es similar a:

movl %ebp, %esp
popl %ebp

Yo entiendo el movl %ebp, %esp parte, y que actúa para liberar la memoria almacenada (como se discutió en esta pregunta).

Pero ¿cuál es el propósito de la popl %ebp ¿código?

  • aparece ebp .

    – usuario253751

    22 de abril de 2015 a las 8:47

  • Voto para cerrar esto porque es confuso lo que se pregunta. Usted pregunta específicamente sobre pop %ebp y eso tiene un significado fuera de LEAVE haciendo esta pregunta muy compleja. tu pregunta sobre LEAVE también es un tonto definitivo. Entonces, necesitamos saber cuál es exactamente la pregunta aquí y mantenerla atómica.

    – NO A LA GUERRA CON RUSIA

    9 oct 2018 a las 18:58


  • Curiosamente, esto es casi un engaño directo de esta pregunta stackoverflow.com/questions/41907672/…

    – NO A LA GUERRA CON RUSIA

    09/10/2018 a las 19:00

  • Para tu información: movl %ebp, %esp es la sintaxis de AT&T y significa esp=ebp. movl %esp, %ebp sería el equivalente de sintaxis de Intel.

    – Tomás

    27 de noviembre de 2021 a las 14:15


1647542227 316 Ensamblaje x86 Instruccion dejar
Miguel

LEAVE es la contrapartida de ENTER. los ENTER La instrucción configura un marco de pila presionando primero EBP en la pila y luego copia ESP dentro EBPentonces LEAVE tiene que hacer lo contrario, es decir copiar EBP para ESP y luego restaurar el viejo EBP de la pila.

Consulte la sección denominada CONVOCATORIAS DE PROCEDIMIENTO PARA LENGUAS ESTRUCTURADAS EN BLOQUES en Manual del desarrollador de software de Intel Vol 1 si quieres leer más sobre cómo ENTER y LEAVE trabajo.


enter n,0 es exactamente equivalente a (y debe ser reemplazado por)

push  %ebp
mov   %esp, %ebp     # ebp = esp,  mov  ebp,esp in Intel syntax
sub   $n, %esp       # allocate space on the stack.  Omit if n=0

leave es exactamente equivalente a

mov   %ebp, %esp     # esp = ebp,  mov  esp,ebp in Intel syntax
pop   %ebp

enter es muy lento y los compiladores no lo usan, pero leave está bien. (http://agner.org/optimizar). Los compiladores usan leave si hacen un marco de pila (al menos gcc lo hace). Pero si esp ya es igual a ebpes más eficiente simplemente pop ebp.

  • Parece que no entiendo el concepto de EBP y ESP. ¿Podría explicarme ambos términos?

    – alexswo

    22 de abril de 2015 a las 7:20

  • EBP y ESP ambos son solo registros de propósito general de 32 bits. Aunque ESP tiene una función especial, que es actuar como puntero de pila, y ciertas instrucciones lo modifican implícitamente (p. ej. push, pop, call). EBP por convención, normalmente se usa como un puntero de marco de pila dentro de las funciones.

    – Miguel

    22 de abril de 2015 a las 7:28

  • ¿Qué significa ebp y esp en un código de desmontaje? ¿Qué son los registros ESP y EBP?

    – phuclv

    22 de abril de 2015 a las 9:28


  • Para ampliar esta respuesta, LEAVE o ENTER no son dependientes unos de otros. Es decir, puede tener uno sin el otro, pero el ASM asociado debe estar presente (ya sea usando estas dos instrucciones o incluyendo explícitamente instrucciones equivalentes).

    – sherrellbc

    13 de agosto de 2017 a las 16:38

  • No (ver mi respuesta). El puntero base es la parte inferior de la pila y el puntero de la pila es la parte superior.

    – JustinCB

    27 de abril de 2018 a las 0:11

1647542228 553 Ensamblaje x86 Instruccion dejar
JustinCB

los popl instrucción restaura el puntero base, y el movl La instrucción restaura el puntero de la pila. El puntero base es la parte inferior de la pila y el puntero de la pila es la parte superior. Antes de la instrucción de salida, la pila se ve así:

----Bottom of Caller's stack----
...
Caller's
Variables
...
Function Parameters
----Top of Caller's Stack/Bottom of Callee's stack----   (%ebp)
...
Callee's
Variables
...
---Bottom of Callee's stack----    (%esp)

Después de la movl %ebp %espque desasigna la pila del destinatario, la pila se ve así:

----Bottom of Caller's stack----
...
Caller's
Variables
...
Function Parameters
----Top of Caller's Stack/Bottom of Callee's stack----   (%ebp) and (%esp)

Después de la popl %ebpque restaura la pila de la persona que llama, la pila se ve así:

----Bottom of Caller's stack----    (%ebp)
...
Caller's
Variables
...
Function Parameters
----Top of Caller's Stack----   (%esp)

los enter La instrucción guarda la parte inferior de la pila de la persona que llama y establece el puntero base para que la persona que llama pueda asignar su pila.

También tenga en cuenta que, si bien la mayoría de los compiladores de C asignan la pila de esta manera (al menos con la optimización desactivada), si escribe una función en lenguaje ensamblador, puede usar el mismo marco de pila si lo desea, pero tiene que asegúrate de pop todo fuera de la pila que usted push en él o saltará a una dirección no deseada cuando regrese (esto se debe a que call <somewhere> medio push <ret address>[or push %eip], jmp <somewhere>y ret significa saltar a la dirección en la parte superior de la pila[or pop %eip]. %eip es el registro que contiene la dirección de la instrucción actual).

  • Un bloque de código probablemente se vería mejor para sus diagramas ASCII que las líneas irregulares de backtick. Tiene algunos elementos HTML dentro de los acentos graves en el último párrafo. Y, por cierto, la mayoría de los compiladores de C no desperdician instrucciones para crear marcos de pila; -fomit-frame-pointer ha sido el valor predeterminado de gcc durante años, incluso en x86 de 32 bits (con la optimización habilitada, por supuesto).

    – Peter Cordes

    27 de abril de 2018 a las 0:19

  • No dije que desperdiciara instrucciones, solo señalé que no es necesario (muchas referencias de C dicen que se hace de esa manera). Además, usé etiquetas para los diagramas ASCII.

    – JustinCB

    27 de abril de 2018 a las 0:35

  • No, me refiero al formato de código de desbordamiento de pila: seleccione su bloque y presione control-k, o haga clic en el {} icono. Re: compiladores: estaba comentando tu mientras que los compiladores de C casi siempre asignan la pila de esta maneraque compiladores no hagas eso Y, por cierto, probablemente no deberías usar formato de código para pop todo fuera de la pilaporque no deberías usar el pop instrucción solo para incrementar esp por más de 4, solo add $12, %esp o lo que sea. pop %ecx Sin embargo, a menudo es bueno si solo lo necesita una vez.

    – Peter Cordes

    27 de abril de 2018 a las 0:39


  • Arreglé el formato para que uses el descuento de Stack Overflow. Es compatible con algo de HTML, pero por ejemplo &lt; no se procesa dentro de los acentos graves y es posible que no se procese en absoluto. Bienvenido a SO 🙂

    – Peter Cordes

    27 de abril de 2018 a las 0:43


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad