对我来说,这就像一部时髦的电影。它的用途是什么?我应该什么时候使用它?


当前回答

LEA指令的另一个重要特征是它不会改变条件代码(如CF和ZF),而通过ADD或MUL等算术指令计算地址则会改变。这一特性降低了指令之间的依赖程度,从而为编译器或硬件调度器的进一步优化腾出了空间。

其他回答

尽管有各种解释,LEA是一种算术运算:

LEA Rt, [Rs1+a*Rs2+b] =>  Rt = Rs1 + a*Rs2 + b

只是它的名字对于shift+add操作来说非常愚蠢。其原因已经在最高评级的答案中解释过(即,它是为了直接映射高级内存引用而设计的)。

也许只是LEA指令的另一件事。您还可以使用LEA将寄存器快速乘以3、5或9。

LEA EAX, [EAX * 2 + EAX]   ;EAX = EAX * 3
LEA EAX, [EAX * 4 + EAX]   ;EAX = EAX * 5
LEA EAX, [EAX * 8 + EAX]   ;EAX = EAX * 9

LEA指令可用于避免CPU对有效地址进行耗时的计算。如果地址被重复使用,则将其存储在寄存器中而不是每次使用时计算有效地址更有效。

正如前面提到的现有答案,LEA具有执行内存寻址运算而不访问内存的优点,将运算结果保存到不同的寄存器,而不是简单形式的加法指令。真正的潜在性能优势是现代处理器有一个单独的LEA ALU单元和端口,用于有效的地址生成(包括LEA和其他内存参考地址),这意味着LEA中的算术运算和ALU中的其他正常算术运算可以在一个核中并行完成。

查看Haswell架构的这篇文章,了解LEA单元的一些详细信息:http://www.realworldtech.com/haswell-cpu/4/

其他答案中未提及的另一个重要点是LEA REG,[MemoryAddress]指令是PIC(位置无关代码),它将此指令中的PC相对地址编码为参考MemoryAddress。这不同于MOV REG,MemoryAddress编码相对虚拟地址,需要在现代操作系统中重新定位/修补(如ASLR是常见功能)。因此,LEA可用于将非PIC转换为PIC。

LEA:只是一个“算术”指令。。

MOV在操作数之间传输数据,但lea只是在计算