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_学习笔记的更多相关文章

  1. 《30天自制操作系统》学习笔记--Mac下工具的使用

    现在来介绍官网上下的工具怎么用首先是官网地址,书上有个注释上有:hrb.osask.jp 翻译成中文大概是这个样子滴. 上面有两个文件可以下载,一个是工具,一个是工具的源代码,很好的学习资料 下面把工 ...

  2. 《30天自制操作系统》学习笔记--Mac环境搭建

    弄了三天了,终于弄好了,先说结果,就是作者在网站上放了os x的工具(hrb.osask.jp,也有linux下的工具,可以自己去下载),也就是说我白忙活了三天... 再说一下这几天都干啥了,主要是想 ...

  3. 《30天自制操作系统》学习笔记--番外篇之Mac环境下的工具介绍

    这几天又有点不务正业了,书也没看,一直在搞这个破环境,尝试各种做法,网上各种垃圾信息,浪费了很多时间,说的基本都是废话,不过还是找到了一些,赶紧写下来,不然这个过几天又忘了 首先是环境,我用的是Max ...

  4. 《30天自制操作系统》读书笔记(5) GDT&IDT

    梳理项目结构 项目做到现在, 前头的好多东西都忘了, 还是通过Makefile重新理解一下整个项目是如何编译的: 现在我们拥有这么9个文件: ipl10.nas    InitialProgramLo ...

  5. 《30天自制操作系统》读书笔记(3) 引入C语言

    这一次的学习相当曲折, 主要是因为粗心, Makefile里面的错误导致了文件生成出现各种奇奇怪怪的问题, 弄得心力交瘁, 因此制作过程还是尽量按着作者的路子来吧. 作者提供的源码的注释在中文系统下是 ...

  6. 《30天自制操作系统》读书笔记(2)hello, world

    让系统跑起来 要写一个操作系统,我们首先要有一个储存系统的介质,原版书似乎是06年出版的,可惜那时候没有电脑,没想到作者用的还是软盘,现在的电脑谁有软驱?不得已我使用一张128M的SD卡来代替,而事实 ...

  7. 30天自制操作系统第九天学习笔记(u盘软盘双启动版本)

    暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第九天的课程已学完,确实有点不想写 ...

  8. 从你的u盘启动:30天自制操作系统第四天u盘启动学习笔记

    暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 developing environment:ubuntu 关于u盘启动自己做的操 ...

  9. 30天自制操作系统第八天学习笔记(u盘软盘双启动版本)

    暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第八天的学习思考: 关于鼠标是怎么 ...

  10. 《30天自制操作系统》笔记(03)——使用Vmware

    <30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测 ...

随机推荐

  1. 不再以讹传讹,GET和POST的真正区别

    不再以讹传讹,GET和POST的真正区别 网上的多数答案都是错的 在 2012年05月03日 那天写的     已经有 19940 次阅读了 感谢 参考或原文 www.cnblogs.com   服务 ...

  2. Rails--bundle exec rake db:migrate

    --新建表: def up create_table :[TABLE_NAME] do |t| t.column :[NUM], :integer t.column :[NAME], :string ...

  3. LR处理文件上传和下载

    文件上传 在业务场景有上传操作时,使用LR能录制到上传操作,代码如下.在录制的原始代码中,Filename的Value是上传的文件名,name的Value是一串文件名的加密串,file的Value也是 ...

  4. Connection Management and Security

    High Performance My SQL  THIRD EDITION Each client connection gets its own thread within the server ...

  5. communicate with other processes, regardless of where they are running

    Advanced Programming in the UNIX Environment Third Edition   In the previous chapter, we looked at p ...

  6. delphi 高版本可执行程序减小的办法

    选菜单里的 Project -> Options.. (Shift+Ctrl+F11)出现Project Options for Project1.exe窗口,在左边选 Packages出现如下 ...

  7. Nginx 常用全局变量 及Rewrite规则详解

    每次都很容易忘记Nginx的变量,下面列出来了一些常用 $remote_addr //获取客户端ip $binary_remote_addr //客户端ip(二进制) $remote_port //客 ...

  8. MVC HTML辅助类常用方法记录

    (1)@Html.DisplayNameFor(model => model.Title)是显示列名, (2)@Html.DisplayFor(modelItem => item.Titl ...

  9. 解决 SqlServer执行脚本,文件过大,内存溢出问题

    原文:解决 SqlServer执行脚本,文件过大,内存溢出问题 执行.sql脚本文件,如果文件较大时,执行会出现内存溢出问题,可用命令替代 cmd 中输入 osql -S 127.0.0.1,8433 ...

  10. sqlserver 中含有某字符串

    查找 sqlserver 中字符串的ascii码SET TEXTSIZE 0-- Create variables for the character string and for the curre ...