如何使用命令shl
将变量移位1?
mov one, 1
shl one , eax
返回错误。
答案 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向左移动,因此还有另一条适用的指令:bts
。 bts
可以将任何注册记录作为索引。
xor edx, edx
bts edx, eax
将它与内存目的地一起使用时要小心,索引不会以模32减少,所以你可以使用它(意外地)设置一点距离基地很远。