¿Usa LEA en valores que no son direcciones / punteros?

Estaba tratando de entender cómo funciona la instrucción de cálculo de direcciones, especialmente conleaq comando. Entonces me confundo cuando veo ejemplos usandoleaq 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 comprensión es correcta, leaq debe mover cualquier dirección(%rdi, %rdi, 2), que debería ser2*%rdi+%rdi, evaluar en%rax. Lo que me confunde es que el valor x se almacena en%rdi, que es solo la dirección de memoria, ¿por qué veces% rdi por 3 luego se desplaza a la izquierd dirección de memoria por 2 es igual a x multiplicado por 12? ¿No es eso cuando lo hacemos%rdi por 3, saltamos a otra dirección de memoria que no tiene el valor x?

Respuestas a la pregunta(3)

Su respuesta a la pregunta