这段 x86-64 代码中的 lea 有什么作用?

Dae*_*erl 7 assembly x86-64

这是函数的前四行。我知道前两行在堆栈中创建一个新框架,基本上是“设置”行。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
Run Code Online (Sandbox Code Playgroud)

har*_*old 5

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

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

  • 请记住,“lea”不一定**必须**用于计算地址。由于它不像普通算术指令那样占用 ALU,因此当不需要标志时,编译器喜欢使用它来执行简单算术(“简单”= `lea` 和寻址模式支持的类型)。 (3认同)