神奇的leaq指令

 首先`lea`指令是`mov`指令的变种,据说,lea指令是x86体系结构中,是一条最古老但是从某个方面来讲又是最神奇的指令。 表面上看,它做的事情非常简单,根据括号里的源操作数来计算地址,然后把地址加载到目标寄存器中。 例如:leaq a(b, c, d), %rax 先计算地址a + b + c * d,然后把最终地址载到寄存器rax中。 最逗的是leaq不引用源操作数里的寄存器,只是单纯的计算。那这样的完全可以把它当作乘法指令使用。
leaw #2个字节
leal #4个字节
leaq #8个字节

例如:

  rbx * 2 :

leaq (, %rbx, 2), %rax

rbx * 3

leaq (%rbx, %rbx, 2), %rax

  rbx * 3 - 1

leaq -1(%rbx, %rbx, 2), %rax

神奇之处就在于在打算用五六条指令来完成某个乘法运算可以通过两三条lea指令来代替它。

那么为什么x86会有lea这条指令?

以下信息来自What's the purpose of the LEA instruction?

大佬的答案十分明了,这是与高级语言编译有关延伸的结果。

 
 
 
 
 
 
 
 
 
 
posted @ 2022-07-05 17:31  Yihoyo  阅读(1208)  评论(0)    收藏  举报