转载自:http://www.fanis.cn/post/16
本节从计算机结构讲到汇编程序编写的最小化启动程序加载器IPL(Initial Program Loader),汇编编译器使用NASM,虚拟机使用QEMU,每个章节都有对应的代码段,是编写操作系统非常实用的一本教材。
这里制作软盘的代码含义如表中所示:
偏移
字节
内容/含义
(参考)值
0
3
跳转到软盘指令开始处的跳转指令
jmp l_start(l_start为软盘内第一条指令处的标号)
3
8
第一个扇区的名字
"xnlosipl"
11
2
软盘每个扇区的大小(字节为单位)
必须为512
13
1
每簇的扇区数
必须为1
14
2
保留扇区数/FAT的起始位置/Boot记录占用扇区
一般为1
16
1
FAT的个数
必须为2
17
2
根目录文件数的最大值
一般为224
19
2
扇区总数
(必须为)2880
21
1
介质描述符
必须为0xf0
22
2
每FAT扇区数
必须为9
24
2
每磁道扇区数
必须为18
26
2
磁头数
必须为2
28
4
隐藏/不使用的扇区数
必须为0
32
4
如果偏移19处值为0,由这个值表示总扇区数
2880
36
1
中断13h的驱动器号
固定为0
37
1
未使用
固定为0
38
1
扩展引导标记
固定为0x29
39
4
卷列序号
0xffffffff
43
11
软盘名称
"xnlhello-os"
54
8
软盘格式名称
"FAT12 "(8字节,空格填充)
62
448
(引导)代码、数据及其它填充字符
……
510
2
标明软盘有无所需的启动代码(在第一个扇区内)
0x55aa(为0x55aa表明有)
下面直接上本章代码:
; hello-os; TAB=4 ;以下的记述用于标准FAT12格式的软盘 DB 0xeb,0x4e,0x90 DB "HELLOIPL";启动区的名称可以是任意的字符(8字符) DW 512;每个扇区的大小 DB 1;簇的大小(必须为1个扇区) DW 1; FAT的起始位置(一般从第一扇区开始) DB 2; FAT的个数(必须为2) DW 224;根目录的大小(一般设为224) DW 2880;该磁盘的大小(必须为2880扇区) DB 0xf0;磁盘的种类(必须是0xf0) DW 9; FAT的长度,必须是9扇区 DW 18;1个磁道有几个扇区,必须是18 DW 2;磁头数,必须是2 DD 0;不使用分区,必须是0 DD 2880;重写一次磁盘大小 DB 0,0,0x29;意义不明,固定 DD 0xffffffff;卷标号码 DB "HELLO-OS ";磁盘名称 DB "FAT12 ";磁盘格式 RESB 18;空出 ;程序主体 DB 0xb8,0x00,0x00,0x8e,0xd0,0xbc,0x00,0x7c DB 0x8e,0xd8,0x8e,0xc0,0xbe,0x74,0x7c,0x8a DB 0x04,0x83,0xc6,0x01,0x3c,0x00,0x74,0x09 DB 0xb4,0x0e,0xbb,0x0f,0x00,0xcd,0x10,0xeb DB 0xee,0xf4,0xeb,0xfd;信息显示 DB 0x0a,0x0a;2个换行 DB "hello,world" DB 0x0a;换行 DB 0 RESB 0x1fe-$ ;填入0x00,直到510字节 DB 0x55,0xaa;启动区以外部分的输出 DB 0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00 RESB 4600 DB 0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00 RESB 1469432