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