Chinaunix首页 | 论坛 | 博客
  • 博客访问: 479746
  • 博文数量: 72
  • 博客积分: 1851
  • 博客等级: 上尉
  • 技术积分: 1464
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-16 17:50
文章分类

全部博文(72)

文章存档

2013年(1)

2012年(17)

2011年(51)

2010年(3)

分类: 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

阅读(1307) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~