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

问题描述

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

shll %ebx,%eax

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

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

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

解决方法

x86指令中的移位计数必须为常数或%cl寄存器中的移位计数。您不能将任何其他寄存器用作移位计数。 %ebx既不是常量也不是%cl,因此会出现错误。

Intel's manual显示了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