一、制作真正地IPL(IPL, initial program loader,启动程序装载器)
(PS:这部分其实就是就是实现了一个用途,即将扇区中的内容读取到内存中)
(一)储备知识
1.软盘结构及读写
a.磁头(head)。读取软盘数据,有正面反面个一个,分别编号为0和1,所以软盘的正反两面都可以存储数据。
b.柱面(cylinder)。就是软盘上的一圈圈同心圆(上图中所示的磁道),一张软盘有80个柱面。
c.扇区(sector)。将每一个柱面分为若干个区域以提高读写效率,这样的区域就是扇区,每个柱面有18个扇区,每个扇区能够存储512个字节的数据。
所以一张磁盘可以存储的总数据=每个扇区可存储的字节数*每个柱面的扇区数*柱面数*磁头数=512*18*80*2=1474560B=1440KB
2.BIOS调用
INT 0x13(从软盘读取数据并写入到磁盘中)
所需参数:
AH用于表示操作类别,AH=0x02表示读数据,AH=0x03表示写数据,AH=0x04表示校验,AH=0x0c表示寻道
AL存储处理对象的扇区数(只能同时处理连续的扇区)
CH=柱面号
CL=扇区号(原书中CL=扇区号(0-5位,因为总共只有18个扇区变化)|(柱面号&0x300)>>2)
DH=磁头号
DL=驱动器号
ES:BX=缓冲地址(校验及寻道时不使用)
返回值:
FLACS.CF==0:没有错误,AH==0
FLACS.CF==1:有错误,错误号码存入AH内
2.软盘存储方式
a.文件名会写在0x002600以后的地方
b.文件的内容会写在0x004200以后的地方
二、代码解读
(一)连续读取多个扇区(以18个扇区为例,同时读每个扇区时的试错次数为5次)
(ps:因为一个柱面有18个扇区,所以此程序也可以用来读取一个完整的柱面)
初始化
MOV AX,0X0820 mov es,ax 设置缓冲区段地址
mov ch,0 mov dh,0 mov cl,2 设置INT 0x13所需参数 柱面号=0,磁头号=0,扇区号=2
|
|————————— | —————————————————————————————— SI=SI+1
| | 读取扇区失败,重试 AH=0x00,dl=0x00
| 读扇区 |
| mov ah,0x02 mov al=1 设置INT 0X13所需参数,表示读扇区,1次操作1个扇区----------|
| mov bx,0 mov dl,0x00 设置内存地址和驱动器号
| |
|否 |读取成功
| |
| 设置参数
| mov ax,es add ax,0x0020 mov es,ax 将内存地址后移0x200,因为一个扇区512字节
| add cl,1 扇区号加1
| cmp cl,18 判断是否已经读取了18个扇区
| |
------------------------ |是
|
结束
(二)读取多个柱面(在(一)的基础上读取10个柱面)
原理与编程思想与上述流程相同,但需要注意以下几点:
1.磁盘的读写顺序为扇区-->磁头-->柱面。及在读写是先读取扇区信息,若读完了18个扇区(代码柱面的一边已经读完,则调整磁头号,读写扇区反面的扇区数据,当另一名也读完之后,则调整柱面号,读取下一个柱面)