我想要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但同样的错误。
您的代码中有两个错误:
-
$
前缀表示立即。mov %ax, $0
试图将ax
移至即时0
,这是无意义的。也许您是要编写%0
,指示c0
? - 如果我们用
mov %%ax, %0
替换mov %%ax, $0
,则第二个问题是c0
是int
,因此%0
被大约32位寄存器替换,因此您会得到类似mov %ax, %ecx
的东西。这也是错误的,因为两个操作数到mov
都必须具有相同的大小。您可以通过使c0
为unsigned char
并将mov %%ax, %0
更改为mov %%ah, %0
。
来解决此问题。
无论如何,在内联汇编中使用mov
通常是错误的,但是这里很难避免,因为您无法轻易告诉GCC在ah
寄存器中期望c0
。