LEA指令的替代语法

时间:2012-08-18 12:31:05

标签: assembly x86 nasm

  

可能重复:
  What's the purpose of the LEA instruction?

当我需要地址的值时,我可以使用有效地址,例如push dword [str+4]。但是当我需要引用一个地址时 - 我无法使用push dword str+4(这对我来说是显而易见的,有用的方式)。

而是需要使用lea EAX, [str+4]然后push EAX。这有点令人困惑,并且还提供了额外的处理器指令,尽管是零时钟'一。 (见this answer

这种差异是否有一些硬件级别的解释,或者它只是(NASM)汇编语法的一个怪癖?

修改 好的,this comment问我同样的问题。正如Lucero的回答一样,它在this comment得到了解答 - X86不支持这样的解决。

4 个答案:

答案 0 :(得分:4)

只需使用正确的语法,您需要偏移关键字:

 push offset str+4

LEA指令可以方便地使用地址生成逻辑的管道。提供非常便宜的添加和乘法方法,不使用ALU。编写代码生成器的程序员的技巧列表中的高位。这里不需要,afaict。

答案 1 :(得分:2)

这是一个很长的评论(因为它没有回答这个问题),但读者应该知道..

lea肯定是不是零时钟指令。其中有一些,例如fxch(在寄存器重命名的所有内容上),nop900F 1F)在Sandy Bridge上,以及某些用于设置寄存器的习语零(xorsub自身,即使对于XMM寄存器),也在Sandy Bridge上。当然,它们仍然具有有限的吞吐量,因此它们不是免费的。

lea总是需要至少一个周期(至少在我知道的任何处理器上,并且可能并不总是这样),它通常在ALU而不是AGU(某些AMD的和Atom是例外情况)但即使在AGU上执行的情况下,仍然需要一个或多个周期。 lea甚至可能需要超过1个周期,例如P4上的缩放lea,Sandy Bridge(似乎我在这篇文章中提到了很多SB)或AMD处理器。事实上,在AMD K10上,进入AGU的lea是缓慢的情况,它被缩放和/或有3个参数,并且比快速进入ALU的周期更长。

答案 2 :(得分:0)

汇编指令直接表示x86操作码(没有像在更高级语言中那样进行转换编译)。操作码有其局限性;因此,虽然地址计算可以作为x86地址的一部分,但值计算不是。 LEA通过将地址计算的结果存储在任何寄存器中而不是仅在内部使用它来弥补这一差距。

答案 3 :(得分:0)

因为它开始看起来像C.你可以使用那种内联添加的唯一地方是寻址内存。 LEA允许你“寻址”内存而不解决它,这在保护模式下非常有用,其中小指针失步会杀死你的应用程序(甚至可能更好的实际模式,指针失误可能会杀死DOS,Windows,机器,并杀死任何数量的东西)。汇编是一种有限的野兽,其中每条指令对应一个物理电路。指令是一般的,因为它们本身就是一个小奇迹。