linux 汇编语言开发指南

linux 汇编语言开发指南

ID:33509613

大小:196.26 KB

页数:9页

时间:2019-02-26

linux  汇编语言开发指南_第1页
linux  汇编语言开发指南_第2页
linux  汇编语言开发指南_第3页
linux  汇编语言开发指南_第4页
linux  汇编语言开发指南_第5页
资源描述:

《linux 汇编语言开发指南》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Linux汇编语言开发指南级别:初级肖文鹏(xiaowp@263.net),北京理工大学计算机系硕士研究生2003年7月03日汇编语言的优点是速度快,可以直接对硬件进行操作,这对诸如图形处理等关键应用是非常重要的。Linux是一个用C语言开发的操作系统,这使得很多程序员开始忘记在Linux中还可以直接使用汇编这一底层语言来优化程序的性能。本文为那些在Linux平台上编写汇编代码的程序员提供指南,介绍Linux汇编语言的语法格式和开发工具,并辅以具体的例子讲述如何开发实用的Linux汇编程序。一、简介作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重

2、要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。就拿Linux内核来讲,虽然绝大部分代码是用C语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在Linux的启动部分。由于这部分代码与硬件的关系非常密切,即使是C语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。大多数情况下Linux程序员不需要使用汇编语言,因为即便是硬件驱动这样的底层程序在Linux操作系统中也可以用完全用C语言来实现,再加上GCC这一优秀的编译器目前已经能够对最终生成的代码进行很好的优化,的确有足够的理由让我们可以暂时将汇编语言抛在

3、一边了。但实现情况是Linux程序员有时还是需要使用汇编,或者不得不使用汇编,理由很简单:精简、高效和libc无关性。假设要移植Linux到某一特定的嵌入式硬件环境下,首先必然面临如何减少系统大小、提高执行效率等问题,此时或许只有汇编语言能帮上忙了。汇编语言直接同计算机的底层软件甚至硬件进行交互,它具有如下一些优点:•能够直接访问与硬件相关的存储器或I/O端口;•能够不受编译器的限制,对生成的二进制代码进行完全的控制;•能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁;•能够根据特定的应用对代码做最佳的优化,提高运行速度;•能够最大

4、限度地发挥硬件的功能。同时还应该认识到,汇编语言是一种层次非常低的语言,它仅仅高于直接手工编写二进制的机器指令码,因此不可避免地存在一些缺点:•编写的代码非常难懂,不好维护;•很容易产生bug,难于调试;•只能针对特定的体系结构和处理器进行优化;•开发效率很低,时间长且单调。Linux下用汇编语言编写的代码具有两种不同的形式。第一种是完全的汇编代码,指的是整个程序全部用汇编语言编写。尽管是完全的汇编代码,Linux平台下的汇编工具也吸收了C语言的长处,使得程序员可以使用#include、#ifdef等预处理指令,并能够通过宏定义来简化代码。第二种是内嵌的汇编代

5、码,指的是可以嵌入到C语言程序中的汇编代码片段。虽然ANSI的C语言标准中没有关于内嵌汇编代码的相应规定,但各种实际使用的C编译器都做了这方面的扩充,这其中当然就包括Linux平台下的GCC。二、Linux汇编语法格式绝大多数Linux程序员以前只接触过DOS/Windows下的汇编语言,这些汇编代码都是Intel风格的。但在Unix和Linux系统中,更多采用的还是AT&T格式,两者在语法格式上有着很大的不同:1.在AT&T汇编格式中,寄存器名要加上'%'作为前缀;而在Intel汇编格式中,寄存器名不需要加前缀。例如:AT&T格式Intel格式pushl%e

6、axpusheax2.在AT&T汇编格式中,用'$'前缀表示一个立即操作数;而在Intel汇编格式中,立即数的表示不用带任何前缀。例如:AT&T格式Intel格式pushl$1push13.AT&T和Intel格式中的源操作数和目标操作数的位置正好相反。在Intel汇编格式中,目标操作数在源操作数的左边;而在AT&T汇编格式中,目标操作数在源操作数的右边。例如:AT&T格式Intel格式addl$1,%eaxaddeax,14.在AT&T汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀'b'、'w'、'l'分别表示操作数为字节(byte,8比特)、字(

7、word,16比特)和长字(long,32比特);而在Intel汇编格式中,操作数的字长是用"byteptr"和"wordptr"等前缀来表示的。例如:AT&T格式Intel格式movbval,%almoval,byteptrval5.在AT&T汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上'*'作为前缀,而在Intel格式中则不需要。远程转移指令和远程子调用指令的操作码,在AT&T汇编格式中为"ljump"和"lcall",而在Intel汇编格式中则为"jmpfar"和"callfar",即:AT&T格式Intel格式ljump$sec

8、tion,$offsetjmpfars

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。