这是 C 代码:
int baz(int a, int b)
{
return a * 11;
}
Run Code Online (Sandbox Code Playgroud)
它被编译为以下一组汇编指令(带有 -O2 标志):
baz(int, int):
lea eax, [rdi+rdi*4]
lea eax, [rdi+rax*2]
ret
Run Code Online (Sandbox Code Playgroud)
该lea指令计算第二个操作数(源操作数)的有效地址并将其存储在第一个操作数中。对我来说,第一条指令似乎应该将地址加载到 EAX 寄存器,但是,如果是这样,在第二条指令中将 RAX 乘以 2 没有意义lea,所以我推断这两lea条指令不会做完全相同的事情。
我想知道是否有人可以澄清这里到底发生了什么。