Assembly 这个x86-64代码中的lea是做什么的?

Assembly 这个x86-64代码中的lea是做什么的?,assembly,x86-64,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 lea,加载有效地址,将计算出的“内存地址”放入结果寄

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

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


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

请记住,
lea
不一定要用于计算地址。由于它不像普通算术指令那样占用ALU,编译器喜欢在不需要标志时使用它来执行简单算术(“simple”=由
lea
和寻址模式支持的那种)。@DanielKamilKozar为什么人们总是这么说<如今,code>lea在几乎所有CPU上都使用ALU。它不是免费的。“AGU中的lea”曾经是遥远而灰暗的过去..来源:
lea
转到K7、K8、K10、Atom上的AGU。。DanielKamilKozar这就向我解释了为什么我在打了一个电话给strlen后看到了
leardx[rax-1]
。谢谢第二条指令不是设置
%rbp
…您可能需要小心地发布这个确切的ASM,因为我认为它来自哪里