Chinaunix首页 | 论坛 | 博客
  • 博客访问: 157785
  • 博文数量: 70
  • 博客积分: 2050
  • 博客等级: 大尉
  • 技术积分: 690
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-22 22:04
文章分类

全部博文(70)

文章存档

2014年(1)

2013年(1)

2012年(3)

2011年(48)

2010年(17)

我的朋友

分类: LINUX

2011-03-18 21:27:32

__asm__ __volatile__内嵌汇编用法简述

带有C/C++表达式的内联汇编格式为:

__asm__ __volatile__("Instruction List" : Output : Input : Clobber/Modify);

其中每项的概念及功能用法描述如下:

1 __asm__

__asm__GCC 关键字asm 的宏定义:

#define __asm__ asm

__asm__asm 用来声明一个内联汇编表达式,所以任何一个内联汇编表达式都是以它开头的,是必不可少的。

2Instruction List

Instruction List 是汇编指令序列。它可以是空的,比如:__asm__ __volatile__(""); __asm__ ("");都是完全合法的内联汇编表达式,只不过这两条语句没有什么意义。但并非所有Instruction List 为空的内联汇编表达式都是没有意义的,比如:__asm__ ("":::"memory");

就非常有意义,它向GCC 声明:内存作了改动GCC 在编译的时候,会将此因素考虑进去。

如果要将多条指令放在一行,则必须用分号(;)或换行符(\n)将它们分开. 综上述:(1)每条指令都必须被双引号括起来 (2)两条指令必须用换行或分号分开。

3. __volatile__

__volatile__GCC 关键字volatile 的宏定义

#define __volatile__ volatile

__volatile__volatile 是可选的。如果用了它,则是向GCC 声明不允许对该内联汇编优化,否则当 使用了优化选项(-O)进行编译时,GCC 将会根据自己的判断决定是否将这个内联汇编表达式中的指令优化掉。

4 Output

Output 用来指定当前内联汇编语句的输出

5 Input

Input 域的内容用来指定当前内联汇编语句的输入OutputInput中,格式为形如“constraint”(variable)的列表(逗号分隔)

6.Clobber/Modify

有时候,你想通知GCC当前内联汇编语句可能会对某些寄存器或内存进行修改,希望GCC在编译时能够将这一点考虑进去。那么你就可以在Clobber/Modify域声明这些寄存器或内存。

"memory"是向GCC声明内存发生了变化,

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