错误:无效';asm';:将内联程序集与GCC一起使用时,%字母后缺少操作数

错误:无效';asm';:将内联程序集与GCC一起使用时,%字母后缺少操作数,gcc,assembly,x86,inline-assembly,Gcc,Assembly,X86,Inline Assembly,我正在尝试转换一个简单的MS汇编代码以用于gcc,我尝试转换的MS汇编代码就在下面。我有两个int变量,number和\u return: mov eax, number neg eax return, eax 我试过这样做: asm("movl %eax, %0" :: "g" ( number)); asm("neg %eax"); asm("movl %0, %%eax" : "=g" ( return )); 但是,编译器给了我这个错误: main.c:17:9:错误:无效的“asm

我正在尝试转换一个简单的MS汇编代码以用于gcc,我尝试转换的MS汇编代码就在下面。我有两个
int
变量,
number
\u return

mov eax, number
neg eax
return, eax
我试过这样做:

asm("movl %eax, %0" :: "g" ( number));
asm("neg %eax");
asm("movl %0, %%eax" : "=g" ( return ));
但是,编译器给了我这个错误:

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

错误在哪里?如何修复此错误?
谢谢

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

最好将所有指令放在一个
asm
中,否则编译器可能会在两者之间执行意外操作

请尝试以下方法:

asm("movl %%eax, %1\n\t"
    "neg %%eax\n\t"
    "movl %0, %%eax" : "=g" ( _return )  : "g" ( number) : "eax");
不过,可能还有更好的办法:

asm("neg %0": "=a" ( _return )  : "a" ( number));
我不知道你为什么不能(在C中):

尝试以下方法:

#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);
}     

看到生成程序集,我看到了:。。。“mov DWORD PTR[esp+24],0…”%eax,ebx“…”neg%eax“movl ebx,%eax”(变量错误:()您的第一个块是向后的;AT&T语法将目标放在最后,请参见Aki的回答。如果您使用
-masm=intel
编译,则不应在寄存器名上使用
%
。您也不需要强制EAX,只需将
neg%0
“+r一起使用即可“
constraint。但是,是的,显然内联asm在这方面是一个糟糕的主意。您的想法是正确的——我只是无法从问题中找出所有重要的规范:它是
asm(“mov%1,%0\n\t neg%0\n\t”:“=r”(\u返回值):“r”(输入):)
如果以后执行
返回值
,gcc很可能会将
eax
分配为寄存器
%0
#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);
}     
asm("neg %0" : "+r" (n) ::);  // works as well