试图通过 EAX 左移一个变量

Trying to shift left by EAX a variable

如何使用命令 shl 将 1 移动一个变量?

mov one, 1

shl one , eax 

Returns 一个错误。

您只能移动 cl,除非您使用 BMI2 shifts。例如:

mov edx, 1
shl edx, cl

由于您将值 1 向左移动,因此还有一个适用的指令:btsbts 可以取任何寄存器作为索引

xor edx, edx
bts edx, eax

将它与内存目标一起使用时要小心,索引不会以 32 为模减少,因此您可以使用它来(不小心)设置离基地址很远的地方。

only移位可变量的方法是将移位计数放在CL寄存器中(即32位寄存器的低8位ECX 注册)。这是the only encoding available for any of the shift instructions that takes a register source operand

所以你需要做:

mov DWORD PTR [one], 1      ; initialize variable 'one'
mov ecx, eax                ; copy shift count from EAX into ECX
shl DWORD PTR [one], cl     ; one << cl

请注意,这里只使用了 ECX 的低 8 位,但这已经足够了,因为无论如何您不能将 DWORD 大小的值移动超过 32 位!事实上,除了 8088/8086,移位计数无论如何都会被屏蔽为 5 位(即模 32),将其限制在 0-31 范围内,包括在内。

此外,我要提一下,虽然您可以使用内存操作数作为算术指令(如移位)的来源,但您可能不应该 因为它比使用寄存器慢。所以,既然你无论如何都要破坏一个寄存器,你可以这样做:

mov  ecx, eax
mov  eax, 1
shl  eax, cl
mov  DWORD PTR [one], eax