乘以 3 或 5
背景
要获得寄存器和常量的乘积并将其存储在另一个寄存器中,天真的方法是这样做:
imul ecx, 3 ; Set ecx to 5 times its previous value
imul edx, eax, 5 ; Store 5 times the contend of eax in edx
使用 lea
乘法是昂贵的操作。使用移位和添加组合更快。对于将 32 或 64 位寄存器(不是 esp
或 rsp
)乘以 3 或 5 的特定情况,可以使用 lea 指令。这使用地址计算电路快速计算产品。
lea ecx, [2*ecx+ecx] ; Load 2*ecx+ecx = 3*ecx into ecx
lea edx, [4*edx+edx] ; Load 4*edx+edx = 5*edx into edx
许多装配工也会理解
lea ecx, [3*ecx]
lea edx, [5*edx]
对于所有可能的被乘数,除了 ebp
或 rbp
之外,得到的指令长度与使用 imul
相同。
优点
- 执行得更快
缺点
- 如果你的被乘数是
ebp
或rbp
,那么使用imul
需要多一个字节 - 如果你的汇编程序不支持快捷方式,则输入更多内容
- 对不熟悉该技术的读者不透明