'mov'的操作数类型不匹配

时间:2017-12-01 14:31:26

标签: gcc assembly x86 x86-64 inline-assembly

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

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");

这是我的代码:

public function __construct()
{
    $this->billingAddresses = new ArrayCollection();
}

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

1 个答案:

答案 0 :(得分:3)

您的代码中有两个错误:

  1. $前缀表示立即。 mov %ax, $0尝试将ax移至紧急0,这是荒谬的。也许您打算写%0代替c0
  2. 如果我们将mov %%ax, $0替换为mov %%ax, %0,则第二个问题是c0int,因此%0被替换为某个32位寄存器,所以你得到mov %ax, %ecx之类的东西。这也是错误的,因为mov的两个操作数必须具有相同的大小。您可以将c0改为unsigned char并将mov %%ax, %0更改为mov %%ah, %0来解决此问题。
  3. 无论如何,在内联汇编中使用mov通常是错误的,但在这里很难避免,因为你无法轻易告诉gcc期望c0 ah注册。