sando o LEA em valores que não são endereços / ponteiro

Eu estava tentando entender como a Instrução de Computação de Endereço funciona, especialmente comleaq comando. Então fico confuso quando vejo exemplos usandoleaq para fazer cálculos aritméticos. Por exemplo, o seguinte código C,

long m12(long x) {
return x*12;
}

Na montagem,

leaq (%rdi, %rdi, 2), %rax
salq $2, $rax

Se meu entendimento estiver correto, o leaq deve mover qualquer endereço(%rdi, %rdi, 2), que deve ser2*%rdi+%rdi, avalie para em%rax. O que me deixa confuso é que o valor x é armazenado em%rdi, que é apenas o endereço da memória, por que vezes% rdi por 3 e depois à esquerda mudam essememory address por 2 é igual x vezes 12? Não é que quando nós vezes%rdi por 3, saltamos para outro endereço de memória que não contém o valor x?

questionAnswers(3)

yourAnswerToTheQuestion