问题描述
我正在尝试将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