cmov 的操作数类型不匹配

Aki*_*ino 4 assembly att

我似乎无法按照cmove自己想要的方式开始工作。我有这段代码:

cmove   $1, %eax
Run Code Online (Sandbox Code Playgroud)

我在编译时收到此错误:

Error: operand type mismatch for `cmove'
Run Code Online (Sandbox Code Playgroud)

然而,替换cmove为,比如说,mov效果很好,并且

mov    $1,   %ecx
cmove  %ecx, %eax
Run Code Online (Sandbox Code Playgroud)

也有效。我也尝试过使用cmovel,但就是不行。我错过了什么吗?

Mic*_*ael 5

我错过了什么吗?

为了cmove $1,%eax工作,必须有一种cmove接受r32,imm(或r/m32,imm) 作为参数组合的形式。但英特尔手册cmove中列出的唯一有效形式是:

CMOVE r16, r/m16
CMOVE r32, r/m32
CMOVE r64, r/m64
Run Code Online (Sandbox Code Playgroud)

在他们的描述中CMOVcc阐明了这一点:

这些指令可以将 16 位、32 位或 64 位值从存储器移动到通用寄存器,或从一个通用寄存器移动到另一个通用寄存器。