Assembly 可变位移位
我希望将一个寄存器的位向左移位n次,用另一个寄存器指定。比如像这样的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这样的窄移位可以将
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++编写内联汇编吗?不是,否则我会使用移位运算符。您应该阅读指令集参考。