【问题标题】:gcc inline - operand type mismatch for 'cmp'gcc inline - 'cmp' 的操作数类型不匹配
【发布时间】:2015-07-23 21:30:34
【问题描述】:

我收到以下错误:

汇编程序消息:
错误:“cmp”的操作数类型不匹配

我的代码中唯一的 cmp 是:

"cmpl %eax, $15\n\t"

我不明白这有什么问题 - 我有一个寄存器和一个立即数,应该隐式符号扩展为 32 位。

【问题讨论】:

  • 当使用 att 语法(gcc 的默认)时,常量需要是第一个参数:"cmpl $15, %eax\n\t"。 Intel 语法将常量放在第二个参数中。如果您的所有 asm 都是 intel 格式,请使用 -masm=intel。
  • 啊,谢谢。即使我不明白这是为什么。

标签: gcc x86 inline-assembly att


【解决方案1】:

根据Official Intel ISA Reference3.2 指令(A-L)

CMP EAX,imm32

这意味着Intel Syntax

cmp eax, 15D

AT&T Syntax:

cmpl $15, %eax

正好相反:)


cmp 没有立即数减去 reg/mem from 的形式。相反,如果您想检查除相等性之外的其他内容,请使用相反的分支/cmov 条件。

【讨论】:

    【解决方案2】:

    我有同样的问题,但在我的情况下,错误是

    cmp $0xFFFFFFFFFFFFFFFF, %rdx
    

    解决办法就是这样做

    movq $0xFFFFFFFFFFFFFFFF, %rcx
    

    先,然后

    cmp %rcx, %rdx
    

    (afaik,对于更大的数字 cmp 需要两个寄存器,而不是 const 和寄存器)

    【讨论】:

    • 不,这是一个单独的问题。 OP的指令倒退了; CMP 仅支持cmp $imm, reg/mem,不支持cmp reg/mem, $imm。在您的情况下,cmp(以及除mov 之外的所有指令)仅支持 32 位符号扩展立即数,而不支持 64 位。
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2019-02-17
    相关资源
    最近更新 更多