【问题标题】:Operand type mismatch for cmovcmov 的操作数类型不匹配
【发布时间】:2017-01-31 12:38:55
【问题描述】:

我似乎无法让cmove 以我想要的方式工作。我有这段代码:

cmove   $1, %eax

我在编译时收到此错误:

Error: operand type mismatch for `cmove'

但是,将cmove 替换为mov 效果很好,并且

mov    $1,   %ecx
cmove  %ecx, %eax

也可以。我也尝试过使用cmovel,但它不起作用。我错过了什么吗?

【问题讨论】:

  • 有效地使用cmov 指令不可避免地意味着您将不得不破坏临时寄存器。你的第二个 sn-p 就是你这样做的方式,使用 ecx 作为暂存寄存器。请注意这是多么有效,因为 mov 指令从不影响标志,因此您始终可以将其插入到测试(设置标志)和条件移动之间。

标签: assembly att


【解决方案1】:

我错过了什么吗?

要使cmove $1,%eax 起作用,必须有一种cmove 形式,它接受r32,imm(或r/m32,imm)作为参数组合。但是Intel's manual 中列出的cmove 的唯一有效形式是:

CMOVE r16, r/m16
CMOVE r32, r/m32
CMOVE r64, r/m64

CMOVcc 的描述中,他们详细说明了这一点:

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

【讨论】:

  • 所以这不是我做错了什么,它只是不能那样工作......哦,好吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2023-03-27
  • 2018-11-02
  • 2015-07-23
  • 1970-01-01
相关资源
最近更新 更多