设为首页 加入收藏

TOP

3.1 as86汇编器
2013-10-12 06:49:20 来源: 作者: 【 】 浏览:91
Tags:3.1 as86 汇编

第3章  内核编程语言和环境

语言编译过程就是把人类能理解的高级语言转换成计算机硬件能理解和执行的二进制机器指令的过程。这种转换过程通常会产生一些效率不是很高的代码,所以对一些运行效率要求高或性能影响较大的部分代码通常就会直接使用汇编语言来编写,或者对高级语言编译产生的汇编程序再进行人工修改优化处理。本章主要描述Linux 0.12内核中使用的编程语言、目标文件格式和编译环境,主要目标是提供阅读Linux 0.12内核源代码所需要的汇编语言和GNU C语言扩展知识。首先比较详细地介绍了as86和GNU as汇编程序的语法和使用方法,然后对GNU C语言中的内联汇编、语句表达式、寄存器变量以及内联函数等内核源代码中常用的C语言扩展内容进行了介绍,同时详细描述了C和汇编函数之间的相互调用机制。因为理解目标文件格式是了解汇编器如何工作的重要前提之一,所以在介绍两种汇编语言时会首先简单介绍一下目标文件的基本格式,并在本章稍后部分再比较详细地给出Linux 0.12系统中使用的a.out目标文件格式。最后简单描述了Makefile文件的使用方法。

本章内容是阅读Linux内核源代码时的参考信息。因此可以先大致浏览一下本章内容,然后阅读随后章节,在遇到问题时再回过头来参考本章内容。

3.1  as86汇编器

在Linux 0.1x系统中使用了两种汇编器(Assembler)。一种是能产生16位代码的as86汇编器,使用配套的ld86链接器;另一种是GNU的汇编器gas(as),使用GNU ld链接器来链接产生的目标文件。这里我们首先说明as86汇编器的使用方法,as汇编器的使用方法放在下一节中进行说明。

as86和ld86是由MINIX-386的主要开发者之一Bruce Evans编写的Intel 8086、80386汇编编译程序和链接程序。在刚开始开发Linux内核时Linus就已经把它移植到了Linux系统上。它虽然可以为80386处理器编制32位代码,但是Linux系统仅用它来创建16位的启动引导扇区程序boot/bootsect.s和实模式下初始设置程序boot/setup.s的二进制执行代码。该编译器快速小巧,并具有一些GNU gas没有的特性,例如宏以及更多的错误检测手段。不过该编译器的语法与GNU as汇编编译器的语法不兼容,而更近似于微软的MASM、Borland公司的Turbo ASM和NASM等汇编器的语法。这些汇编器都使用了Intel的汇编语言语法(如操作数的次序与GNU as的相反等)。

as86的语法是基于MINIX系统的汇编语言语法,而MINIX系统的汇编语法则是基于PC/IX系统的汇编器语法。PC/IX是很早以前在Intel 8086 CPU上运行的一个类UNIX操作系统,Tanenbaum就是在PC/IX系统上进行MINIX系统开发工作的。

Bruce Evans是MINIX操作系统32位版本的主要修改编制者之一,他与Linux的创始人Linus Torvalds是好友。在Linux内核开发初期,Linus从Bruce Evans那里学到了不少有关类UNIX操作系统的知识。MINIX操作系统的不足之处也是两个好朋友探讨得出的结果。MINIX的这些缺点正是激发Linus在Intel 80386体系结构上开发一个全新概念操作系统的主要动力之一。Linus曾经说过:"Bruce是我的英雄",因此我们可以说Linux操作系统的诞生与Bruce Evans也有着密切的关系。

有关这个编译器和链接器的源代码可以从FTP服务器ftp.funet.fi上或从网站www.oldlinux. org下载。现代Linux系统上可以直接安装包含as86/ld86的RPM软件包,如dev86-0.16.3-8.i386. rpm。由于Linux系统仅使用as86和ld86编译和链接上面提到的两个16位汇编程序bootsect.S和setup.s,因此这里仅介绍这两个程序中用到的一些汇编程序语法和汇编命令(汇编指示符)的作用和用途。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇3.2.1 编译as汇编语言程序 下一篇3.2.2 as汇编语法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: