【问题标题】:operand type mismatch for `mov''mov' 的操作数类型不匹配
【发布时间】:2017-12-01 14:31:26
【问题描述】:

我想要 eflags 值,但出现错误

operand type mismatch for `mov'

这是我的代码:

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

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

【问题讨论】:

  • 使用"=a"(c0) 而不是"=r" 告诉编译器结果首先在RAX/EAX/AX/AL 中,不需要MOV。每当您的内联汇编以 MOV 开头或结尾时,您的编写效率都可能很低。

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


【解决方案1】:

你的代码有两个错误:

  1. $ 前缀表示立即数。 mov %ax, $0 尝试将 ax 移动到直接的 0,这是荒谬的。也许您的意思是写%0,表示c0
  2. 如果我们用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

【讨论】:

  • 您可以使用寄存器变量,例如register unsigned char flags asm("ah");。然而gcc 似乎有一个错误并使用alclang 工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2023-03-27
  • 2018-11-02
相关资源
最近更新 更多