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

Ada*_*Lee 1 x86 assembly bit-manipulation bit-shift att

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

shll %ebx, %eax
Run Code Online (Sandbox Code Playgroud)

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

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

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

Chr*_*odd 6

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

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

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