我需要将EAX乘以37,我知道我可以使用shl eax,5
和shl register,2
然后将寄存器添加到eax乘以38,但我不确定要乘以的代码是奇数,我只能使用shl add和mov。谢谢!
答案 0 :(得分:6)
使用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
答案 1 :(得分:2)
除了 harold 告诉你的内容之外,您还可以使用LEA
指令执行乘法运算:
EAX * 2 : lea eax,[eax*2]
EAX * 3 : lea eax,[eax*2+eax]
EAX * 4 : lea eax,[eax*4]
EAX * 5 : lea eax,[eax*4+eax]
EAX * 8 : lea eax,[eax*8]
EAX * 9 : lea eax,[eax*8+eax]