gcc内联汇编学习笔记

1400阅读 0评论2011-10-16 datao0907
分类:C/C++

汇编指令,嵌入到C语言中,通过关键字asm来指定,如果告诉编译器不能进行修改,则需要加入关键字volatile.语法为:

其中求sin的代码:

int main()

{

double result,angle;

angle = 20;

//__asm__(“fsinx”:”=t”(result):”0”(angle));

//__asm__ __volatile__ (“fsinx”:”=t”(result):”0”(angle));

asm(“fsinx ”:”=t”(result):”0”(angle));

return 0;

}

上面的三种方法都是可行的,汇编的语法为:

(“instruction list”:output:input:clobber/modify)

指令中可以设置参数也可以直接指定寄存器,在指定参数时,通过%0...%n,来标明从ouput开始进行计数即%0...%n,output表明这是输出结果,input表明这是输入结果,clobber/modify则指明这些寄存器可能需要进行修改。如果有多个参数则通过,进行分割。

在输出参数中,=表示只写,或者+既可读有可写。而其中的t则表示使用浮点栈st,而后面的括号里面就是C语言表达式。

在输入参数中,0...n表示使用前面的一样的输出寄存器,当然也可以指定其他的寄存器,括号里面一样是C语言表达式.

其中常见的寄存器符号如下(不同的处理器不同的符号,这里针对的是386)

a:eax b:ebx c:ecx d:edx S:si D:di A:eax edx

f:浮点寄存器 t:%st

g:通用寄存器

r:任何寄存器

q:任何可以访问的寄存器(a,b,c,d)

这里有详细的描述()

参考资料:

http://www.lysium.de/blog/index.php?/archives/135-Gcc-inline-assembler-howto-summary.html

上一篇:函数调用方式分析
下一篇:原子数据类型的实现