文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | 免费看大片 | WPS | 杀毒软件
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形处理 办公软件 媒体动画 精文荟萃 工具软件 网络编程 程序开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院程序开发OracleLinux 中 x86 的内联汇编
精品推荐
特别推荐
·常用数据库比较
·ODBC API常用函数诠释
·提高ORACLE数据库的查询统计速度
·细化解析:Oracle使用的hints调整机制
·解析Oracle/Oracle Forms 的多用途代码
·从Oracle的FORM中调用REPORT的实用技巧
·Oracle SQL精妙SQL语句讲解
·ORACLE学习笔记--性能优化四
·ORACLE常用傻瓜问题1000问
·ORACLE常见错误代码的分析与解决之二
·深刻理解Oracle数据库的启动和关闭
·监控Oracle数据库的常用shell脚本
·Oracle在Solaris下的性能与调整简介
·通俗解说ORACLE
·数据库安全性策略
热点TOP10
·详细介绍ORACLE sqlplus命令
·ORACLE常用傻瓜问题1000问
·我的oracle笔记四(DBA管理)
·Oracle SQL精妙SQL语句讲解
·Oracle Tuning (Oracle 性能调整)的一些总结
·我的oracle笔记一(sql语句方面)
·程序员如何掌握计算机英语
·用正则表达式函数验证身份证号码合法性
·oracle数据库 exp/imp命令详解
·性能分析工具的使用
·ORACLE UPDATE 语句语法与性能分析看法
·在Solaris 10 X86上安装Oracle 10g RAC详解 (1)
·ORA-01092: ORACLE 例程终止。强行断开连接
·VMware下RedHat安装Oracle 9i RAC全攻略
·监控Oracle数据库的常用shell脚本
·手工创建oracle数据库
·常用数据库比较
·PL/Sql循序渐进全面学习教程
·在Solaris 10 X86上安装Oracle 10g RAC详解 (2)
·Oracle客户端文件打包

Linux 中 x86 的内联汇编

日期:2007年7月2日 作者: 查看:[大字体 中字体 小字体]



  作者:Bharata B. Rao
  
  将各个部分组合起来
  
  如果您是 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)
  
  
  );
  
  本例中,汇编程序模板由汇编指令组成。输入操作数是充当指令输入操作数使用的 C 表达式。输出操作数是将对其执行汇编指令输出的 C 表达式。
  
  内联汇编的重要性体现在它能够灵活操作,而且可以使其输出通过 C 变量显示出来。因为它具有这种能力,所以 "asm" 可以用作汇编指令和包含它的 C 程序之间的接口。
  
  一个非常基本但很重要的区别在于简单内联汇编只包括指令,而扩展内联汇编包括操作数。要说明这一点,考虑以下示例:
  
  内联汇编的基本要素
  
  {
   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" 存储在寄存器中。请注意,输出操作数约束应该带有一个约束修饰符 "=",指定它是输出操作数。
  要在 "asm" 内使用寄存器 %eax,%eax 的前面应该再加一个 %,换句话说就是 %%eax,因为 "asm" 使用 %0、%1 等来标识变量。任何带有一个 % 的数都看作是输入/输出操作数,而不认为是寄存器。
  第三个冒号后的修饰寄存器 %eax 告诉将在 "asm" 中修改 GCC %eax 的值,这样 GCC 就不使用该寄存器存储任何其它的值。
[1] [2] [3] 下一页 




上一篇:基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(七)

下一篇:基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(八)

Linux 中 x86 的内联汇编 相关文章:
·破解基础知识汇编
·DENX U-Boot及Linux使用手册
·Linux常用命令详解
·Linux各种服务器的架设
·linux知识大全
·Linux文件和目录访问权限设置
·LINUX 常见问题1000个详细解答
·Linux BOOTLOADER全程详解(Arm S3C2410)
·XPCOM--LINUX下的组件开发技术
·李纳斯·托沃兹(Linus Torvalds):Linux之父
Linux 中 x86 的内联汇编 相关软件:
·Windows环境下32位汇编语言程序设计
·鸟哥的linux私房菜:基础学习篇
·红帽子Red Hat Linux 8.0(3G,5CD)
·清朝史料汇编
·Dreamweaver MX试题汇编
·汇编语言共34讲csf东南大学朱敏
·Linux 系统命令及其使用详解(大全)
·汇编语言入门教程PPT
·linux操作系统视频教程
·Fireworks MX试题汇编

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.vipcn.net
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.vipcn.net All Rights Reserved. 鄂ICP备05000083号Powered by:viphot