3.1.3 as86汇编语言程序的编译和链接
现在我们说明如何编译链接示例程序boot.s来生成我们需要的引导扇区程序boot。编译和链接上面示例程序需要执行以下前两条命令:
[/root]# as86 -0 -a -o boot.o boot.s // 编译。生成与as部分兼容的目标文件。 [/root]# ld86 -0 -s -o boot boot.o // 链接。去掉符号信息。 [/root]# ls -l boot* -rwx--x--x1 root root 544 May 17 00:44 boot -rw-------1 root root 249 May 17 00:43 boot.o -rw-------1 root root 767 May 16 23:27 boot.s [/root]# dd bs=32 if=boot of=/dev/fd0 skip=1 // 写入软盘或Image盘文件中。 16+0 records in 16+0 records out [/root]# |
其中第1条命令利用as86汇编器对boot.s程序进行编译,生成boot.o目标文件。第2条命令使用链接器ld86对目标文件执行链接操作,最后生成MINIX结构的可执行文件boot。其中选项-0用于生成8086的16位目标程序;-a用于指定生成与GNU as和ld部分兼容的代码。-s选项用于告诉链接器要去除最后生成的可执行文件中的符号信息。-o指定生成的可执行文件名称。
从上面ls命令列出的文件名中可以看出,最后生成的boot程序并不是前面所说的正好512B,而是长了32B。这32B就是MINIX可执行文件的头结构(其详细结构说明请参见第16章)。为了能使用这个程序引导启动机器,需要人工去掉这32B。去掉该头结构的方法有以下几种:
使用二进制编辑程序删除boot程序前32B,并存盘。
使用较新的Linux系统(如Fedora 9)上的as86编译链接程序,它们具有可生成不带MINIX头结构的纯二进制执行文件的选项,请参考相关系统的在线手册页(man as)。
利用Linux系统的dd命令。
上面列出的第3条命令就是利用dd命令来去除boot中的前32B,并把输出结果直接写到软盘或Bochs模拟系统的软盘映像文件中(有关Bochs PC模拟系统的使用方法请参考第17章)。若在Bochs模拟系统中运行该程序,可得到如图3-1所示的画面。
|
| (点击查看大图)图3-1 在Bochs模拟系统中运行boot引导程序的显示结果 |