试图通过 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 向左移动,因此还有一个适用的指令:bts
。 bts
可以取任何寄存器作为索引
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
如何使用命令 shl
将 1 移动一个变量?
mov one, 1
shl one , eax
Returns 一个错误。
您只能移动 cl
,除非您使用 BMI2 shifts。例如:
mov edx, 1
shl edx, cl
由于您将值 1 向左移动,因此还有一个适用的指令:bts
。 bts
可以取任何寄存器作为索引
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