【问题标题】:How does lea instruction get the operand's address? [duplicate]lea 指令如何获取操作数的地址? [复制]
【发布时间】:2012-11-26 20:07:37
【问题描述】:

这究竟是如何工作的?我知道 lea 与使用 add/mov 指令相比效率更高,因为它不通过 ALU 或设置任何标志。那么 lea 如何获取它的地址呢?是什么让它比 add/mov 更好?

【问题讨论】:

  • 为什么 x86-lea 是一个标签?
  • @harold:Michael Petch 和我 think it shouldn't be(因为未来没有重复问题的余地),但我不会立即撤消所有标记。

标签: assembly x86


【解决方案1】:

lea 不通过 ALU 的想法已经过时,并且十多年来一直是错误的。它通过其中一个 ALU - 其中会有几个,这极不可能成为瓶颈。这实际上需要时间。它并不比add 快。

但这并不意味着它没有用。与add 不同,它可以有一个不同于两个输入的目的地,因此它可以保存一个mov,并且它可以采用一个额外的常量,因此您可以将两个adds 和一个mov 合二为一。缩放也很好,所有结合起来你可以做类似a = b * 9 + 5 all in one lea a, [b + b * 8 + 5]lea 的这种“复杂”形式通常比 lea 的简单 2 操作数形式慢。

【讨论】:

    【解决方案2】:

    LEA 指令使用 CPU 的有效地址 (EA) 部分来执行某些类型的算术而不使用 ALU。 EA 模块可以执行用于地址计算的非常特定类型的算术,但如果您需要的是它专门提供的东西之一,也可以用于其他事情。

    通过不使用 ALU 进行此 EA 计算,ALU 可以同时忙于做其他事情,您可以避免管道停顿。

    【讨论】:

    • 我在另一个人的stackoverflow上看到了另一个类似的帖子。 “LEA 通过地址生成逻辑而不是算术单元的事实也是它曾经被称为“零时钟”的原因;它不需要时间来执行,因为地址生成在它应该发生的时候已经发生了/ 被执行。”你知道他所说的“它不需要时间执行,因为地址生成在执行时已经发生”是什么意思吗?执行时间如何生成地址?
    • CPU 在“管道”中运行指令,而不是一个接一个地执行它们并在开始下一条指令之前完全完成一条指令。流水线意味着 CPU 可以在完成当前指令的执行时同时为将来的指令做准备。如果您想了解更多信息,请参阅en.wikipedia.org/wiki/Instruction_pipeline
    • 这可能在有序 Atom(Silvermont 之前)上是正确的,但不是最近的其他任何东西。 Atom 确实比普通 ALU 指令更早地在管道中运行 LEA,这会影响延迟,但它需要更早地准备好其输入。所有现代 x86 CPU 都有乱序执行,甚至包括当前一代的 Xeon Phi,所以没有。此外,有序 Atom 有两个 ALU 端口和 add 的每时钟 2 个吞吐量,因此使用 LEA 的唯一影响是延迟差异,而不是吞吐量。 agner.org/optimize
    猜你喜欢
    • 2020-08-22
    • 2015-07-12
    • 2011-05-30
    • 1970-01-01
    • 2013-08-22
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多