lea是地址计算指令,用法是 leaq Src, Dest
。其中Src
是地址计算表达式,计算出来的地址赋值给Dest
。而mov指令中,操作数也可以是地址计算表达式:movq Src, Dest
。两者之间的区别在于,mov指令回对计算出来的这个地址进行访存操作,而lea不会。举例来说:
long m12(long x)
{
return x*12;
}
对应的汇编指令
leaq (%rdi, %rdi, 2), %rax
salq $2, %rax
%rdi中存放long型变量x的值,(%rdi, %rdi, 2)
表达式的结果是3*x,lea指令将这个值放入%rax中。
如果是movq (%rdi, %rdi, 2), %rax
呢,mov会把计算出来的这个值作为地址进行访存操作,取出这个地址上的数据赋给%rax。
P.S. lea虽然叫load effective address,但常常被用于单纯的计算。