错误:无效的“asm”:将内联汇编与 GCC 一起使用时,%-字母后缺少操作数编号

Ale*_*dre 3 x86 assembly gcc inline-assembly

我正在尝试将 MS 的简单汇编代码转换为与 gcc 一起使用,我尝试转换的 MS 程序集就在下面。我有两个int变量,number并且_return

mov eax, number
neg eax
return, eax
Run Code Online (Sandbox Code Playgroud)

而且,我试过这个:

asm("movl %eax, %0" :: "g" ( number));
asm("neg %eax");
asm("movl %0, %%eax" : "=g" ( return ));
Run Code Online (Sandbox Code Playgroud)

但是,编译器给了我这个错误:

main.c:17:9: 错误: 无效的“asm”: %-字母后缺少操作数

错误在哪里,我该如何解决这个错误?谢谢

ams*_*ams 9

你不能那样做,因为你在没有告诉编译器的情况下覆盖了寄存器。此外,%是一个特殊字符,类似于 printf。

最好将所有指令放在一个指令中asm,否则编译器可能会在两者之间做一些意想不到的事情。

试试这个:

asm("movl %%eax, %1\n\t"
    "neg %%eax\n\t"
    "movl %0, %%eax" : "=g" ( _return )  : "g" ( number) : "eax");
Run Code Online (Sandbox Code Playgroud)

不过,可能有更好的方法:

asm("neg %0": "=a" ( _return )  : "a" ( number));
Run Code Online (Sandbox Code Playgroud)

我不知道为什么你不能只做(在 C 中):

_return = -number;
Run Code Online (Sandbox Code Playgroud)


Aki*_*nen 5

尝试类似:

#include <stdio.h>
#include <stdlib.h>
int main(int ac,char**av)
{
    int n=ac>1?atoi(av[1]):42;
    asm ("movl %0, %%eax \n\t"
         "neg %%eax \n\t"
         "movl %%eax, %0 \n\t" : "+r" (n)::"eax");
    printf("%d\n",n);
}     
Run Code Online (Sandbox Code Playgroud)

问题是:

  • 操作数的顺序是 instr src,dst
  • %% 代替 %
  • 没有独立的汇编行——输入/输出/clobber 列表与所有汇编程序块相关联
  • '+r' 有一个既可用作输入又可用作输出的参数
  • 我怀疑甚至 MS 是否允许以这种方式使用关键字“返回”

并使其更加高效:

asm("neg %0" : "+r" (n) ::);  // works as well
Run Code Online (Sandbox Code Playgroud)