‘mov’的操作数类型不匹配

operand type mismatch for `mov'

我想要 eflags 值,但出现错误

operand type mismatch for `mov'

这是我的代码:

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

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

你的代码有两个错误:

  1. $ 前缀表示立即数。 mov %ax, [=11=] 试图将 ax 移动到立即数 0,这是荒谬的。也许您打算改为写 %0,表示 c0?
  2. 如果我们用mov %%ax, %0替换mov %%ax, [=16=],第二个问题是c0是一个int,因此%0被一些32位替换注册,所以你会得到类似 mov %ax, %ecx 的东西。这也是错误的,因为 mov 的两个操作数必须具有相同的大小。您可以通过将 c0 设为 unsigned char 并将 mov %%ax, %0 更改为 mov %%ah, %0.
  3. 来解决此问题

无论如何,在内联汇编中使用 mov 通常是错误的,但在这里很难避免,因为您不能轻易地告诉 gcc 在 ah 寄存器中期望 c0