分类: C/C++
2011-10-16 15:57:54
汇编指令,嵌入到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