2013-04-24 24 views
1

这些是函数的前四行。我知道前两行在堆栈中创建了一个新框架,并且基本上都是“设置”行。 lea指令做了什么?在这个x86-64代码中做了什么?

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 
+0

第二条指令不设置'%rbp' ... – 2013-04-24 08:01:36

+0

您可能希望仔细张贴这个确切的ASM给出我认为它来自哪里。 – 2017-09-11 18:37:02

回答

2

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

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

+1

请记住,'lea'不一定**有**用于计算地址。由于它不像正常的算术指令那样占用ALU,所以当不需要标志时,编译器喜欢用它来执行简单的算术运算(“简单”=由'lea'和寻址模式支持的类型)。 – 2013-04-24 07:20:37

+0

@DanielKamilKozar为什么人们会这样说? 'lea'几乎在任何CPU上都使用ALU。它不是免费的。 “lea在AGU”曾经是一个灰暗和过去的事情.. – harold 2013-04-24 07:26:29

+0

来源:http://www.agner.org/optimize/instruction_tables.pdf“lea”在K7,K8,K10, Atom ..就是这样。 – harold 2013-04-24 07:48:03