"MOV"的操作数类型不匹配



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

operand type mismatch for `mov'

这是我的代码:

int a0 = 0, b0 = 1; short c0;
//  asm("cmp %1, %2npushfnpop axnmov ax, $0": "=r" (c0): "r" (a0), "r" (b0));
asm("cmp %1, %2n lahfn mov %%ax, $0": "=r" (c0): "r" (a0), "r" (b0): "ax");

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

您的代码中有两个错误:

  1. $前缀表示立即。mov %ax, $0试图将ax移至即时0,这是无意义的。也许您是要编写%0,指示c0
  2. 如果我们用mov %%ax, %0替换mov %%ax, $0,则第二个问题是c0int,因此%0被大约32位寄存器替换,因此您会得到类似mov %ax, %ecx的东西。这也是错误的,因为两个操作数到mov都必须具有相同的大小。您可以通过使c0unsigned char并将mov %%ax, %0更改为mov %%ah, %0
  3. 来解决此问题。

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

最新更新