代码之家  ›  专栏  ›  技术社区  ›  Simon

“mov”的操作数类型不匹配

  •  0
  • Simon  · 技术社区  · 7 年前

    我想要eflags值,但我得到了错误

    operand type mismatch for `mov'
    

    这是我的代码:

    int a0 = 0, b0 = 1; short c0;
    //  asm("cmp %1, %2\npushf\npop ax\nmov ax, $0": "=r" (c0): "r" (a0), "r" (b0));
    asm("cmp %1, %2\n lahf\n mov %%ax, $0": "=r" (c0): "r" (a0), "r" (b0): "ax");
    

    我也试过用movb-ah,但同样的错误。

    1 回复  |  直到 7 年前
        1
  •  3
  •   fuz    7 年前

    您的代码中有两个错误:

    1. 这个 $ 前缀表示立即数。 mov %ax, $0 尝试移动 ax 0 ,这是荒谬的。也许你是想写信 %0 相反,指示 c0 ?
    2. 如果我们更换 mov %%ax, $0 具有 mov %%ax, %0 ,第二个问题是 c0 是一个 int 因此 %0 替换为一些32位寄存器,因此得到如下结果 mov %ax, %ecx . 这也是错误的,因为两个操作数 mov 尺寸必须相同。你可以通过制作 c0 unsigned char 和变化 mov%%ax,%0 mov %%ah, %0 .

    无论如何,使用 压敏电阻 内联汇编通常是错误的,但在这里很难避免,因为您很难告诉gcc预期的结果 c0 ah 登记