【问题标题】:What does lea in this x86-64 code do? [duplicate]这个 x86-64 代码中的 lea 有什么作用? [复制]
【发布时间】:2024-01-21 17:43:01
【问题描述】:

这些是函数的前四行。我知道前两行在堆栈中创建了一个新框架,基本上是“设置”行。 lea 指令有什么作用?

40148e: 48 83 ec 18    sub    $0x18,%rsp
401492: 48 89 f2       mov    %rsi,%rdx
401495: 48 8d 4e 04    lea    0x4(%rsi),%rcx
401499: 48 8d 46 14    lea    0x14(%rsi),%rax

【问题讨论】:

  • 第二条指令没有设置%rbp...
  • 您可能需要谨慎发布这个确切的 ASM,因为我认为它来自 ????。

标签: assembly x86-64


【解决方案1】:

lea,加载有效地址,将计算出的“内存地址”放入结果寄存器。所以在这里,rcx = rsi + 4rax = rsi + 0x14

顺便说一句,第二行看起来不像是设置堆栈帧的代码的一部分,rsi 是使用 System V AMD64 调用约定时的第二个参数。

【讨论】:

  • 请记住,lea 不一定必须用于计算地址。由于它不像普通算术指令那样占用 ALU,因此编译器喜欢在不需要标志时使用它来执行简单算术(“simple”=lea 和寻址模式支持的类型)。
  • @DanielKamilKozar 为什么人们总是这么说? lea 现在几乎在任何 CPU 上都使用 ALU。它不是免费的。 “lea in AGU”曾经是一个遥远而灰色的过去..
  • 来源:agner.org/optimize/instruction_tables.pdf lea 转到 K7、K8、K10、Atom 上的 AGU .. 仅此而已。
  • @DanielKamilKozar 向我解释了为什么我在call strlen 之后看到lea rdx, [rax - 1]。谢谢!
最近更新 更多