我希望将寄存器位移位n次到另一个寄存器指定的左侧。例如,像这样的东西
shl eax, ebx
唯一的问题是第二个操作数不能是一个寄存器,它必须是一个立即值。我怎样才能将寄存器移位到汇编时未知的值?
答案 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,因此您无法在完全可移植的代码中使用它。