相关疑难解决方法(0)

如何强制NASM将[1 + rax*2]编码为disp32 + index*2而不是disp8 + base + index?

为了有效地做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*2disp8 + 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*2base+index,因为对于代码大小来说,这永远不会更糟.

我可以强制使用disp32 lea eax, [dword 1 + rax*2],但这并不能阻止NASM或YASM分割寻址模式.在NASM手动似乎并没有记录的方式来使用strict关键字上规模的因素,并[1 + …

x86 assembly nasm machine-code micro-optimization

7
推荐指数
1
解决办法
248
查看次数

标签 统计

assembly ×1

machine-code ×1

micro-optimization ×1

nasm ×1

x86 ×1