‘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 但同样的错误。
你的代码有两个错误:
$
前缀表示立即数。 mov %ax, [=11=]
试图将 ax
移动到立即数 0
,这是荒谬的。也许您打算改为写 %0
,表示 c0
?
- 如果我们用
mov %%ax, %0
替换mov %%ax, [=16=]
,第二个问题是c0
是一个int
,因此%0
被一些32位替换注册,所以你会得到类似 mov %ax, %ecx
的东西。这也是错误的,因为 mov
的两个操作数必须具有相同的大小。您可以通过将 c0
设为 unsigned char
并将 mov %%ax, %0
更改为 mov %%ah, %0
. 来解决此问题
无论如何,在内联汇编中使用 mov
通常是错误的,但在这里很难避免,因为您不能轻易地告诉 gcc 在 ah
寄存器中期望 c0
。
我想要 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 但同样的错误。
你的代码有两个错误:
$
前缀表示立即数。mov %ax, [=11=]
试图将ax
移动到立即数0
,这是荒谬的。也许您打算改为写%0
,表示c0
?- 如果我们用
mov %%ax, %0
替换mov %%ax, [=16=]
,第二个问题是c0
是一个int
,因此%0
被一些32位替换注册,所以你会得到类似mov %ax, %ecx
的东西。这也是错误的,因为mov
的两个操作数必须具有相同的大小。您可以通过将c0
设为unsigned char
并将mov %%ax, %0
更改为mov %%ah, %0
. 来解决此问题
无论如何,在内联汇编中使用 mov
通常是错误的,但在这里很难避免,因为您不能轻易地告诉 gcc 在 ah
寄存器中期望 c0
。