What's the purpose of the LEA instruction?
How does LEA do computation in x86?

原本LEA指令设计来取某个变量的有效地址,例如

FOO DB 50
LEA BL FOO

实际上取得了FOO这个变量的有效地址(EA),但是由于LEA这个指令本身支持复杂的地址计算,所以偶尔也被用来做简单的计算。具体方法就是传入的参数本身就是一个“有效地址”,或者说是“寄存器间接寻址”,则寄存器内的值会被拿来运算,作为有效地址。

For example

long scale(long x, long y, long z){
    long t = x + 4 * y + 12 * z;
    return t
}

实际得到的汇编代码

;假设DI = x, SI = y, DX = z
LEA AX, [DI + SI * 4] ;x + 4*y
LEA DX, [DX + DX * 2] ;z + z*2
LEA AX, [AX + DX * 4] ;(x + 4*y) + 4*(3*z)

对应x86-64的格式:

leaq (%rdi, %rsi, 4), %rax
leaq (%rdx, %rdx, 2), %rdx
leaq (%rax, %rdx, 4), %rax
ret