我希望将一个寄存器的位向左移动n次,这个n次是用另一个寄存器指定的。例如,类似这样:
shl eax, ebx
唯一的问题是第二操作数不能是寄存器,必须是立即数。我该如何将寄存器按一个在汇编期间不知道的值进行移位?
我希望将一个寄存器的位向左移动n次,这个n次是用另一个寄存器指定的。例如,类似这样:
shl eax, ebx
唯一的问题是第二操作数不能是寄存器,必须是立即数。我该如何将寄存器按一个在汇编期间不知道的值进行移位?
cl
中指定移位计数。因此shl eax,cl
是有效的。mov ecx, ebx
shl eax, cl
cl
寄存器,而不能使用eax
或任何其他寄存器。shl ax, 20
这样的窄移位可能会将所有位移出并使目标为零。64位移位将使用& 63
屏蔽计数,因此shl rax,32
(或在cl中加32)是可能的。有关更多信息,请参见英特尔手册中对shl
的条目)。
; if BMI2 is supported
shlx edx, eax, ebx ; edx = eax << (ebx&31)
它只能在一些Haswell+ CPU,Excavator / Ryzen CPU上使用,因此您无法在完全可移植的代码中使用它。