Pregunta

Estoy investigando el código de ensamblaje generado por GCC. Pero no entiendo:

movl $0x2d, 0x4(%esp)

En el segundo operando, ¿qué hace? 0x4 ¿representa? ¿Dirección de compensación? ¿Y qué uso de registro EAX?

¿Fue útil?

Solución

movl $0x2d, 0x4(%esp) significa tomar el valor actual del puntero de la pila (%esp), agregue 4 (0x4) Luego almacene el valor largo (de 32 bits) 0x2d en ese lugar.

los eax Registro es uno de los registros de 32 bits de propósito general. La arquitectura x86 especifica los siguientes registros de 32 bits:

eax  Accumulator Register
ebx  Base Register
ecx  Counter Register
edx  Data Register
esi  Source Index
edi  Destination Index
ebp  Base Pointer
esp  Stack Pointer

y los nombres y propósitos de algunos de los entonces regresaron a los días de la Intel 8080.

Esta página Da una buena visión general de los registros de tipo Intel. También se puede acceder a los primeros cuatro de los que están en la lista anterior como valores de 16 o dos valores de 8 bits. Por ejemplo:

3322222222221111111111
10987654321098765432109876543210
<-             eax            ->
                <-     ax     ->
                <- ah -><- al ->

Los registros de puntero y índice no permiten el uso de piezas de 8 bits, pero puede tener, por ejemplo, el de 16 bits bp.

Otros consejos

0x4(%esp) means *(%esp + 4) where * mean dereferencing.

The statement means store the immediate value 0x2d into some local variable occupying the 4th offset on the stack.

(The code you've shown is in AT&T syntax. In Intel syntax it would be mov [esp, 4], 2dh)

0x4 En el segundo operando hay un desplazamiento del valor del registro en el Parens. EAX es un registro de propósito general utilizado para la codificación de ensamblaje (cálculos, almacenamiento de valores temporales, etc.) formalmente se llama "registro de acumuladores", pero eso es más histórico que relevante.

Puedes leer esta página Acerca de la arquitectura X86. Más relevantes para su pregunta son las secciones sobre Modos de direccionamiento y Registros de propósito general

Los operandos de ensamblaje de GCC siguen un byte (b), palabra (w), largo (l), etc., como:

movb
movw
movl

Los registros tienen un prefijo con un signo porcentual (%).

Las constantes tienen un prefijo con un signo de dólar ($).

En el ejemplo anterior en su pregunta, eso significa el cuarto desplazamiento del puntero de la pila (ESP).

Espero que esto ayude, Saludos cordiales, Tom.

Está accediendo a algo que se eliminaron cuatro bytes de donde reside el puntero de la pila. En GCC, esto indica un parámetro (creo: el desplazamiento positivo es parámetros y negativo son variables locales si no recuerdo mal). Estás escribiendo, en otras palabras, el valor 0x2d en un parámetro. Si dio más contexto, probablemente podría decirle lo que estaba sucediendo en todo el procedimiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top