Saltar al contenido

¿Qué hace la instrucción de montaje LEAL?

Deseamos darte la mejor respuesta que encontramos en línea. Nosotros esperamos que te resulte de utilidad y si quieres aportar algo que nos pueda ayudar a mejorar siente la libertad de hacerlo..

Solución:

LEA (dirección efectiva de carga) solo calcula la Dirección del operando, en realidad no lo desreferencia. La mayoría de las veces, solo se trata de hacer un cálculo como una combinación de multiplicar y sumar para, digamos, array indexación.

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

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

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

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

se evalúa como el siguiente código ensamblador (Linux x86_64):

[ ... ]
   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  ... 
[ ... ]

Ya que %rdi / %rsi son los 1S t / 2Dakota del Norte argumentos, puedes ver que lea ... recupera el Dirección&var de una variable, mientras que mov ... carga/almacena el valorvar de lo mismo.

Es decir, en el montaje, el uso de lea en vez de mov es similar a usar la dirección de & operador en C/C++, no el (valor de) una variable en sí.

lea tiene muchos más usos que eso, pero usted preguntó explícitamente sobre la diferencia entre los dos.

Por ilustracion: mov con un operando de memoria siempre realiza un acceso a la memoria (cargar o almacenar), mientras que el operando de memoria para lea se trata simplemente como aritmética de punteros – es decir, la dirección se calcula y resuelve, pero no se accede a la memoria en la instrucción misma. Estos dos:

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

resulta lo mismo que:

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

mientras que lo siguiente:

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

multiplica el valor de %eax con cinco

Si posees algún reparo y capacidad de regenerar nuestro crónica puedes dejar una explicación y con deseo lo observaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *