This question already has answers here:
What's the purpose of the LEA instruction?
(16个答案)
5年前关闭。
我摆弄了gcc的优化选项,发现以下几行:
被翻译成这些:
我知道移位代表乘以2 ^ 7。第一行必须是3的乘积。
所以我完全被“ lea”一词所迷惑。是否不应该加载地址?
等效于:
由于
(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