Ban*_*urt 2 optimization assembly gcc
我正在摆弄gcc的优化选项,发现这些行:
int bla(int moo) {
return moo * 384;
}
Run Code Online (Sandbox Code Playgroud)
被翻译成这些:
0: 8d 04 7f lea (%rdi,%rdi,2),%eax
3: c1 e0 07 shl $0x7,%eax
6: c3 retq
Run Code Online (Sandbox Code Playgroud)
我理解移位代表乘以2 ^ 7.并且第一行必须乘以3.
所以我对"lea"系列完全感到困惑.是不是应该加载一个地址?
lea (%ebx, %esi, 2), %edi
只是计算ebx + esi*2
和存储结果edi
.
即使lea
设计用于计算和存储有效地址,它也可以并且通常用作优化技巧来对不是存储器地址的事物执行计算.
lea (%rdi,%rdi,2),%eax
shl $0x7,%eax
Run Code Online (Sandbox Code Playgroud)
相当于:
eax = rdi + rdi*2;
eax = eax * 128;
Run Code Online (Sandbox Code Playgroud)
自从moo
进入rdi
,它就存储moo*384
在eax
归档时间: |
|
查看次数: |
712 次 |
最近记录: |