错误:无效';asm';:将内联程序集与GCC一起使用时,%字母后缺少操作数
我正在尝试转换一个简单的MS汇编代码以用于gcc,我尝试转换的MS汇编代码就在下面。我有两个错误:无效';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
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