2012-10-13 131 views
6

Duplicar posibles:
What’s the purpose of the LEA instruction?
LEA instruction?problemas para la comprensión de comando de montaje "dirección efectiva de carga"

Así que estoy trabajando en la asignación bomba binaria para la clase (tiene un montón de fases donde tiene que pasar por el código de ensamblaje de un programa y encontrar una frase de contraseña para decodificar la "bomba").

No puedo completar mi fase actual porque no entiendo el comando lea. He leído que se usa comúnmente para la aritmética, pero simplemente no entiendo cómo lo hace.

El comando que estoy viendo en particular, es

lea -0x18(%ebp), %ebx 
lea -0x8(%ebp), %esi 

seguido por un

mov -0x4 (%ebx), %eax 
add -0x8(%ebx), %eax 

en la siguiente línea de EAX y EBX se comparan, si son iguales el programa continúa, De lo contrario, la bomba explota.

He descubierto lo suficiente sobre esta fase para saber que quiere 6 números, los dos primeros son 0 y 1. Después de eso, se hacen algunas manipulaciones para determinar si el resto de la secuencia es correcta (supongo que Los comandos de lea son lo que necesito decodificar para encontrar los siguientes números).

Ahora lo que no pude encontrar es a qué se refiere el -0x18 en particular. ¿Qué hace el signo negativo? ¿indica la resta? ¿Está buscando 18 bytes antes de ebp?

Gracias por la ayuda aquí.

Respuesta

14

La instrucción LEA calcula una dirección de memoria utilizando la misma aritmética que una instrucción MOV utiliza. Pero a diferencia de la instrucción MOV, la instrucción LEA solo almacena la dirección calculada en su registro de destino, en lugar de cargar el contenido de esa dirección y almacenarla.

Tenga en cuenta su primera instrucción LEA:

lea -0x18(%ebp), %ebx 

Esta instrucción calcula la suma de -0x18 y el valor en el registro EBP. Obtiene algún resultado S. Almacena S en el registro EBX.

En el sumando -0x18, "-" es un signo negativo y "0x" significa que es una constante hexadecimal. Entonces el sumando es negativo 18 , que es -24 . Entonces, esta instrucción LEA simplemente resta 24 del valor en EBP y almacena el resultado en EBX.

Contraste esto con su instrucción MOV:

mov -0x4(%ebx), %eax 

Esta instrucción calcula la suma de -0x4 y el valor en el registro EBX. Obtiene un resultado S. Luego obtiene el valor de la palabra en la dirección S en la memoria, obteniendo un valor M. Almacena M en el registro EAX.

1

La instrucción LEA carga la dirección que se evaluará con el modo de direccionamiento particular en el registro de destino. Tenga en cuenta estos dos casos:

lea -0x18(%ebp), %ebx 
mov -0x18(%ebp), %ebx 

La primera instrucción de carga la dirección calculada como el valor actual relativa -0x18 desplazamiento de EBP en EBX. La segunda instrucción carga el contenido de la memoria en esta dirección en ebx.

La compensación negativa significa que la ubicación está debajo de la dirección en un registro y la compensación positiva significa que la ubicación está por encima de la dirección en un registro. Es común para representar una memoria con la dirección de cero en la parte inferior y las direcciones de crecer hacia la parte superior en los dibujos:

0xFFFFFFFC !_______! 
    .... 
+0x4(ebp) -> !_______! 
(ebp) ->  !_______! 
-0x4(ebp) -> !_______! 
    .... 
0x00000000 !_______! 
Cuestiones relacionadas