首页 > 代码库 > 30天自制操作系统(第三天)
30天自制操作系统(第三天)
磁头是一个针状的磁性设备,既可以从软盘的正面接触磁盘,也可以从软盘背面接触磁盘。与光盘不同,软盘磁盘是两面都能记录数据的。 因此我们有正面和反面两个磁头,分别是磁头1号和磁头0号。 指定了柱面和磁头后,在磁盘的这个圆环上,还能记录很多位信息,按照整个圆环位单位读写的话,实在有点多,所以把圆环均等分成几 份,软盘为18份,每一份称为一个扇区。 1张软盘有80个柱面,2个磁头,18个扇区,且一个扇区512字节 MOV CX,[1234] 实质是 MOV CX,[DS:1234] 默认段寄存器是DS,所以DS在使用前必须预先指定为0,否则地址的值要加上这个数的16倍 就会读写到其他的地方,引起混乱。
保存到磁盘映像里: 使用make install指令,将磁盘映像写入磁盘 在windows里打开那个磁盘,把haribote.sys保存到磁盘上 使用工具将磁盘备份为磁盘映像
一般向一个空软盘保存文件时: 1.文件名会写在0x002600 2.文件的内容会写在0x004200以后的地方
在设置画面信息后,还要将画面信息保存在内存里面,
映像文件,根据我的理解,即是不是本来的东西,只是一种代替形式
HLT是I/O指令,MOV是转送指令,ADD是演算指令
bootpack.c
/*告诉C编译器,有一个函数在别的文件里面*/void io_hlt(void);/*函数申明不用{},而用;,函数在别的函数里*/void HariMain(void){ fin: io_hlt(); /*这里想写上HLT,但C语言中不用HLT!*/ goto fin;}
naskfunc.nas
;naskfunc;TAB=4[FORMAT "WCOFF"] ;制作目标文件的模式[BITS 32] ;制作32位模式用的机械语言;制作目标文件的信息[FILE "naskfunc.nas"] ;源文件名信息GLOBAL _io_hlt ;程序中包含的函数名;以下是实际函数[SECTION .text] ;目标文件中写了这些之后在写程序_io_hlt: ; void io_hlt(void); HLT RET
ipl10.nas
;hello-os;TAB=4CYLS EQU 10 ORG 0X7C00 ;指明程序的装载地址 ;以下这段是标准FAT12格式软盘专用代码 JMP entry DB 0x90 DB "HARIBOTE" ;启动扇区的名称可以使任意的字符串 DW 512 ;每个扇区的大小(必须为512字节) DB 1 ;簇的大小(必须为1个扇区) DW 1 ;FAT的起始位置(一般从第一个扇区开始) DB 2 ;FAT的个数(必须为2) DW 224 ;根目录的大小(一般设置为224) DW 2880 ;该磁盘的大小(必须是2880扇区) DB 0xf0 ;磁盘的种类(必须是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 " ;磁盘的名称(11字节) DB "FAT12 " ;磁盘格式的名称(8字节) 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 ;扇区2readloop: MOV SI,0 ;记录失败次数的寄存器retry: MOV AH,0x02 ;AH=0x02 : 读盘 MOV AL,1 ;一个扇区 MOV BX,0 MOV DL,0x00 ;A驱动器 INT 0x13 ;调用磁盘BIOS JNC next ;没出错的话就跳转到next ADD SI,1 CMP SI,5 JAE error ;SI>=5跳转到error MOV AH,0x00 MOV DL,0x00 ;A驱动器 INT 0x13 ;重置驱动器 JMP retrynext: MOV AX,ES ;把内存地址后移0x200 ADD AX,0x0020 MOV ES,AX ;因为没有ADD ES,0x200指令 ADD CL,1 ;往CL里面加1 CMP CL,18 JBE readloop ;如果CL<=18,跳转至readloop MOV CL,1 ADD DH,1 CMP DH,2 JB readloop ;如果DH<=2,跳转到readloop MOV DH,0 ADD CH,1 CMP CH,CYLS JB readloop ;如果CH<CYLS,则跳转到readloop MOV [0x0ff0],CH JMP 0xc200 error: MOV SI,msgputloop: MOV AL,[SI] ADD SI,1 ;给SI加1 CMP AL,0 JE fin MOV AH,0x0e ;显示一个文字 MOV BX,15 ;指定字符颜色 INT 0x10 ;调用显卡BIOS JMP putloopfin: HLT ;让CPU停止循环,等待指令 JMP fin ;无限循环msg: DB 0X0a,0X0a ;换行两次 DB "load error" DB 0x0a DB 0 RESB 0x7dfe-$ ;填写0x00,直到0x001fe DB 0x55, 0xaa
30天自制操作系统(第三天)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。