gpt4 book ai didi

assembly - LEA 或 ADD 指令?

转载 作者:行者123 更新时间:2023-12-01 22:26:31 25 4
gpt4 key购买 nike

当我手写汇编时,我一般会选择表格

lea eax, [eax+4]

在表格上..

add eax, 4

我听说 lea 是一条“0 时钟”指令(如 NOP),而“add”则不是。然而,当我查看编译器生成的程序集时,我经常看到使用后一种形式而不是第一种形式。我足够聪明,可以信任编译器,所以任何人都可以阐明哪一个更好吗?哪一个更快?为什么编译器选择后一种形式而不是前一种形式?

最佳答案

x86 CPU 上的 LEAADD 之间的一个显着区别是实际执行指令的执行单元。现代 x86 CPU 是超标量的,并且具有多个并行运行的执行单元,管道为它们提供有点像循环(条停顿)。事实是,LEA 由处理寻址的(一个或多个)单元处理(这发生在管道的早期阶段),而 ADD 则转到ALU(算术/逻辑单元),处于管道后期。这意味着超标量 x86 CPU 可以同时执行 LEA 和算术/逻辑指令。

事实上,LEA 经过地址生成逻辑而不是算术单元,这也是它过去被称为“零时钟”的原因;执行不需要时间,因为在执行时地址生成已经发生

它不是免费的,因为地址生成是执行管道中的一个步骤,但它没有执行开销。并且它不占用 ALU 管道中的槽。

编辑:澄清一下,LEA 不是免费的。即使在不通过算术单元实现它的 CPU 上,由于指令解码/分派(dispatch)/退出和/或所有指令都要经过的其他流水线阶段,执行也需要时间。对于通过地址生成实现 LEA 的 CPU,执行 LEA 所需的时间仅发生在管道的不同阶段。

关于assembly - LEA 或 ADD 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6323027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com