- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
进行编码或优化代码路径您很可能是通过将汇编语言指令
如果您是Linux 内核的开发人员,您会发现自己经常要对与体系结构高度相关的功能进行编码或优化代码路径。您很可
能是通过将汇编语言指令插入到 C 语句的中间(又称为内联汇编的一种方法)来执行这些任务的。让我们看一下 Linux
中内联汇编的特定用法。(我们将讨论限制在 IA32 汇编。)
GNU 汇编程序简述
让我们首先看一下 Linux 中使用的基本汇编程序语法。GCC (用于Linux GNU C 编译器)使用 ATT 汇编语法。
下面列出了这种语法的一些基本规则。(该列表肯定不完整;只包括了与内联汇编相关的那些规则。)
寄存器命名
寄存器名称有 % 前缀。即,如果必须使用 eax,它应该用作 %eax。
源操作数和目的操作数的顺序
在所有指令中,先是源操作数,然后才是目的操作数。这与将源操作数放在目的操作数之后 Intel 语法不同。
mov %eax, %ebx, 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 %eax, %ebx -- Longword move
立即操作数
通过使用 $ 指定直接操作数。
movl $0xffff, %eax -- will move the value of 0xffff into eax register.
间接内存引用
任何对内存的间接引用都是通过使用 ( ) 来完成的。
movb (%esi), %al -- will transfer the byte in the memory
内联汇编
GCC 为内联汇编提供特殊结构,它具有以下格式:
GCG asm 结构
asm ( assembler template
: output operands (optional)
: input operands (optional)
: list of clobbered registers (optional)
);
本例中,汇编程序模板由汇编指令组成。输入操作数是充当指令输入操作数使用 C表达式。输出操作数是将对其执行
汇编指令输出 C 表达式。
内联汇编的重要性体现在它能够灵活操作,而且可以使其输出通过 C 变量显示出来。因为它具有这种能力,所以 asm
可以用作汇编指令和包含它 C 程序之间的接口。
一个非常基本但很重要的区别在于简单内联汇编只包括指令,而扩展内联汇编包括操作数。要说明这一点,考虑以下示
例:
内联汇编的基本要素
第 1 页
进行编码或优化代码路径您很可能是通过将汇编语言指令
{
int a=10, b;
asm (movl %1, %%eax;
movl %%eax, %0;
:=r(b) /* output */
:r(a) /* input */
:%eax); /* clobbered register */
}
在上例中,我们使用汇编指令使 b 的值等于 a。请注意以下几点:
b 是输出操作数,由 %0 引用,a 是输入操作数,由 %1 引用。
r 是操作数的约束,它指定将变量 a 和 b 存储在寄存器中。请注
意,输出操作数约束应该带有一个约束修饰符 =,指定它是输出操
作数。
文档评论(0)