试图通过EAX左移一个变量

时间:2017-07-08 16:03:39

标签: assembly

如何使用命令shl将变量移位1?

mov one, 1

shl one , eax 

返回错误。

2 个答案:

答案 0 :(得分:4)

移位可变量的方法是将移位计数放在CL寄存器中(这是32位ECX的低8位寄存器)。这是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(包括0和0)的范围内。

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

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

答案 1 :(得分:3)

除非您使用BMI2 shifts,否则您只能按cl换班。例如:

mov edx, 1
shl edx, cl

由于您将值1向左移动,因此还有另一条适用的指令:btsbts可以将任何注册记录作为索引。

xor edx, edx
bts edx, eax

将它与内存目的地一起使用时要小心,索引不会以模32减少,所以你可以使用它(意外地)设置一点距离基地很远。