《30天自制操作系统》03_day_学习笔记
harib00a:
添加的部分从P46开始,制作IPL准备开始从磁盘装载程序了
笔者讲解了软盘的驱动的构造,以及汇编语言读取软盘的方法
MOV AX,0x0820
MOV ES,AX
MOV CH, ; 柱面0
MOV DH, ; 磁头0
MOV CL, ; 扇区2 MOV AH,0x02 ; AH=0x02 : 读盘
MOV AL, ; 1个扇区
MOV BX,
MOV DL,0x00 ; A驱动器
INT 0x13 ; 调用磁盘BIOS
harib00b:
这一部的目的主要是试错
P51 软盘是很不可靠的存储设备,有时候会发生不能读取数据的情况
改良后的程序就是这一部分
在重新读盘之前添加了系统复位的功能,复位软盘的状态再读一次
; 读磁盘
MOV AX,0x0820
MOV ES,AX
MOV CH, ; 柱面0
MOV DH, ; 磁头0
MOV CL, ; 扇区2 MOV SI, ; 记录失败次数的寄存器
retry:
MOV AH,0x02 ; AH=0x02 : 读入磁盘
MOV AL, ; 1个扇区
MOV BX,
MOV DL,0x00 ; A驱动器
INT 0x13 ; 调用磁盘BIOS
JNC fin ; 没有出错就跳到fin
ADD SI, ; SI+1
CMP SI, ; 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
MOV DH, ; 磁头0
MOV CL, ; 扇区2
readloop:
MOV SI, ; 记录失败次数的寄存器
retry:
MOV AH,0x02 ; AH=0x02 : 读入磁盘
MOV AL, ; 1个扇区
MOV BX,
MOV DL,0x00 ; A驱动器
INT 0x13 ; 调用磁盘BIOS
JNC next ; 没有出错时转到next
ADD SI, ; SI+1
CMP SI, ; 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, ; CL+1
CMP CL, ; CL和18的大小
JBE readloop ; CL <= 18 跳到readloop
harib00d:
P53 读入10个柱面的内容
MOV AX,0x0820
MOV ES,AX
MOV CH, ; 柱面0
MOV DH, ; 磁头0
MOV CL, ; 扇区2
readloop:
MOV SI, ; 记录失败次数的寄存器
retry:
MOV AH,0x02 ; AH=0x02 : 读入磁盘
MOV AL, ; 1个扇区
MOV BX,
MOV DL,0x00 ; A驱动器
INT 0x13 ; 调用磁盘BIOS
JNC next ; 没有错误跳转NEXT
ADD SI, ; SI+1
CMP SI, ; 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, ; CL+1
CMP CL, ; CL与18比较
JBE readloop ; CL <= 18 跳到readloop
MOV CL,
ADD DH,
CMP DH,
JB readloop ; DH < 2 跳到readloop
MOV DH,
ADD CH,
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], ; 记录画面模式
MOV WORD [SCRNX],
MOV WORD [SCRNY],
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位模式的机械语言
; 制作目标文件的信息
[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;
}
《30天自制操作系统》03_day_学习笔记的更多相关文章
- 《30天自制操作系统》学习笔记--Mac下工具的使用
现在来介绍官网上下的工具怎么用首先是官网地址,书上有个注释上有:hrb.osask.jp 翻译成中文大概是这个样子滴. 上面有两个文件可以下载,一个是工具,一个是工具的源代码,很好的学习资料 下面把工 ...
- 《30天自制操作系统》学习笔记--Mac环境搭建
弄了三天了,终于弄好了,先说结果,就是作者在网站上放了os x的工具(hrb.osask.jp,也有linux下的工具,可以自己去下载),也就是说我白忙活了三天... 再说一下这几天都干啥了,主要是想 ...
- 《30天自制操作系统》学习笔记--番外篇之Mac环境下的工具介绍
这几天又有点不务正业了,书也没看,一直在搞这个破环境,尝试各种做法,网上各种垃圾信息,浪费了很多时间,说的基本都是废话,不过还是找到了一些,赶紧写下来,不然这个过几天又忘了 首先是环境,我用的是Max ...
- 《30天自制操作系统》读书笔记(5) GDT&IDT
梳理项目结构 项目做到现在, 前头的好多东西都忘了, 还是通过Makefile重新理解一下整个项目是如何编译的: 现在我们拥有这么9个文件: ipl10.nas InitialProgramLo ...
- 《30天自制操作系统》读书笔记(3) 引入C语言
这一次的学习相当曲折, 主要是因为粗心, Makefile里面的错误导致了文件生成出现各种奇奇怪怪的问题, 弄得心力交瘁, 因此制作过程还是尽量按着作者的路子来吧. 作者提供的源码的注释在中文系统下是 ...
- 《30天自制操作系统》读书笔记(2)hello, world
让系统跑起来 要写一个操作系统,我们首先要有一个储存系统的介质,原版书似乎是06年出版的,可惜那时候没有电脑,没想到作者用的还是软盘,现在的电脑谁有软驱?不得已我使用一张128M的SD卡来代替,而事实 ...
- 30天自制操作系统第九天学习笔记(u盘软盘双启动版本)
暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078 ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第九天的课程已学完,确实有点不想写 ...
- 从你的u盘启动:30天自制操作系统第四天u盘启动学习笔记
暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078 ,更多学习中的问题.资料,群里分享 developing environment:ubuntu 关于u盘启动自己做的操 ...
- 30天自制操作系统第八天学习笔记(u盘软盘双启动版本)
暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078 ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第八天的学习思考: 关于鼠标是怎么 ...
- 《30天自制操作系统》笔记(03)——使用Vmware
<30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测 ...
随机推荐
- java 时间戳和PHP时间戳 的转换
java 时间戳和PHP时间戳 的转换 PHPJava 总结一下java 时间戳和PHP时间戳 的转换问题: 由于精度不同,导致长度不一致,直接转换错误. JAVA时间戳长度是13位,如:12948 ...
- [转]PHP高效率写法(详解原因)
1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非静 ...
- 图解SQL多表关联查询
图解SQL多表关联查询 网上看了篇文章关于多表连接的,感觉很好,记录下来,以便日后自己学习 内连接 左连接 右连接 全外连接 1. 查两表关联列相等的数据 ...
- Why Stored Procedures?
http://www.w3resource.com/mysql/mysql-procedure.php Stored procedures are fast. MySQL server takes s ...
- Java中同步
解决资源共享的同步操作,有两种方法:一是同步代码块,二是同步方法. 在需要同步的代码块加上synchronized关键字, 同步代码块时必须指定一个需要同步的对象,但一般都是将当前对象(this)设置 ...
- 【Android测试】【第十节】MonkeyRunner—— 录制回放
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/4861693.html 前言 在实际项目进行过程中,频繁的需 ...
- js实现表格信息的删除和添加
制作一个表格,显示班级的学生信息. 要求: 1. 鼠标移到不同行上时背景色改为色值为 #f2f2f2,移开鼠标时则恢复为原背景色 #fff 2. 点击添加按钮,能动态在最后添加一行 3. 点击删除按钮 ...
- 折腾Centos6.4记
背景: 闲置了一台Thinkpad,之前装的是Kali Linux,但无线网卡挂掉了,加之硬盘分区不当,平时几乎没怎么用,重新使用kali的livecd进行分区,然后安装,总是出错,尝试了七八次,仍然 ...
- Java学习-009-文件名称及路径获取实例及源代码
此文源码主要为应用 Java 获取文件名称及文件目录的源码及其测试源码.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:2015-2-3 00:02:27,请知悉. Java获取文件名称的 ...
- LeetCode Dungeon Game
原题链接在这里:https://leetcode.com/problems/dungeon-game/ 这是一道DP题,保存当前格到右下格所需要的最小体力,m*n的dp数组保存. 更新是Math.mi ...