使用 LEA,您可以直接乘以许多小的奇数常数 (2,4,8,3,5,9),以及将两个寄存器相加并将答案移动到不同的位置。这非常有用。组合这些,您可以使用一系列 LEA 指令乘以几乎任何小常数,通常很短。明智地使用其他 ADD、SHL 和 SUB(包括 NEG 然后 ADD)指令可以缩短这些序列。如此短的序列几乎总是比使用乘法更快,部分原因是当前处理器在执行时会重叠许多指令:
将 eax 乘以 37:
lea ecx, [eax+8*eax] ; 9 * eax
lea eax, [ecx*4+eax] ; 37 * eax
将 eax 乘以 38:
lea ecx, [8*eax]
neg eax
lea ecx, [5*ecx]
lea eax, [ecx+2*eax]
更好:
lea ecx, [8*eax+eax] ; 9 * eax
lea ecx, [4*ecx] ; 36 * eax
lea eax, [eax*2+ecx] ; 38 * eax
只是为了好玩,乘以 103:
lea ecx, [8*eax] ; 8 * eax
lea ecx, [ecx*4] ; 32 * eax
lea ecx, [ecx*2+ecx] ; 96 * eax
lea ecx, [ecx+8*eax]; ; 104 * eax
sub ecx, eax ; 103 * eax