将各个部分组合起来
developerWorks
文档选项
将此页作为电子邮件发送
将此页作为电子邮件发送
最新推荐
Java 应用研发源动力 - 下载免费软件,快速启动研发
级别: 初级
Bharata B. RaoIBM Linux 技术中央,IBM 软件实验室,印度
2001 年 3 月 01 日
Bharata B. Rao 提供了在 Linux 平台上使用和构造 x86 内联汇编的概括性介绍。他介绍了内联汇编及其各种用法的基础知识,提供了一些基本的内联汇编编码指导,并解释了在 Linux 内核中内联汇编代码的一些实例。
假如您是 Linux 内核的研发人员,您会发现自己经常要对和体系结构高度相关的功能进行编码或优化代码路径。您很可能是通过将汇编语言指令插入到 C 语句的中间(又称为内联汇编的一种方法)来执行这些任务的。让我们看一下 Linux 中内联汇编的特定用法。(我们将讨论限制在 IA32 汇编。)
GNU 汇编程式简述
让我们首先看一下 Linux 中使用的基本汇编程式语法。GCC(用于 Linux 的 GNU C 编译器)使用 AT&T 汇编语法。下面列出了这种语法的一些基本规则。(该列表肯定不完整;只包括了和内联汇编相关的那些规则。)
寄存器命名
寄存器名称有 % 前缀。即,假如必须使用 eax,他应该用作 陎。
源操作数和目的操作数的顺序
在任何指令中,先是源操作数,然后才是目的操作数。这和将源操作数放在目的操作数之后的 Intel 语法不同。
mov 陎, 離, transfers the contents of eax to ebx.
操作数大小
根据操作数是字节 (byte)、字 (word) 还是长型 (long),指令的后缀能够是 b、w 或 l。这并不是强制性的;GCC 会尝试通过读取操作数来提供相应的后缀。但手工指定后缀能够改善代码的可读性,并能够消除编译器猜测不正确的可能性。
movb %al, %bl -- Byte move
movw %ax, %bx -- Word move
movl 陎, 離 -- Longword move
立即操作数
通过使用 $ 指定直接操作数。
movl $0xffff, 陎 -- will move the value of 0xffff into eax register.
间接内存引用
任何对内存的间接引用都是通过使用 ( ) 来完成的。
movb (%esi), %al -- will transfer the byte in the memory
pointed by esi into al
register
回页首
内联汇编
GCC 为内联汇编提供特别结构,他具备以下格式:
GCG 的 "asm" 结构
asm ( assembler template
: output operands (optional)
: input operands (optional)
: list of clobbered registers
(optional)
);
本例中,汇编程式模板由汇编指令组成。输入操作数是充当指令输入操作数使用的 C 表达式。输出操作数是将对其执行汇编指令输出的 C 表达式。
内联汇编的重要性体现在他能够灵活操作,而且能够使其输出通过 C 变量显示出来。因为他具备这种能力,所以 "asm" 能够用作汇编指令和包含他的 C 程式之间的接口。
一个很基本但很重要的区别在于 简单内联汇编只包括指令,而 扩展内联汇编包括操作数。要说明这一点,考虑以下示例:
内联汇编的基本要素
{
int a=10, b;
asm ("movl %1, %陎;
movl %陎, %0;"
:"=r"(b) /* output */
:"r"(a) /* input */
:"陎"); /* clobbered register */
}
在上例中,我们使用汇编指令使 "b" 的值等于 "a"。请注意以下几点:
* "b" 是输出操作数,由 %0 引用,"a" 是输入操作数,由 %1 引用。
* "r" 是操作数的约束,他指定将变量 "a" 和 "b" 存储在寄存器中。请注意,输出操作数约束应该带有一个约束修饰符 "=",指定他是输出操作数。
* 要在 "asm" 内使用寄存器 陎,陎 的前面应该再加一个 %,换句话说就是 %陎,因为 "asm" 使用 %0、%1 等来标识变量。任何带有一个 % 的数都看作是输入/输出操作数,而不认为是寄存器。
* 第三个冒号后的修饰寄存器 陎 告诉将在 "asm" 中修改 GCC 陎 的值,这样 GCC 就不使用该寄存器存储任何其他的值。
* movl %1, %陎 将 "a" 的值移到 陎 中, movl %陎, %0 将 陎 的内容移到 "b" 中。
* 因为 "b" 被指定成输出操作数,因此当 "asm" 的执行完成后,他将反映出更新的值。换句话说,对 "asm" 内 "b" 所做的更改将在 "asm" 外反映出来。
现在让我们更周详的了解每一项的含义。
回页首
汇编程式模板
汇编程式模板是一组插入到 C 程式中的汇编指令(能够是单个指令,也能够是一组指令)。每条指令都应该由双引号括起,或整组指令应该由双引号括起。每条指令还应该用一个定界符结尾。有效的定界符为新行 (\n) 和分号 (;)。 '\n' 后能够跟一个 tab(\t) 作为格式化符号,增加 GCC 在汇编文档中生成的指令的可读性。 指令通过数 %0、%1 等来引用 C 表达式(指定为操作数)。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




