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?