x86 汇编编程(GAS 语法):"shl"的操作数类型不匹配



我正试图将EAX寄存器中存储的数字移位EBX寄存器中的数量。然而,当我尝试用以下移位语句执行程序时:

shll %ebx, %eax

我在编译时检索到以下错误:

错误:"shl"的操作数类型不匹配

我对这个错误的含义感到困惑,因为根据我的理解,将寄存器引用作为参数传递应该是移位函数的正确用法。

x86指令中的移位计数必须是常量或位于%cl寄存器中。您不能使用任何其他寄存器进行移位计数。%ebx既不是常数也不是%cl,所以您会得到一个错误。

英特尔的手册显示了可用形式的shl

如果您可以假设支持BMI2扩展,shlx %ebx, %eax, %eax允许移位计数为任意寄存器,并且在Intel CPU上更快。(https://www.felixcloutier.com/x86/sarx:shlx:shrx)

由于此问题是该消息在搜索引擎中最热门的问题之一:立即移位计数所需的语法为:shr $13, %ebx

在此处找到:https://stackoverflow.com/a/46185989/493161

最新更新