《30天自制操作系统》03_day_学习笔记

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;
}
原文地址:https://www.cnblogs.com/pengfeiz/p/5781032.html