This question already has answers here:
What's the purpose of the LEA instruction?

(16个答案)


5年前关闭。





我摆弄了gcc的优化选项,发现以下几行:

int bla(int moo) {
  return moo * 384;
}


被翻译成这些:

0:   8d 04 7f                lea    (%rdi,%rdi,2),%eax
3:   c1 e0 07                shl    $0x7,%eax
6:   c3                      retq


我知道移位代表乘以2 ^ 7。第一行必须是3的乘积。

所以我完全被“ lea”一词所迷惑。是否不应该加载地址?

最佳答案

lea (%ebx, %esi, 2), %edi只是计算ebx + esi*2并将结果存储在edi中。

即使lea被设计为计算和存储有效地址,它也可以并且经常被用作优化技巧,以对不是内存地址的内容执行计算。

lea    (%rdi,%rdi,2),%eax
shl    $0x7,%eax


等效于:

eax = rdi + rdi*2;
eax = eax * 128;


由于moo位于rdi中,因此它将moo*384存储在eax

关于gcc - 用LEA进行gcc优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16339699/

10-12 14:23