【发布时间】:2011-09-13 11:04:06
【问题描述】:
我在手写汇编的时候,一般会选择表格
lea eax, [eax+4]
在表格上方..
add eax, 4
我听说 lea 是“0-clock”指令(如 NOP),而“add”不是。但是,当我查看编译器生成的程序集时,我经常看到使用后一种形式而不是第一种形式。我足够聪明,可以信任编译器,所以任何人都可以阐明哪个更好?哪个更快?为什么编译器选择后者而不是前者?
【问题讨论】:
-
如果任何指令实际上在做有用的工作,它怎么可能是“零时钟”指令?
-
这是一条零时钟指令,因为所需的所有工作都在解码步骤中完成 - 当 CPU 解码指令时,无论如何都会从 MODRM/SIB 计算偏移量。至少这是我的理论。另外,我确切地知道 lea 指令是什么以及它的作用——我的问题是关于 lea 与 add,而不是 lea 与 mov(有很大的不同——你不能在不访问内存的情况下在 'mov' 中使用位移) .
-
很久以前就是这样,回到最初的 Pentium。现代编译器为更晚的内核生成代码。手动优化机器代码的时代已经结束。
-
它曾经很便宜(不是免费的),因为它在旧芯片上使用了专用的地址计算硬件,并为您购买了一些并行性。在当前的 CPU 上,两条指令可能会导致相同的微操作。
-
GCC 4.8 默认使用
lea。lea与mov: stackoverflow.com/questions/1699748/…