Estaba tratando de entender cómo funciona la instrucción de cálculo de direcciones, especialmente con leaq
dominio. Luego me confundo cuando veo ejemplos usando leaq
para hacer cálculos aritméticos. Por ejemplo, el siguiente código C,
long m12(long x) {
return x*12;
}
En asamblea,
leaq (%rdi, %rdi, 2), %rax
salq $2, $rax
Si mi entendimiento es correcto, leaq debería mudarse a cualquier dirección (%rdi, %rdi, 2)
que debe ser 2*%rdi+%rdi
evaluar a en %rax
. Lo que me confunde es que el valor x se almacena en %rdi
que es solo una dirección de memoria, ¿por qué multiplica %rdi por 3 y luego cambia a la izquierda? dirección de memoria por 2 es igual a x por 12? ¿No es eso cuando tenemos tiempos? %rdi
por 3, saltamos a otra dirección de memoria que no tiene el valor x?
@Johan, cerré stackoverflow.com/questions/13517083/… como un duplicado de esto, ya que tiene respuestas que dan más detalles para aclarar la confusión de los novatos sobre el uso de LEA con no punteros.
– Peter Cordes
06/10/2017 a las 21:32
Relacionado: ¿Cuál es el propósito de la instrucción LEA? es sobre todo preguntando por
lea
contramov
, que se acerca a la misma pregunta desde la dirección opuesta. Todas las respuestas allí hablan sobre usarlo para direcciones/punteros, o simplemente dicen “es un nombre estúpido para una instrucción de cambiar y agregar”, las cuales solo cuentan la mitad de la historia.– Peter Cordes
06/10/2017 a las 21:41