1、读盘
昨天写的IPL并没有装载程序,今天我们来写一个可以真正装载程序的IPL。
我们先来看软盘结构。
如图所示。一张软件有正反两面,对应读取用的磁头(0,1),而从外到内又分为80个环(0~79),称为柱面。每个柱面又分为18个扇区(1~18)。因为软盘的第一个扇区(正面的第0个柱面的第1个扇区)为启动区,所以我们读软盘的时候应该从第2个扇区开始读。
org 0x7c00
jmp init
DB 0x90
DB "HARIBOTE"
DW 512
DB 1
DW 1
DB 2
DW 224
DW 2880
DB 0xf0
DW 9
DW 18
DW 2
DD 0
DD 2880
DB 0,0,0x29
DD 0xffffffff
DB "HARIBOTEOS "
DB "FAT12 "
RESB 18
init:
mov bx,0
mov ax,0x0820
mov es,ax ;es:bx为缓冲地址,即读取的数据将存取在这里
mov dl,0 ;驱动器号0(即光驱号,现在一般只有一个光驱)
mov dh,0 ;磁头号0~1
mov ch,0 ;柱面号0~79
mov cl,2 ;扇区号1~18
mov al,1 ;要读的扇区数
mov si,0 ;读盘错误次数
read:
mov ah,0x02 ;读盘
int 0x13 ;中断,BIOS的0x13号函数
jnc finish ;jnc指令(jump if not carry),如果上一步没错误