30天自制操作系统
进入32位模式并导入C语言
制作真正的IPL
该部分主要是对第二天结尾内容的深入。上一次简单介绍了如何制作启动区,但只是制作了一个空的框架,其中并未装载任何程序,在这一部分中,会给这个“空壳”真正装载进程序。因为最初的512字节是启动区,所以要从下一个512字节的内容开始装载程序。提供的harib00a中的文件打开,可以发现添加的内容仅有如下一段代码:
1、指令与标志:
JC:跳转指令的一种,“jump if carry”,即如果进位标志(carry flag)为1,就跳转。
“INT 0x13”:调用BIOS的0x13号函数,经过查找可得到如下内容:
磁盘读、写,扇区校验,以及寻道
AH=0x02;(读盘)
AH=0x03;(写盘)
AH=0x04;(校验)
AH=0x0c;(寻道)
AL=处理对象的扇区数;(只能同时处理连续的扇区)
CH=柱面号&0xff;
CL=扇区号(0-5位)|(柱面号&0x300)>>2;
DH=磁头号;
DL=驱动器号;
ES:BX=缓冲地址;(校验及寻道时不使用)
返回值:
FLACS.CF=0:没有错误,AH==0
FLAGS.CF=1:有错误,错误号码存入AH内(与重置reset功能一样)
由代码可知,此处使用的是AH=0x02,所以这里是“读盘”操作。
FLAGS.CF:进位标志,如果调用函数后无错误,则进位标志为0;若有错,则进位标志为1;
进位标志:一个只能存储1位信息的寄存器,本来表示有无进位,这里用来报告BIOS函数调用是否有错误;
标志:一位寄存器;
2、软盘结构
软盘结构示意图如下:
柱面:由外向内(0-79)的一圈一圈圆环状的区域。这并非软盘的生产方式,而是我们将它作为数据存储媒体,这样组织它的数据存储方式。
磁头:针状的磁性设备。区别与光盘,软盘磁盘是两面都能记录数据的。因此有正反两面两个磁头,其中正面是磁头0号,反面是磁头1号。
扇区:由于柱面作为单位进行读写过大,所以我们将“圆环”等分成18份(软盘),每一份称为一个扇区(1-18)。
综上,1个软盘有80个柱面,2个磁头,18个扇区,一个扇区512字节,因此软盘容量:
80218512=1440KB
含IPL的启动区位于C0-H0-S1,因此我们想要装载的扇区是C0-H0-S2。
3、缓冲区地址
即为从软盘上读出的数据装载到内存中的内存地址。在EBX出现之前,使用的是辅助作用的段寄存器。
段寄存器地址表示方式:
MOV AL,[ES:BX]&#