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

use*_*286 5 x86 assembly

我需要37乘EAX,我知道我可以使用shl eax,5shl register,2再放入寄存器EAX 38倍增,但我不知道该代码被奇数的繁殖和我必须使用SHL插件,只MOV.谢谢!

Ira*_*ter 7

使用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
Run Code Online (Sandbox Code Playgroud)

将eax乘以38:

 lea ecx, [8*eax]
 neg eax
 lea ecx, [5*ecx] 
 lea eax, [ecx+2*eax]
Run Code Online (Sandbox Code Playgroud)

更好:

 lea ecx, [8*eax+eax] ; 9 * eax
 lea ecx, [4*ecx] ; 36 * eax
 lea eax, [eax*2+ecx] ; 38 * eax
Run Code Online (Sandbox Code Playgroud)

只是为了好玩,乘以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
Run Code Online (Sandbox Code Playgroud)


mcl*_*fix 3

除了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]
Run Code Online (Sandbox Code Playgroud)