设为首页 加入收藏

TOP

3.2.1 编译as汇编语言程序
2013-10-12 06:49:22 来源: 作者: 【 】 浏览:80
Tags:3.2.1 编译 汇编 语言程序

3.2  GNU as汇编

上节介绍的as86汇编器仅用于编译内核中的boot/bootsect.S引导扇区程序和实模式下的设置程序boot/setup.s。内核中其余所有汇编语言程序(包括C语言产生的汇编程序)均使用gas来编译,并与C语言程序编译产生的模块链接。本节以80x86 CPU硬件平台为基础介绍Linux内核中使用汇编程序语法和GNU as汇编器(简称as汇编器)的使用方法。我们首先介绍as汇编语言程序的语法,然后给出常用汇编伪指令(指示符)的含义和使用方法。带有详细说明信息的as汇编语言程序实例将在下一章最后给出。

由于操作系统许多关键代码要求有很高的执行速度和效率,因此在一个操作系统源代码中通常就会包含大约10%的起关键作用的汇编语言代码。Linux操作系统也不例外,它的32位初始化代码、所有中断和异常处理过程接口程序以及很多宏定义都使用了as汇编语言程序或扩展的嵌入汇编语句。是否能够理解这些汇编语言程序的功能也就无疑成为理解一个操作系统具体实现的关键之一。

在编译C语言程序时,GNU gcc编译器会首先输出一个作为中间结果的as汇编语言文件,然后gcc会调用as汇编器把这个临时汇编语言程序编译成目标文件。即实际上as汇编器最初是专门用于汇编gcc产生的中间汇编语言程序的,并非作为一个独立的汇编器使用。因此,as汇编器也支持很多C语言特性,这包括字符、数字和常数表示方法以及表达式形式等方面。

GNU as汇编器最初是仿照BSD 4.2的汇编器进行开发的。现在的as汇编器能够配置成产生很多不同格式的目标文件。虽然编制的as汇编语言程序与具体采用或生成什么格式的目标文件关系不大,但是在下面介绍中若涉及目标文件格式时,我们将围绕Linux 0.12系统采用的a.out目标文件格式进行说明。

3.2.1  编译as汇编语言程序

使用as汇编器编译一个as汇编语言程序的基本命令行格式如下:

as [ 选项 ] [ -o objfile ] [ srcfile.s ...]

其中,objfile是as编译输出的目标文件名;srcfile.s是as的输入汇编语言程序名。

如果没有使用输出文件名,那么as会编译输出名称为a.out的默认目标文件。在as程序名之后,命令行上可包含编译选项和文件名。所有选项可随意放置,但是文件名的放置次序同编译结果密切相关。

一个程序的源程序可以放置在一个或多个文件中,程序的源代码无论怎样分割或放置在几个文件中都不会改变程序的语义。程序的源代码是所有这些文件按次序的组合结果。每次运行as编译器,它只编译一个源程序。但一个源程序可由多个文本文件组成(终端的标准输入也是一个文件)。

我们可以在as命令行上给出零个或多个输入文件名。as将会按从左到右的顺序读取这些输入文件的内容。在命令行上任何位置处的参数若没有特定含义的话,将会被作为一个输入文件名看待。如果在命令行上没有给出任何文件名,那么as将试图从终端或控制台标准输入中读取输入文件内容。在这种情况下,若已没有内容要输入时就需要手工键入Ctrl-D组合键来告知as汇编器。若想在命令行上明确指出把标准输入作为输入文件,那么就需要使用参数"  "。

as的输出文件是输入的汇编语言程序编译生成的二进制数据文件,即目标文件。除非我们使用选项"-o"指定输出文件的名称,否则as将产生名为a.out的输出文件。目标文件主要用于作为链接器ld的输入文件。目标文件中包含已汇编过的程序代码、协助ld产生可执行程序的信息,可能还包含调试符号信息。Linux 0.12系统中使用的a.out目标文件格式将在本章后面进行说明。

假如要单独编译boot/head.s汇编程序,那么可以在命令行上键入如下形式的命令:

[/usr/src/linux/boot]# as  -o head.o head.s
[/usr/src/linux/boot]# ls -l head*
-rw-rwxr-x1 root  root  26449 May 19 22:04 head.o
-rw-rwxr-x1 root  root5938 Nov 18  1991 head.s
[/usr/src/linux/boot]#

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇3.1.1 as86汇编语言语法 下一篇3.1 as86汇编器

评论

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