标签:
harib00a:
添加的部分从P46开始,制作IPL准备开始从磁盘装载程序了
笔者讲解了软盘的驱动的构造,以及汇编语言读取软盘的方法
MOV AX,0x0820 MOV ES,AX MOV CH,0 ; 柱面0 MOV DH,0 ; 磁头0 MOV CL,2 ; 扇区2 MOV AH,0x02 ; AH=0x02 : 读盘 MOV AL,1 ; 1个扇区 MOV BX,0 MOV DL,0x00 ; A驱动器 INT 0x13 ; 调用磁盘BIOS
harib00b:
这一部的目的主要是试错
P51 软盘是很不可靠的存储设备,有时候会发生不能读取数据的情况
改良后的程序就是这一部分
在重新读盘之前添加了系统复位的功能,复位软盘的状态再读一次
; 读磁盘 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 ; 1个扇区 MOV BX,0 MOV DL,0x00 ; A驱动器 INT 0x13 ; 调用磁盘BIOS JNC fin ; 没有出错就跳到fin ADD SI,1 ; SI+1 CMP SI,5 ; SI与5比较 JAE error ; SI >= 5 跳转到error MOV AH,0x00 MOV DL,0x00 ; A驱动器 INT 0x13 ; 重置驱动器 JMP retry
harib00c:
P51 读到18扇区
; 读磁盘 MOV AX,0x0820 MOV ES,AX MOV CH,0 ; 柱面0 MOV DH,0 ; 磁头0 MOV CL,2 ; 扇区2 readloop: MOV SI,0 ; 记录失败次数的寄存器 retry: MOV AH,0x02 ; AH=0x02 : 读入磁盘 MOV AL,1 ; 1个扇区 MOV BX,0 MOV DL,0x00 ; A驱动器 INT 0x13 ; 调用磁盘BIOS JNC next ; 没有出错时转到next ADD SI,1 ; SI+1 CMP SI,5 ; SI与5比较 JAE error ; SI >= 5 挑战到error MOV AH,0x00 MOV DL,0x00 ; A驱动器 INT 0x13 ; 重置驱动器 JMP retry next: MOV AX,ES ; 把内存地址后移0x200 ADD AX,0x0020 MOV ES,AX ; 实现的是 ADD ES,0x020的 ADD CL,1 ; CL+1 CMP CL,18 ; CL和18的大小 JBE readloop ; CL <= 18 跳到readloop
harib00d:
P53 读入10个柱面的内容
MOV AX,0x0820 MOV ES,AX MOV CH,0 ; 柱面0 MOV DH,0 ; 磁头0 MOV CL,2 ; 扇区2 readloop: MOV SI,0 ; 记录失败次数的寄存器 retry: MOV AH,0x02 ; AH=0x02 : 读入磁盘 MOV AL,1 ; 1个扇区 MOV BX,0 MOV DL,0x00 ; A驱动器 INT 0x13 ; 调用磁盘BIOS JNC next ; 没有错误跳转NEXT ADD SI,1 ; SI+1 CMP SI,5 ; SI与5比较 JAE error ; SI >= 5 跳到error MOV AH,0x00 MOV DL,0x00 ; A驱动器 INT 0x13 ; 重置驱动器 JMP retry next: MOV AX,ES ; 内存地址后移0x200 ADD AX,0x0020 MOV ES,AX ; ADD ES,0x020 ADD CL,1 ; CL+1 CMP CL,18 ; 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
harib00e:
P54 到此已经完成了启动区的制作
下面编写一个小的程序,只让它 HLT
这里要做的事就是将文件hanbote.sys文件保存在镜像haribote.img中
执行之后打开hatibote.img 在0000:2600附近保存着文件名hanbote.sys
在0000:4200附近保存着文件hanbote.sys中的内容
总结:一般向软盘(镜像)b保存文件时 文件名写在0000:2600;文件内容写在0000:4200
harib00f:
P56 从启动区执行操作系统
在上一部的基础上(已经将启动文件写入了镜像)
用ORG 0xc200加上JMP跳转到这里来从启动区执行操作系统
harib00g:
P56 检验haribote.sys的执行情况(让它表现出来)
这里设置了显卡的模式,课本中讲解了一点关于显卡的原理
该HLT执行的内容就是通过修改显卡,显示全黑。检测完毕
; haribote.nas ; TAB=4 ORG 0xc200 ; 该程序将要装载到镜像中 的地址 MOV AL,0x13 ; VGA显卡;320x200x8bit彩色 MOV AH,0x00 INT 0x10 fin: HLT JMP fin
harib00h:
P58 接下来准备用32位的模式进行开发
注意:BIOS是用16位的机器语言写的,用32位模式就不能调用BIOS函数
如果想要使用BIOS来做,就必须全部都放在开头先做好
该次实验的目:设置画面的模式,然后把画面模式保存在内存中
为了支持不同的画面模式,需要把现在设置的信息保存起来以供以后使用
;haribote.nas ; haribote-os ; TAB=4 ; 有关BOOT_INFO CYLS EQU 0x0ff0 ; 设定启动区 LEDS EQU 0x0ff1 VMODE EQU 0x0ff2 ; 关于颜色数目的信息,颜色的位数 SCRNX EQU 0x0ff4 ; 分辨率X SCRNY EQU 0x0ff6 ; 分辨率Y VRAM EQU 0x0ff8 ; 图像缓冲区开始的地址 ORG 0xc200 ; 这个程序要被装载的地方 MOV AL,0x13 ; VGA显卡,320x200x8bit彩色 MOV AH,0x00 INT 0x10 MOV BYTE [VMODE],8 ; 记录画面模式 MOV WORD [SCRNX],320 MOV WORD [SCRNY],200 MOV DWORD [VRAM],0x000a0000 ; 用BIOS取得键盘上各种LED指示灯的状态 MOV AH,0x02 INT 0x16 ; keyboard BIOS MOV [LEDS],AL fin: HLT JMP fin
harib00i:
P59 开始导入C语言,切换到32位的模式,
这一部分讲解了编写的C程序bootpack.c是怎样一步一步的被编译成机器语言的P60
//bootpack.c void HariMain(void) { fin: /* 将要编写的HLT */ goto fin; }
harib00j:
p62 分别用汇编语言和C语言编写HLT函数。
; naskfunc.nas ; TAB=4 [FORMAT "WCOFF"] ; 制作目标文件的模式 [BITS 32] ; 制作32位模式的机械语言 ; 制作目标文件的信息 [FILE "naskfunc.nas"] ; 源文件名信息 GLOBAL _io_hlt ; 程序中包含的函数名 ; 以下是实际的函数 [SECTION .text] ; 目标文件中写了这些之后再写程序 _io_hlt: ; void io_hlt(void); HLT RET
//bootpack.c /* 告诉C编译器,有一个函数在别的文件里 */ void io_hlt(void); /* 是函数声明,不用{ }用 ; 表明:函数在别的文件中,需要系统自己去查找 */ void HariMain(void) { fin: io_hlt(); /* 执行naskfunc.nas里的_io_hlt */ goto fin; }
标签:
原文地址:http://www.cnblogs.com/pengfeiz/p/5781032.html