汇编语言使用shl乘以奇数?

时间:2013-11-22 17:16:44

标签: assembly x86

我需要将EAX乘以37,我知道我可以使用shl eax,5shl register,2然后将寄存器添加到eax乘以38,但我不确定要乘以的代码是奇数,我只能使用shl add和mov。谢谢!

2 个答案:

答案 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]