Linux0.11与GAS汇编器深度解析

linux0.11 gas

时间:2024-11-30 20:40


Linux 0.11内核中的GAS汇编器:技术深度解析 在深入探讨Linux 0.11内核中的GAS(GNU Assembler)汇编器之前,我们需要对Linux 0.11内核及其汇编环境有一个大致的了解

    Linux 0.11是Linux操作系统的早期版本,它集成了两种不同的汇编器:as86和GAS(GNU Assembler)

    在Linux 0.11内核源码中,bootsect.s和setup.s是实模式下运行的16位代码程序,采用近似Intel的汇编语言语法,需要使用Intel8086汇编编译器和连接器as86和ld86;而head.s则使用GNU的汇编程序格式,运行在保护模式下,需要GNU的as(GAS)进行编译,使用的是AT&T语法

     为什么选择GAS? 在Linux 0.11时代,汇编编译器面临着对16位实模式代码程序支持不足的挑战

    因此,Linus选择了as86和GAS这两种编译器来满足不同的需求

    as86和ld86主要用于编制32位代码,但在Linux下,它们更多地被用于创建16位的启动引导扇区程序boot/bootsect.S和实模式下初始设置程序boot/setup.s的二进制执行代码

    而GAS则用于编译内核中除boot/bootsec.s引导扇区程序和实模式下的设置程序boot/setup.s外的所有汇编程序

     随着技术的发展,从Linux内核2.4.x版本开始,bootsect.s和head.s程序完全使用统一的as(即GAS)来编写,这反映了GAS汇编器在功能和兼容性上的不断提升

     GAS汇编器的工作原理 GAS汇编器的工作流程大致可以分为四个阶段:预处理、编译、汇编和链接

    在预处理阶段,GAS会对汇编语言程序进行简单的预处理,如调整并删除多余的空格字符和制表符

    然而,这种预处理功能并不处理宏定义或包含文件

     编译阶段是将汇编语言转换为机器语言的过程

    在这一阶段,GAS会根据汇编语言的指令生成相应的二进制代码

    汇编阶段则是将编译生成的二进制代码与其他必要的信息(如符号表、重定位信息等)一起打包成目标文件(.o文件)

     链接阶段是将多个目标文件以及必要的库文件链接成一个可执行程序的过程

    链接器ld会根据目标文件中的信息,将各个部分的代码和数据分配到最终的可执行程序中的不同地址位置

    当涉及到一个区被重定位时,链接器需要知道目标文件中对一个地址的引用从什么地方开始计算、引用的字节长度是多少、该地址是作用于哪个区以及对地址的引用于指令计数器PC是否相关等信息

     GAS汇编器的语法与特点 GAS使用的是AT&T语法,这与Intel语法存在显著的差异

    在AT&T语法中,寄存器名称前需要加上%符号,立即数前需要加上$符号

    此外,AT&T语法中操作数的方向也与Intel语法相反,即第一个操作数是源,第二个操作数是目标

    这种差异对于初学者来说可能会造成一定的困扰,但一旦熟悉后,就会发现AT&T语法在从左到右读写时更为自然

     在编写汇编语言程序时,我们需要关注指令、操作数和地址等基本概念

    指令是CPU执行的操作,通常也叫操作码;操作数是指令操作的对象;而地址则是指定数据在内存中的位置

    此外,汇编语言程序还包含标号、注释等元素,这些元素对于程序的阅读和维护都非常重要

     Linux 0.11内核中的GAS汇编实践 在编译Linux 0.11内核时,我们可能会遇到一些与GAS汇