GAS汇编介绍.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文档。上传文档
查看更多
GAS汇编介绍

gas汇编介绍一、简介 作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。就拿?Linux?内核来讲,虽然绝大部分代码是用?C?语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在?Linux?的启动部分。由于这部分代码与硬件的关系非常密切,即使是?C?语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。 大多数情况下?Linux?程序员不需要使用汇编语言,因为即便是硬件驱动这样的底层程序在?Linux?操作系统中也可以用完全用?C?语言来实现,再加上?GCC?这一优秀的编译器目前已经能够对最终生成的代码进行很好的优化,的确有足够的理由让我们可以暂时将汇编语言抛在一边了。但实现情况是?Linux?程序员有时还是需要使用汇编,或者不得不使用汇编,理由很简单:精简、高效和?libc?无关性。假设要移植?Linux?到某一特定的嵌入式硬件环境下,首先必然面临如何减少系统大小、提高执行效率等问题,此时或许只有汇编语言能帮上忙了。 汇编语言直接同计算机的底层软件甚至硬件进行交互,它具有如下一些优点: 能够直接访问与硬件相关的存储器或?I/O?端口;? 能够不受编译器的限制,对生成的二进制代码进行完全的控制;? 能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁;? 能够根据特定的应用对代码做最佳的优化,提高运行速度;? 能够最大限度地发挥硬件的功能。? 同时还应该认识到,汇编语言是一种层次非常低的语言,它仅仅高于直接手工编写二进制的机器指令码,因此不可避免地存在一些缺点: 编写的代码非常难懂,不好维护;? 很容易产生?bug,难于调试;? 只能针对特定的体系结构和处理器进行优化;? 开发效率很低,时间长且单调。? Linux?下用汇编语言编写的代码具有两种不同的形式。第一种是完全的汇编代码,指的是整个程序全部用汇编语言编写。尽管是完全的汇编代码,Linux?平台下的汇编工具也吸收了?C?语言的长处,使得程序员可以使用?#include、#ifdef?等预处理指令,并能够通过宏定义来简化代码。第二种是内嵌的汇编代码,指的是可以嵌入到C语言程序中的汇编代码片段。虽然?ANSI?的?C?语言标准中没有关于内嵌汇编代码的相应规定,但各种实际使用的?C?编译器都做了这方面的扩充,这其中当然就包括?Linux?平台下的?GCC。 二、Linux?汇编语法格式 绝大多数?Linux?程序员以前只接触过DOS/Windows?下的汇编语言,这些汇编代码都是?Intel?风格的。但在?Unix?和?Linux?系统中,更多采用的还是?ATT?格式,两者在语法格式上有着很大的不同: 在?ATT?汇编格式中,寄存器名要加上?%?作为前缀;而在?Intel?汇编格式中,寄存器名不需要加前缀。例如: ATT?格式??pushl?%eax Intel?格式?push?eax? 在?ATT?汇编格式中,用?$?前缀表示一个立即操作数;而在?Intel?汇编格式中,立即数的表示不用带任何前缀。例如: ATT?格式?pushl?$1? Intel?格式?push?1? ATT?和?Intel?格式中的源操作数和目标操作数的位置正好相反。在?Intel?汇编格式中,目标操作数在源操作数的左边;而在?ATT?汇编格式中,目标操作数在源操作数的右边。例如: ATT?格式?addl?$1,?%eax? Intel?格式?add?eax,?1? 在?ATT?汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀b、w、l分别表示操作数为字节(byte,8?比特)、字(word,16?比特)和长字(long,32比特);而在?Intel?汇编格式中,操作数的字长是用?byte?ptr?和?word?ptr?等前缀来表示的。例如: ATT?格式? movb?val,?%al? Intel?格式?mov?al,?byte?ptr?val? 在?ATT?汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上*作为前缀,而在?Intel?格式中则不需要。? 远程转移指令和远程子调用指令的操作码,在?ATT?汇编格式中为?ljump?和?lcall,而在?Intel?汇编格式中则为?jmp?far?和?call?far,即: ATT?格式?ljump?$section,?$offset?????lcall?$section,?$offset? Intel?格式?jmp?far?section:offset?????call?far?section:offset? 与之

文档评论(0)

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

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档