gpt4 book ai didi

assembly - 可变位移位

转载 作者:行者123 更新时间:2023-12-03 22:56:25 25 4
gpt4 key购买 nike

我希望将一个寄存器位向左移动 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)是可能的。见 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 上可用,因此您不能在完全可移植的代码中使用它。

关于assembly - 可变位移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13425365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com