可变位移

时间:2012-11-16 22:27:56

标签: assembly x86 bit-manipulation

我希望将寄存器位移位n次到另一个寄存器指定的左侧。例如,像这样的东西

shl    eax, ebx

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

1 个答案:

答案 0 :(得分:10)

在x86中,您可以在寄存器cl中指定移位计数。所以shl eax, cl有效。

mov   ecx, ebx
shl   eax, cl

请注意,您只能使用cl寄存器,而不能使用eax或任何其他注册。

此外,大于31的移位计数以模32执行。(不以操作数大小为模,因此像shl ax, 20 这样的窄移位可以将所有位移出并使目标置零但是,64位移位会使用& 63掩盖计数,因此shl rax, 32(或cl中为32)是可能的。请参阅Intel's manual entry for shl)。


BMI2指令集扩展支持shifts with the count in any register,并且不更新EFLAGS,因此它们对变量计数更有效:

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

仅适用于部分Haswell + CPU和Excavator / Ryzen CPU,因此您无法在完全可移植的代码中使用它。