1.制作真正的ipl(Initial Program Loader启动程序装载器)
从上一篇文中,讲述了电脑开机的过程,当BIOS执行了一些硬件检测工作后,最后一步将启动区内容加载到内存 0x7c00,并跳转到这里,启动区的内容就是ipl,大小为512字节,启动区代码主要是加载操作系统内核,也就是用来加载真正的操作系统。
这段ipl是为了从磁盘(软盘)读取0号柱面(磁道)、0号磁头(一个磁道的正反两面)、2号扇区(软盘一个磁道有18个扇区)
软盘的存储量为80(磁道)x2(正反两面)x18(扇区)x512(扇区大小)=1474560个字节=1440k
2.试错
为了防止读取软盘出现错误,加入错误检验代码
MOV AX,0x0820
MOV ES,AX
MOV CH,0 ; 0号柱面
MOV DH,0 ; 0号磁头(正面)
MOV CL,2 ; 2号扇区
MOV SI,0 ; 记录失败次数的寄存器
retry:
MOV AH,0x02 ; AH=0x02 : 读磁盘
MOV AL,1 ; 读一个扇区(512字节)
MOV BX,0 ;加载的偏移地址为0
MOV DL,0x00 ; 0号驱动器(A号软盘)
INT 0x13 ; 调用BIOS中断
JNC fin ; 没错跳转到fin
ADD SI,1 ; SI加一
CMP SI,5 ; SI与5比较
JAE error ; SI >= 5跳到error
MOV AH,0x00
MOV DL,0x00 ; A驱动器
INT 0x13 ; 重置驱动器
JMP retry
3.4.读到18扇区+读到10柱面
entry:
MOV AX,0 ; 寄存器初始化
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
; 加载磁盘程序
MOV AX,0x0820
MOV ES