尝试通过 EAX 向左移动变量



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

mov one, 1
shl one , eax 

返回错误。

按可变量移位的唯一方法是将移位计数放入CL寄存器(这是 32 位ECX寄存器的低 8 位(。这是唯一可用于任何采用寄存器源操作数的移位指令的编码。

所以你需要做:

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

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

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

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

你只能按cl换档,除非你使用 BMI2 班次。所以例如:

mov edx, 1
shl edx, cl

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

xor edx, edx
bts edx, eax

与内存目的地一起使用时要小心,索引不会减少模 32,因此您可以使用它(意外地(设置离基址有点远的地方。

最新更新