using inline assembly with GCC

夙愿已清 提交于 2019-12-02 05:34:25

You can't do it like that because you're overwriting registers without telling the compiler about it. Also, the % is a special character, similar to printf.

It's also better to put all the instructions in one asm or else the compiler might do something unexpected in between.

Try this instead:

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

There's probably a better way, though:

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

I don't know why you can't just do (in C):

_return = -number;

Try something like:

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

The issues are:

  • order of operands is instr src,dst
  • %% instead of %
  • no isolated lines of assembler -- the input/output/clobber list is associated to all of the assembler block
  • '+r' to have a parameter that works as both input & output
  • I doubt even MS allows using keyword "return" that way

And to make it even more efficient:

asm("neg %0" : "+r" (n) ::);  // works as well
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!