可能重复:LEA指令的目的是什么?
当我需要地址的值时,我可以使用有效地址,例如 push dword [str+4]
. 但是当我需要引用一个地址时 - 我不能使用 push dword str+4
(这对我来说是显而易见的,有用的方式) .
而是需要使用 lea EAX, [str+4]
然后 push EAX
. 这有点令人困惑,并且还提供了额外的处理器指令,尽管是“零时钟”指令 . (见这个答案)
对于这种差异是否有一些硬件级别的解释,或者它只是(NASM)汇编语法的一个怪癖?
Edit: 好的,所以this comment问我同样的问题 . 正如Lucero的回答一样,它在_814668中被回答 - X86不支持这样的寻址 .
4 回答
汇编指令直接表示x86操作码(没有像在更高级语言中那样进行转换编译) . 操作码在它们可以代表的内容方面有其局限性;因此,虽然地址计算可以作为x86地址的一部分,但值计算不是 . LEA通过将地址计算的结果存储在任何寄存器中而不是仅在内部使用它来弥补这一差距 .
只需使用正确的语法,您需要 offset 关键字:
LEA指令可以方便地使用地址生成逻辑的管道 . 提供非常便宜的添加和乘法方法,不使用ALU . 编写代码生成器的程序员的技巧列表中的高位 . 这里不需要,afaict .
这是一个很长的评论(因为它没有回答这个问题),但读者应该知道..
lea
肯定不是零时钟指令 . 其中有一些,例如fxch
(在寄存器重命名的所有内容上),Sandy Bridge上的nop
(90
和0F 1F
),以及用于将寄存器设置为零的某些习惯用法(xor
或sub
本身,即使对于XMM寄存器),在桑迪桥上 . 当然,它们仍然具有有限的吞吐量,因此它们不是免费的 .lea
总是需要至少一个周期(至少在我知道的任何处理器上,并且它可能并不总是这样),它通常在ALU而不是AGU上执行(在AGU上执行的某些AMD 's and Atom are exceptions) but even in the cases where it'仍然是需要一个或多个周期 .lea
甚至可以超过1个周期,例如P4上的缩放lea
,Sandy Bridge(看起来我在这篇帖子中提到了很多东西......)或AMD处理器 . 事实上,在AMD K10上进入AGU的lea
是缓慢的情况,它被缩放和/或有3个参数,并且比快速进入ALU的周期长 .因为它开始看起来像C.唯一可以使用这种内联添加的地方是寻址内存 .
LEA
让你"address"内存没有解决它,这在保护模式下非常有用,其中小指针失误会杀死你的应用程序(甚至可能更好的实际模式,指针失误可能会杀死DOS,Windows,机器,并杀死任何事情的数量) . 装配是有限的野兽,其中每个指令对应于物理电路 . 指令是一般的,因为它们本身就是一个小奇迹 .