
1 ; hello-os
2 ; TAB=4
3
4 ORG 0x7c00 ; 指明程序的装载地址
5
6 ; 以下这段是标准FAT12格式软盘专用的代码
7
8 JMP entry
9 DB 0x90
10 DB "HELLOIPL" ; freeparam 启动区的名称可以是任意的字符串(8字节)
11 DW 512 ; 每个扇区(sector)的大小(必须为512字节)
12 DB 1 ; 簇(cluster)的大小(必须为1个扇区)
13 DW 1 ; FAT的起始位置(一般从第一个扇区开始)
14 DB 2 ; FAT的个数(必须为2)
15 DW 224 ; 根目录的大小(一般设成224项)
16 DW 2880 ; 该磁盘的大小(必须是2880扇区)
17 DB 0xf0 ; 磁盘的种类(必须是0xf0)
18 DW 9 ; FAT的长度(必须是9扇区)
19 DW 18 ; 1个磁道(track)有几个扇区(必须是18)
20 DW 2 ; 磁头数(必须是2)
21 DD 0 ; 不使用分区,必须是0
22 DD 2880 ; 重写一次磁盘大小
23 DB 0,0,0x29 ; 意义不明,固定
24 DD 0xffffffff ; (可能是)卷标号码
25 DB "HELLO-OS " ; freeparam 磁盘的名称(11字节)
26 DB "FAT12 " ; 磁盘格式名称(8字节)
27 RESB 18 ; 先空出18字节
28
29 ; 程序核心
30
31 entry:
32 MOV AX,0 ; 初始化寄存器
33 MOV SS,AX
34 MOV SP,0x7c00
35 MOV DS,AX
36 MOV ES,AX
37
38 MOV SI,msg
39 putloop:
40 MOV AL,[SI]
41 ADD SI,1 ; 给SI加1
42 CMP AL,0
43 JE fin
44 MOV AH,0x0e ; 显示一个文字
45 MOV BX,15 ; 指定字符颜色
46 INT 0x10 ; 调用显卡BIOS
47 JMP putloop
48 fin:
49 HLT ; 让CPU停止;等待指令
50 JMP fin ; 无限循环
51
52 msg: ; 信息显示部分
53 DB 0x0a, 0x0a ; 换行2次
54 DB "hello, bitzhuwei's OS!" ; freeparam
55 DB 0x0a ; 换行
56 DB 0
57
58 RESB 0x7dfe-$ ; 填写0x00,直到0x001fe
59
60 DB 0x55, 0xaa
61
62 ; 以下是启动区以外部分的输出
63
64 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
65 RESB 4600
66 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
67 RESB 1469432
