Assembly 可变位移位

Assembly 可变位移位,assembly,x86,bit-manipulation,Assembly,X86,Bit Manipulation,我希望将一个寄存器的位向左移位n次,用另一个寄存器指定。比如像这样的 shl eax, ebx 唯一的问题是第二个操作数不能是寄存器,它必须是立即数。如何将寄存器移位到汇编时未知的值?在x86中,可以在寄存器cl中指定移位计数。因此shl eax,cl是有效的 mov ecx, ebx shl eax, cl 请注意,您只能使用cl寄存器,不能使用eax或任何其他寄存器 此外,大于31的移位计数以32模执行。(不是对操作数大小进行模化,因此像shl ax,20这样的窄移位可以将

我希望将一个寄存器的位向左移位n次,用另一个寄存器指定。比如像这样的

shl    eax, ebx

唯一的问题是第二个操作数不能是寄存器,它必须是立即数。如何将寄存器移位到汇编时未知的值?

在x86中,可以在寄存器
cl
中指定移位计数。因此
shl eax,cl
是有效的

mov   ecx, ebx
shl   eax, cl
请注意,您只能使用
cl
寄存器,不能使用
eax
或任何其他寄存器

此外,大于31的移位计数以32模执行。(不是对操作数大小进行模化,因此像
shl ax,20
这样的窄移位可以将所有位移出并保留目标零。但是,64位移位使用
&63
屏蔽计数,因此
shl rax,32
(或使用32 in cl)是可能的。请参阅)


BMI2指令集扩展支持,并且不更新EFLAG,因此它们对变量计数更有效:

; if BMI2 is supported
shlx   edx, eax, ebx     ; edx = eax << (ebx&31)
;如果支持BMI2

shlx-edx、eax、ebx;edx=eax您是在用C/C++编写内联汇编吗?不是,否则我会使用移位运算符。您应该阅读指令集参考。