转自:http://blog.csdn.net/wuyao721/article/details/3573598
原文为GCC-Inline-Assembly-HOWTO,在google上可以找到原文,欢迎指出翻译错误。
中文版说明
由于译者水平有限,故译文出错之处,还请见谅。C语言的关键字不译,一些单词或词组(如colbber等)由于恐怕译后词不达意,故并不翻译,由下面的单词表代为解释,敬请见谅。
英文原文中的单词和词组:
operand:操作数,可以是寄存器,内存,立即数。
volatile:易挥发的,是C语言的关键字。
constraint: 约束。
register: 本文指CPU寄存器。
asm:“asm”和“__asm__”在C语言中是关键字。原文中经常出现这个单词,是指嵌入到C语言(或者其它语言)的汇编程序片断。
basic inline assembly:指C语言中内联汇编程序的一种形式,和extended asm对应。基本格式如下:
asm("assembly code");
extended assembly:和basic inline assembly对应,比它多了一些特性,如可以指明输入,输出等。基本格式如下:
asm ( assembler template
: output operands
: input operands
: list of clobbered registers
);
clobber list:实际上就是被使用的寄存器的列表,用来告诉GCC它们已经被asm使用了,不要在asm程序外使用它们。不然可能带来不可预见的后果。
clobbered registers:它和clobber list对应。
assembler template:就是汇编模板,所有内联汇编代码都有按一定的格式。
见extended assembly的说明
作者:Sandeep.S
译者:吴遥
版本号 v0.1 2003年3月01日
翻译版更新日期 2008/06/11
这篇HOWTO解释GCC提供的内联汇编特性的用途和用法。学习这篇文章只须具备两个前提条件,显然那就是对x86汇编语言和C语言有基本的了解。
目 录
1. 前言
1.1版权与许可证
1.2回馈与更正
1.3感谢
2.简介
3.GCC汇编语法
4.基本内联汇编
5.扩展内联汇编
5.1汇编程序模板
5.2操作数
5.3 Clobber列表
5.4 Volatile … ?
6.更多关于约束条件
6.1 常用的约束
6.2 约束修饰符
7. 一些有用的诀窍
8. 结束语
9. 参考
版权所有 (c)2003 Sandeep S.
这篇文档是免费的,你可以在依据自由软件组织GNU通用公共许可证条款下重新发布或者修改它。无论是版本2的许可证还是后来的版本(由你自己选择)。
这份文档的发布是希望它有用,但是并没有任何保证。
欢迎善意的回馈和批评,我感谢每一个指出本文错误的人并尽快地更正错误。
我向GNU开发者提供这个功能强大的特性表达最诚挚的感谢。感谢Mr.Pramode C E的帮助。感谢政府工程学院的朋友尤其是Nisha Kurur和Sakeeb S精神上的支持。感谢政府工程学院老师对我的帮助。
另外,还要感谢 Phillip、Brennan、Underwood 和 colin@nyx.net ,他们解决了很多难题。
现在我们开始学GCC内联汇编。内联意味着什么?
我们可以指示编译器插入一个函数的代码到调用者的代码中,也就是实际上调用产生的地方。这样的函数就是内联函数。看上去很像宏?实际上它们很相似。
内联函数有什么好处呢?
内联的方法减少了函数调用的额外开销。而且如果有实际的参数值是常数,那么在编译的时候编译器知道可能充许参数值的单一化,所以并不是所有的内联函数的代码都要
包含进来。对可执行代码大小的影响是不可预测的,它视乎对特定的情况。声明一个内联函数,我们声明中使用关键字inline。
现在我们站在一个位置来猜什么是内联汇编。它只是一些写在函数内的汇编语言的程序。在系统编程时候它们会显得很便利,快速,非常有用。我们的主要目标是学习GCC
内联汇编函数的基本格式和用法。
内联汇编之所以如此重要主要是因为它操作的能力和让它的输出在C语言变量中可见。(这个句话译得不太好)因为这样的能力,“asm”(译者:asm指内联函数)就像一个汇编指令和包含它的C语言程序之间的接口。
GCC,即Linux平台下的GNU C语言编译器,它使用AT&T&sol(译者:应该是指AT&T语法,但是sol就不知道是什么);UNIX汇编语法。现在让我们使用AT&T语法来进行汇编编码。如果你对AT&T语法不熟悉也不用担心,我将会教你。这种语法和Intel语法有很大的不同。以下我将给出主要的不同。
1、来源地-目的地 定序
AT&T语法和Intel语法在操作数的方向上是相反的。Intel语法的第一个操作数是目的地,第二个是来源地。然而AT&T语法的第一个操作数是来源地,第二的是目的地。也即:
“Op-code dst src”在Intel语法中变为“Op-code src dst”AT&T语法。
2、寄存器命名
寄存器名字要有前缀“%”。也即如果寄存器eax被使用,应写作
