收藏 分享(赏)

Linux下的汇编程序设计.doc

上传人:fmgc7290 文档编号:7110437 上传时间:2019-05-06 格式:DOC 页数:8 大小:37KB
下载 相关 举报
Linux下的汇编程序设计.doc_第1页
第1页 / 共8页
Linux下的汇编程序设计.doc_第2页
第2页 / 共8页
Linux下的汇编程序设计.doc_第3页
第3页 / 共8页
Linux下的汇编程序设计.doc_第4页
第4页 / 共8页
Linux下的汇编程序设计.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、Linux 下的汇编程序设计周天阳 199912关键字: 汇编 Linux Nasm Gas摘要:本文主要讲述了 Linux 下使用汇编的利弊,以及常用汇编工具的使用和语法特点。重点讲述了 NASM。引言:汇编语言是低级语言,与硬件和操作系统紧密联系。个人电脑以前都是用DOS,现在发展成了 WINDOWS 98,而另一个操作系统 Linux 也正在崛起。下面比较一下这三个操作系统:操 作 系 统优 点缺 点价 格DOS较稳定,速度快无法充分发挥计算机性能,没有图形界面较低WINDOWS 98操作简便,应用软件多,硬件兼容性好不稳定,经常死机,速度慢高Linux性能优秀,非常稳定,界面美观,操作

2、简便缺乏软件厂商支持,应用软件少免费表 一 操作系统比较由以上的比较可知,Linux 操作系统本身具有较大优势,它的普及应该只是时间问题,所以如何在 Linux 下开发软件是我们计算机系学生必须学习与研究的一个课题。Linux 下的主要编程语言是 C,同时 Linux 还支持其他许多编程语言,汇编语言作为最重要的编程语言之一,当然也包括在内。它能够完成许多其他语言所不能完成的功能。要学习 Linux 编程,就必须要学习 Linux 下的汇编程序设计。下面我就来介绍一下 Linux 下的汇编程序设计。Linux 汇编简介:一、汇编语言的优缺点:由于 Linux 是用 C 写的,所以 C 自然而然

3、的就成为了 Linux 的标准编程语言。大部分人都把汇编给忽略了,甚至在因特网上找资料都是非常的困难,很多问题都需要靠自己来尝试。我认为这样对待汇编语言是不公平的,不能只看到它的缺点,当然也不能只看到它的优点,下面把它的优缺点作一个比较:优点:汇编语言可以表达非常底层的东西l 可以直接存取寄存器和 I/Ol 编写的代码可以非常精确的被执行l 可以编写出比一般编译系统高效的代码l 可以作为不同语言或不同标准的接口缺点:汇编语言是一个非常低级的语言l 非常冗长单调,在 DOS 下编程时就可以体会到l 易出 BUG,且调试困难l 代码不易维护l 兼容性不好,与硬件关系非常紧密总的来说,汇编语言要用在

4、必须的地方,尽量少用汇编编写大型程序,多采用inline 模式。二、汇编语言工具:DOS 下常用的工具 MASM 和 TASM 到 Linux 下就用不起来了,Linux 有自己的汇编工具,而且种类非常的多。其中 Gas 可以算是标准配置,每一种 Linux 中都包括有 Gas,但是 GAS 采用的不是我们通常在 DOS 下采用的汇编语法,它采用的是 ATT 的语法格式,与 intel 语法格式有很大的不同。如果要采用与 DOS 接近的语法格式,就必须用另一种汇编工具 NASM,NASM 基本与 MASM 相同,但也有不少地方有较大区别,特别涉及到操作系统原理时,与DOS 可以说是截然不同。L

5、inux 汇编程序设计:一、Hello,world!几乎所有的语言入门篇都是以“Hello,world!”为例,那么我也以Hello,world!为例开始。;-NASMs standalone Hello-World.asm for Linux -section .textextern putsglobal mainmain: push dword msg ;stash the location of msg on the stack.call puts ;call the puts routine (libc?) add esp, byte 4 ;clean the stack?ret ;e

6、xit.msg:db “Hello World!“,0 编译:nasm f elf hello.asmgcc o hello hello.o说明:这个程序实际上是调用了,Linux 系统的 puts 函数,原理与调用 DOS 下C 语言的函数相同,先用 Extern 声明 puts 是外部函数,再把参数(即 msg 的地址)压入堆栈,最后 Call 函数实现输出。我们再来看一个程序:section .textglobal mainmain: mov eax,4 ;4 号调用mov ebx,1 ;ebx 送 1 表示 stdoutmov ecx,msg ;字符串的首地址送入 ecxmov edx

7、,14 ;字符串的长度送入 edxint 80h ;输出字串mov eax,1 ;1 号调用int 80h ;结束msg:db “Hello World!“,0ah,0dh (编译同上一个程序)这个程序与 DOS 程序十分相似,它用的是 linux 中的 80h 中断,相当于 DOS 下的 21h 中断,只是因为 Linux 是 32 位操作系统,所以采用了 EAX、EBX 等寄存器。但是 Linux 作为一个多用户的操作系统与 DOS 又是有着非常大的区别的。要写出有特色的程序,不了解操作系统和硬件是不行的。下面我介绍一下Linux 操作系统。二、Linux 操作系统简介:操作系统实际是抽象

8、资源操作到具体硬件操作细节之间的接口。对 Linux 这样的多用户操作系统来说,它需要避免用户对硬件的直接访问,并防止用户之间的互相干扰。所以 Linux 接管了 BIOS 调用和端口输入输出,关于端口输入输出方面请参阅 Linux IO-Port-Programming HOWTO。而要通过 Linux 对硬件硬件进行访问就需要用到 System Call,实际上是许多 C 的函数,可以在汇编程序中调用,调用方法与 DOS 下的汇编完全相同,而且用 ASM 汇编时不用链接额外的库函数。Linux 与 DOS 的主要区别在于内存管理、进程(DOS 下无进程概念)、文件系统,其中内存管理和进程与

9、汇编编程的关系比较密切:1、内存管理:对任一台计算机而言,其内存以及其他资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux 采用了称为“虚拟内存”的内存管理方式。Linux 将内存划分为容易处理的“内存页”,在系统运行过程中,应用程序对内存的需求大于物理内存时,Linux 可将暂时不用的内存页交换到硬盘上,这样,空闲的内存页可以满足应用程序的内存需求,而应用程序却不会注意到内存交换的发生。2、进程进程实际是某特定应用程序的一个运行实体。在 Linux 系统中,能够同时运行多个进程,Linux 通过在短的时间间隔内轮流运行这些进程而实现“多任务”。这一短的时间间隔称为“

10、时间片”,让进程轮流运行的方法称为“调度”,完成调度的程序称为调度程序。通过多任务机制,每个迸程可认为只有自己独占计算机,从而简化程序的编写,每个进程有自己单独的地址空间,并且只能由这一进程访问,这样,操作系统避免了进程之间的互相干扰以及“坏”程序对系统可能造成的危害。为了完成某特定任务,有时需要综合两个程序的功能,例如一个程序输出文本,而另一个程序对文本进行排序。为此,操作系统还提供进程间的通讯机制来帮助完成这样的任务。Linux 中常见的进程间通讯机制有信号、管道、共享内存、信号量和套接字等。三、Linux 下的汇编工具:Linux 下的汇编工具可谓百家争鸣,不像 DOS 下都要给 MAS

11、M 和 TASM 给控制了。但是 Linux 下每一种汇编工具都有很大的区别,要想全部掌握几乎是不可能的,下面我介绍几种常用的汇编工具,重点介绍 NASM 及其使用和语法。1、GCCGCC 其实是 GNU 的 C 语言产品,但它支持 Inline Assemble,在 GCC 中 inline assemble 使用就像宏一样,但它比宏能更清楚更准确的表达机器的工作状态。C 是汇编编程的一个高度概括,它可以减少许多汇编中的麻烦,特别是在 GCC这个 C 编译器中,assemble 似乎起不了多大的作用。2、GASGAS 是 Linux 各版本中基本的汇编工具,但它采用的是 AT&T 的语法标准

12、与Intel 的语法标准有很大的不同,对于 DOS 编程的我们来说,学习起来是非常困难的。当然如果要精通 Linux 下的汇编编程,学习 GAS 也是非常必要的,具体的语法标准可以参看 Using GNU Assembler。3、GASPGASP 是 GAS 的扩展,它增强了 GAS 对宏的支持。4、NASMNASM 是 linux 中语法与 DOS 最为相像的一种汇编工具。虽说如此,它与 MASM也是有着很大区别的。l NASM 的使用格式如下:Nasm f -o 例如:Nasm -f elf hello.asm将把 hello.asm 汇编成 ELF object 文件,而Nasm -f

13、bin hello.asm -o 会把 hello.asm 汇编成二进制可执行文件 Nasm h将会列出 NASM 命令行的完整说明。NASM 不会有任何输出,除非有错误发生。-f 在 Linux 下主要有 aout 和 ELF 两种,如果你不确定你的 Linux 系统应该用AOUT 还是 ELF,可以在 NASM 目录中输入 File nasm ,如果输出 nasm: ELF 32-bit LSB executable i386 (386 and up) Version 1 表示是 ELF,如果输出nasm: Linux/i386 demand-paged executable (QMAGI

14、C)表示是 aout。l NASM 与 MASM 的主要不同:首先与 linux 系统一样,nasm 是区分大小写的,Hello 与 hello 将是不同的标识符,如果要汇编到 DOS 或 OS/2,需要加入 UPPERCASE 参数。其次,nasm 中内存操作数都是以 表示。在 MASM 中foo equ 1 bar dw 2mov ax,foo mov ax,bar将被汇编成完全不同的指令,虽然它们在 MASM 中的表达方式完全一样。而NASM 完全避免了这种混乱,它使用的是这样的规则:所有对内存的操作都必须通过 来实现。例如上例中对 bar 的操作就要写成如下形式 mov ax,bar。

15、由此可见,nasm 中对 offset 的使用也是没有必要的(nasm 中无 offset)。Nasm 对 的使用与 masm 也有所不同,所有的表达式都必须写在 中,下面举两个例子来说明:Masm Nasm Mov ax,tablediMov ax,table+diMov ax,es:diMov ax,es:diMov ax,di+1Mov ax,di+1Nasm 中不存储变量类型,原因很简单 masm 中通过 寻址方式的变量也必须要指定类型。Nasm 中不支持 LODS, MOVS, STOS, SCAS, CMPS, INS, OUTS,只支持 lodsb、lodsw 等已经指定类型的操

16、作。Nasm 中不再有 assume 操作,段地址完全取决于存入段寄存器的值。关于 NASM 的使用方法及语法还可以参阅 NASM 使用手册。结论:我认为不论是在 Windows/DOS 下还是在 Linux 下完完全全用汇编编一个大型程序已经是不可能了,也不会有人愿意去这样做。在 windows 下我们可以用 VC,在 Linux/Xwindows 下我们可以用 C 甚至 C+ Builder,但是像 VC、C+ Builder 之类的工具尽量隐藏了底层的调用,同时也阻隔了成为高手的机会,因为编出来的程序无法了解它的执行过程也就使编程中最重要的“可预测”性变得很低。正因为如此汇编才有它存在的

17、必要性,同时还有一个更重要的原因,正如超级解霸的作者梁肇新所说:“编程序的重点不是“编”,而是调试程序,理论上的完美在实现的时候会遇到很多细节问题,这些问题必须调试才能解决。我的编程习惯是一天写五天调试,超级解霸是调试出来的,而不是写出来的。调试就涉及到汇编的问题,不进行汇编级的调试是不彻底的,也不能让人放心。参考资料:l Jans Assemble Homepage by Jan Wagemakers 8.1999l Linux Assemble HOWTO by Konstantin Boldyshev and Fran 鏾 is-Ren?Rideau 12.1999l Linux/i386 System CallsBy Konstantin Boldyshev 1999联系方法:这篇文章还可以在 http:/ 看到Email : Fidonet : 6:653/1003.12

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报