使用GCC的内联汇编

时间:2013-02-27 13:51:20

标签: gcc assembly x86 inline-assembly

我想将MS的简单汇编代码转换为与gcc一起使用,我尝试转换的MS汇编就在下面。我有两个int变量,number_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'无效:%-letter后缺少操作数编号

错误在哪里,以及我如何解决此错误? 感谢

2 个答案:

答案 0 :(得分:4)

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

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

请改为尝试:

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

但可能有更好的方法:

asm("neg %0\n\t": "=a" ( _return )  : "a" ( number));

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

_return = -number;

答案 1 :(得分:4)

尝试类似:

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

问题是:

  • 操作数的顺序为instr src,dst
  • %%而不是%
  • 没有隔离的汇编程序行 - 输入/输出/ clobber列表与汇编程序块的所有相关联
  • '+ r'有一个既作为输入又作为输入的参数。输出
  • 我怀疑甚至MS允许使用关键字“return”那样

为了提高效率:

asm("neg %0" : "+r" (n) ::);  // works as well