; haribote-ipl
; TAB=4
ORG 0x7c00
JMP entry
DB 0x90
DB "HARIBOTE" ; 启动区的名称 可以使任意字符
DW 512 ; 设置每个扇区的大小
DB 1 ; 簇的大小 也就是OS 每次对磁盘读写的 最小单元
DW 1 ; FAT的 起始位置 第一个扇区 0 盘 0 道 1 扇区
;BIOS 读取该扇区的内容 并将其放置在0x7C00位置
DB 2 ; FAT的个数
DW 224 ; 根目录的大小 一般设置为224
DW 2880 ; 该磁盘的大小 为2880扇区 2*80*18
;两个磁头 每个磁头80个磁道 每个磁道 18个扇区
DB 0xf0 ; 磁盘的种类
DW 9 ; FAT的长度 必须为9个扇区
DW 18 ; 1个 磁道上 有多少个扇区 必须为18
DW 2 ; 磁头数 必须是2
DD 0 ; 不使用分区 必须是 0
DD 2880 ;重写 一次磁盘大小
DB 0,0,0x29 ; 固定写法
DD 0xffffffff ; 卷标号
DB "HARIBOTEOS " ; 磁盘名称
DB "FAT12 " ; 磁盘格式名称
RESB 18 ; 空出 18个 字节
; 程序主体
entry:
MOV AX,0 ; 初始化寄存器
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
; 启动区 装载下一个块的内容
MOV AX,0x0820
MOV ES,AX
MOV CH,0 ; 柱面0
MOV DH,0 ; 磁头0
MOV CL,2 ; 扇区2
MOV AH,0x02 ; AH=0x02 : 读盘 BIOS 的 0x13中断
MOV AL,1 ; 读取 一个扇区
MOV BX,0
MOV DL,0x00 ; A驱动器
INT 0x13 ; 调用磁盘的BIOS
JC error ;如果调用BIOS 出现错误 则CF为1 有错误 错误码写入AH内
; 一些处理函数
fin:
HLT ; 让CPU停止 等待指令
JMP fin ; 无限循环
error:
MOV SI,msg
putloop:
MOV AL,[SI] ;间接寻址
ADD SI,1 ; SI 偏移到 下个地址
CMP AL,0 ;因为 [SI]的结束 是0
JE fin
MOV AH,0x0e ; 显示一个文字
MOV BX,15 ; 指定字符颜色
INT 0x10 ; 调用显卡的BIOS
JMP putloop ;循环
msg:
DB 0x0a, 0x0a ; 输出两个换行
DB "load error"
DB 0x0a ; 换行
DB 0
RESB 0x7dfe-$ ; 填写0x00 直到7dfe
DB 0x55, 0xaa ;启动区 最后两个字节 必须是这种格式0x55AA
ES 寄存器的内容为 0x0820 BX = 0
所以 这个扇区会被装载到 ES*16+BX 即 0x8200
所以 0x8200-0x83ff 都是这个扇区的内容