为了有效地做x = x*10 + 1,它可能是最佳使用
lea eax, [rax + rax*4] ; x*=5
lea eax, [1 + rax*2] ; x = x*2 + 1
Run Code Online (Sandbox Code Playgroud)
3组件LEA在现代Intel CPU上具有更高的延迟,例如3个周期而不是Sandybridge系列的1个,因此disp32 + index*2比disp8 + base + index*1SnB系列更快,即我们关心优化的大多数主流x86 CPU.(这主要仅适用于LEA,而不适用于加载/存储,因为LEA运行在ALU执行单元上,而不是大多数现代x86 CPU中的AGU.)AMD CPU具有3个组件的LEA较慢或scale > 1(http://agner.org/optimize /)
但NASM和YASM将通过使用[1 + rax + rax*1]第二个LEA 来优化代码大小,第二个LEA只需要disp8而不是disp32.(寻址模式始终具有基址寄存器或disp32).
即他们总是分裂reg*2成base+index,因为对于代码大小来说,这永远不会更糟.
我可以强制使用disp32 lea eax, [dword 1 + rax*2],但这并不能阻止NASM或YASM分割寻址模式.在NASM手动似乎并没有记录的方式来使用的strict关键字上规模的因素,并[1 + …