Linux 0.11使用的汇编

来源:互联网 发布:淘宝号等级怎么看 编辑:程序博客网 时间:2024/05/19 13:07
  1. 介绍:
    在Linux 01x系统中使用了两种汇编器(Assembler)。一种是能产生16位代码的as86汇编器,使用配套的ld86链接器;另一种是GNU的汇编器gas(as),使用GNU ld链接器俩链接产生的目标文件。
    as86和ld86尽管可以为80386处理器编制32位代码,但是Linux系统仅用来创建16位的启动引导扇区程序boot/bootsect.s和实模式下初始设置程序boot/setup.s的二进制代码。
    内核中其余所有汇编语言程序(包括C语言产生的汇编程序)均使用gas来编译,并与C语言程序编译产生的模块链接。
    在编译C语言程序时,GNU gcc编译器会首先输出一个作为中间结果的as汇编语言文件,然后gcc会调用as汇编器把这个临时汇编语言编译成目标文件。即实际上as汇编器最初是专门用于汇编gcc产生的中间汇编语言程序的,而非作为一个独立的汇编器使用。因此,as汇编器也支持很多C语言特性,这包括字符、数字和常数表示方法以及表达式形式等方面。

  2. as86汇编语法:
    汇编的命令行基本格式是:
    as [选项] -o objfile srcfile
    其中选项用来控制编译过程中以产生指定格式和设置的目标文件。输入的汇编语言程序srcfile是一个文本文件。该文件内退必须是由换行字符结尾的一系列文本行组成。
    汇编编译产生的目标文件objfile通常起码包含三个段或区(section),即正文段(.text)、数据段(.data)和未初始化数据段(.bss)。正文段(或称代码段)是一个已经初始化过的段,通常其中包含程序的执行代码和只读数据。数据段也是一个已初始化过的段,其中包含有可读/写的数据。而未初始化数据段是一个未初始化的段。通常汇编器产生的输出目标文件不会为该段保留空间,但在目标文件的链接成执行程序被加载时操作系统会把该段的内容全部初始化为0。在编译过程中,汇编语言程序中会产生代码或数据的语句,都会在这三个中的一个段中生成代码或数据。编译产生的字节会从‘.text’段开始存放。我们可以通过使用段控制伪操作符来更改写入的段。

  3. as汇编语法:
    as汇编器具有对汇编语言程序内置的简单预处理功能。该预处理功能会调整并删除多余的空格字符和制表符;删除所有注释语句并且使用单个空格或一些换行符替换它们;把字符常数转换成对应的数值。但是该预处理功能不会对宏定义进行处理,也没有处理包含文件的功能。如果需要这方面的功能,那么可以让汇编语言程序使用大写的后缀‘.S’让as使用gcc的CPP预处理功能。
    由于as汇编语言程序除了使用C语言注释语句(即‘/’和‘/’)以外,还使用‘#’作为当行注释开始字符,因此若在汇编之前不对程序执行预处理,那么程序中包含的所有以‘#’开始的指示符或命令均会被当做注释部分。
    as汇编器输出产生的目标文件中至少具有3个区,分别称为正文(text)、数据(data)和bss区,每个区都可能是空的。如果没有使用汇编命令把输出放置在‘.text’或‘.data’区中,这些区会仍然存在,但内容是空的。在一个目标文件中,其text区从地址0开始,随后是data区,再后面是bss区。
    当一个区被重定位(as输出的目标文件,其长度和字节次序是固定的,为其分配运行时刻的地址的操作称为重定位)时,为了让链接器ld直到哪些数据会发生变化以及如何修改这些数据,as汇编器也会往目标文件中写入所需要的重定位信息。为了执行重定位操作,在每次设计目标文件中的一个地址时,ld必须知道:
    ①目标文件中对一个地址的引用是从什么地方算起的
    ②该引用的字节长度是多少
    ③该地址引用的是哪个区?(地址)-(区的开始地址)的值等于多少
    ④对地址的引用与程序计数器PC(Program-Counter)相关吗
    实际上,as使用的所有地址都可表示为:(区) + (区中偏移)

原创粉丝点击