gcc内联汇编基础.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
gcc内联汇编基础

GCC内联汇编基础 来源:中国自学编程网 ??发布日期:2008-09-08 ? 这篇文章阐述内联汇编的使用方法。显然,阅读这篇文章您需要具备X86汇编语言和C语言的基础知识。 Contents 1. 简介 3 2. 概要 3 3. GCC汇编格式。 3 1) 源操作数和目的操作数的方向 3 2) 寄存器命名 4 3) 立即数 4 4) 操作数大小 4 5) 内存操作数 4 4. 基本形式的内联汇编 4 5. 扩展形式的内联汇编 5 5.1 汇编模板 6 5.2 操作数 6 5.3 Clobber List 7 5.4 Volatile…? 8 6. 深入constraints。 8 6.1 常用constraints 8 6.2 constraint修改标记 10 7.常用技巧 10 8.结束语 13 9. 参考文献 13 1. 简介 [主要是版权/反馈/勘误/感谢等信息。没有翻译。--译者注, 本文中方括号中的都是译者注] 2. 概要 我们现在学习GCC内联汇编,那么内联汇编到底是什么? [我们首先先来看看内联函数有什么好处] 我们可以让编译器将函数代码插入到调用者代码中,指出函数在代码中具体什么位置被执行。这种函数就是内联函数。内联函数似乎很像一个宏?的确,他们之间有很多相似之处。 那么内联函数到底有什么好处呢? 内联函数降低了函数调用的开销。[不仅仅节省堆栈] 如果某些函数调用的实参相同,那么返回值一定是相同的,这就可能给编译器留下了简化的空间。因为返回值相同了就不必把内联函数的代码插入到调用者的代码中[直接用这个返回值替换就好了]。这样可以减少代码量,视不同的情况而定。声明一个函数是内联函数,使用关键字 inline。 现在我们回到内联汇编上来。内联汇编就是一些汇编语句写成的内联函数。它方便,快速,对系统编程非常有用。我们主要目标是研究GCC内联函数的基础格式和使用方法。声明一个内联汇编函数,我们使用关键字 asm。 内联汇编的重要性首先体现在它的操作C语言变量和输出值到C语言变量的能力。由于这些特性,内联汇编常被用作汇编指令和调用它的C程序之间的接口。 3. GCC汇编格式。 GCC (GNU Compiler for Linux) 使用ATT UNIX汇编语法.这里我们将用ATT汇编格式来写代码。如果你不熟悉ATT汇编语法也没有关系,下面将有介绍。ATT和Intel汇编语法有很多的不同之处。我将给出主要的不同点。 1) 源操作数和目的操作数的方向 ATT和Intel汇编语法相反。Intel语法中第一个操作数作为目的操作数,第二个操作数作为源操作数。相反,在ATT语法中,第一个操作数是源操作数,第二个是目的操作数,例如: Intel语法: OP-code dst src ATT语法: Op-code src dst 2) 寄存器命名 [在ATT语法中] 寄存器名字加上%前缀,例如,如果要使用eax, 写作: %eax. 3) 立即数 ATT语法中,立即数以$符号作为前缀。静态C变量前也要加上$前缀。在Intel语法中,16进制的常数加上h后缀,但是在ATT中,常量前要加上0x。 对于一个16进制常数(在ATT中),首先以$开头接着是0x,最后是常数。 4) 操作数大小 在ATT语法中,操作数占内存大小决定于汇编命令操作符的最后一个字符的内容。 操作符以b, w和 l为后缀指明内存访问长度是 byte(8-bit), word(16-bit)还是long(32-bit). 而Intel语法在操作数前加上byte ptr, word ptr和dword ptr的内存操作数(这个操作数不是汇编命令操作符)来达到相同目的. 因此, Intel mov al, byte ptr foo 用ATT语法就是 :movb foo, %al 5) 内存操作数 在Intel的语法中,基址寄存器用[和]扩起来,但是在ATT中改用(和)。 此外,在Intel语法中一个间接内存寻址: section:[base + index * scale + disp],在ATT中则为: section:disp(base, index, scale) 总是需要记住的一点就是,当一个常数被用作disp或者scale时,就不用加$前缀。 现在我们已经提到了ATT和Intel语法的一些主要不同点。 我只是提到了一小部分。全部内容可以参考GNU汇编文档。为了更好理解这些不同,请看下面的例子: Intel Code ATT Code mov eax,1 movl $1, %eax mov ebx,0ff

文档评论(0)

牛X文档 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档