在Linux0.1x系统中使用了两种汇编器。一种是as86汇编器及配套的ld86链接器;另一种是GNU的汇编器gas(as),使用GNU ld链接器来链接产生目标文件。as86和ld86是由MINIX-386的主要开发者之一Bruce Evans编写的 Intel 8086、80386汇编编译程序和链接程序。Linus当时使用两种汇编编译器的主要原因在于对于Intel x86处理器系列来讲,Linus那时的GNU汇编编译器仅能支持i386及以后出的CPU代码指令,若不采用特殊方法就不能支持生成运行在实模式下的16位代码程序。直到1994年以后发布的GNU as汇编器才开始支持编译16位代码的 .code16 伪指令。但直到内核版本2.4.x起,bootsect.s和setup.s程序才完全使用统一的GNU as来编写。
下面用GNU as改写下赵炯博士编著的基于linux0.11内核的《Linux 内核完全剖析》[机械工业出版社2006.8]一书中第三章的一个引导扇区例子。
实验环境:Linux Deepin20,bochs2.6.9,GNU as 版本号为2.31.1
实验程序目录下的文件有:
源程序内容为:
/* boot.s --bootsect.s的框架程序。用代码0x07替换串msg1中1字符,然后在屏幕第19行第1列显示 */
BOOTSEG = 0x07c0 /* BIOS加载boot代码的原始段地址 */
.code16 /* */
.section .text