2012-06-26 45 views
12

Estoy un poco confundido acerca de la diferencia entre¿Qué hace la instrucción de ensamblaje LEAL?

leal -4(%ebp), %eax  

y

movl -4(%ebp), %eax 

Puede alguien explicar esto a mí?

+2

relacionados: http://stackoverflow.com/questions/4003894/leal-assembler-instruction – mensi

+2

y tipo de duplicados: http://stackoverflow.com/questions/1658294/x86-asm-whats-the-purpose-of-the-lea-instruction – mensi

+1

La pista está en el nombre. Cargar dirección efectiva solo carga la dirección. – harold

Respuesta

25

LEA (dirección de carga efectiva) simplemente calcula la dirección del operando, en realidad no lo desreferencia. La mayoría de las veces, solo hace un cálculo como un combinado de multiplicar y agregar para, por ejemplo, indexación de matriz.

En este caso, se está haciendo un simple sustracción numérica: leal -4(%ebp), %eax simplemente asigna a la %eax registrar el valor de %ebp - 4. Es equivalente a una sola instrucción sub, excepto que sub requiere que el destino sea el mismo que uno de los orígenes.

La instrucción movl, por el contrario, accede a la posición de memoria en %ebp - 4 y almacena ese valor en %eax.

+0

Creo que entendí eso después de un tiempo cuando vi que configuraba el registro eax para el resultado. –

1

Equivalente a LEA en sintaxis Intel, dirección de carga efectiva (¿largo?).

3

Si desea ver esto en términos de un lenguaje de programación diferente, entonces:

int var; 
[ ... ] 
func (var, &var); 

evalúa a la siguiente (Linux x86_64) código de montaje:

[ ... ] 
    4: 8b 7c 24 0c    mov 0xc(%rsp),%edi 
    8: 48 8d 74 24 0c   lea 0xc(%rsp),%rsi 
    d: e8 xx xx xx xx   callq ... <func> 
[ ... ]

Desde %rdi/%rsi son los 1 st/2 nd argumentos, se puede ver que lea ... recupera el dirección&var de una variable, mientras que mov ... carga/almacena el valor var de la misma.

I.e. en el ensamblado, el uso de lea en lugar de mov es similar al uso del operador de dirección & en C/C++, no el valor de una variable en sí misma.

lea tiene muchos más usos que eso, pero explícitamente se le preguntó acerca de la diferencia entre los dos.

Para la ilustración: mov con un operando de memoria siempre realiza un acceso de memoria (carga o tienda), mientras que el operando de memoria para lea es simplemente tratada como aritmética puntero - es decir, se calcula la dirección y resolvió pero no acceso a la memoria ocurre en la instrucción en sí.Estos dos:

lea 1234(%eax, %ebx, 8), %ecx 
movl (%ecx), ecx 

resultado de la misma como:

movl 1234(%eax, %ebx, 8), %ecx 

mientras que el siguiente:

leal (%eax, %eax, 4), %eax 

multiplica el valor en %eax con cinco.

0

Tanto LEA como MOV pueden cargar un registro con el desplazamiento en una variable , por ejemplo.

MOV también puede transferir el contenido de un lugar de memoria a un registro, LEA no puede. Tanto LEA & MOV puede calcular "compensaciones efectivas" que pueden ser utilizados para hacer matemáticas mucho más eficaz

+0

Esto no es realmente útil, en comparación con las otras respuestas que han estado funcionando durante tres años. Le recomendaría que trate de responder preguntas relativamente nuevas, o aquellas que no responden, a menos que tenga algo realmente novedoso y útil para agregar. –

Cuestiones relacionadas