Linux操作系统中x86的内联汇编
linux 中 x86 的内联汇编
将各个部分组合起来
developerworks
文档选项
将此页作为电子邮件发送
最新推荐
java 应用开发源动力 - 下载免费软件,快速启动开发
级别: 初级
bharata b. raoibm linux 技术中心,ibm 软件实验室,印度
bharata b. rao 提供了在 linux 平台上使用和构造 x86 内联汇编的概括性介绍。他介绍了内联汇编及其各种用法的基础知识,提供了一些基本的内联汇编编码指导,并解释了在 linux 内核中内联汇编代码的一些实例。
如果您是 linux 内核的开发人员,您会发现自己经常要对与体系结构高度相关的功能进行编码或优化代码路径。您很可能是通过将汇编语言指令插入到 c 语句的中间(又称为内联汇编的一种方法)来执行这些任务的。让我们看一下 linux 中内联汇编的特定用法。(我们将讨论限制在 ia32 汇编。)
gnu 汇编程序简述
让我们首先看一下 linux 中使用的基本汇编程序语法。gcc(用于 linux 的 gnu c 编译器)使用 at&t 汇编语法。下面列出了这种语法的一些基本规则。(该列表肯定不完整;只包括了与内联汇编相关的那些规则。)
寄存器命名
寄存器名称有 % 前缀。即,如果必须使用 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
pointed by esi into al
register
内联汇编
gcc 为内联汇编提供特殊结构,它具有以下格式:
gcg 的 "asm" 结构
asm ( assembler template
: output operands (optional)
: input operands (optional)
: list of clobbered registers
(optional)
);
Tag: 汇编
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。