为了更深入地了解操作系统原理,打算通过操作系统实验课上老师推荐的《30天自制操作系统》这本书进行实际的操作,以下为读书笔记。
准备
本实验需要两个软件:
- 二进制编辑器——Bz1621.lzh:下载地址
- 光盘文件:下载地址
- 文本编辑器:作者推荐的是TeraPad,不过由于为日文版的,译者推荐了Notepad++,但是我还是使用的VS Code,文本编辑器就随心所欲吧~
基本指令
本实验中前三节的内容有点类似于《微机原理与接口技术》中学习到类似于Intel 8086的汇编语言,下面列举一下在第一天中学到的指令:
指令 | 全称 | 含义 |
---|---|---|
DB | data byte | 往文件中直接写入一个字节的指令 |
DW | data word | 往文件中直接写入一个字(两个字节)的指令 |
DD | data double-word | 往文件中直接写入双字(四个字节)的指令 |
RESB | reserve byte | 往文件中写入跟在后面对应数字字节数,且值为0 |
ORG | origin | 该指令会告诉nask,在开始执行的时候,把机器语言指令装载到内存的哪个位置 |
JMZ | goto | 跳转语句 |
MOV | move | 赋值语句 |
AX | accumulator | 累加寄存器 |
CX | counter | 计数寄存器 |
DX | data | 数据寄存器 |
BX | base | 基址寄存器 |
SP | stack pointer | 栈指针寄存器 |
BP | base pointer | 基地址指针寄存器 |
SI | source index | 源变址寄存器 |
DI | destination index | 目的变址寄存器 |
ES | extra segment | 附加段寄存器 |
CS | code segment | 代码段寄存器 |
SS | stack segment | 栈段寄存器 |
DS | data segment | 数据段寄存器 |
FS | segment part 2 | 没有名称 |
GS | segment part 3 | 没有名称 |
BIOS 相关指令
显示单个字符
- AH=0x0e
- AL=character code
- BH=0
- BL=color code
- 返回值:无
- 注:beep、退格(backspace)、CR、LF都会被当作控制字符处理。
先按照这里的步骤往寄存器中存入对应值,再调用INT 0x10
就能够顺利地在屏幕上显示一个字符出来。
CPU停止动作
直接调用HLT(halt)指令即可使CPU进入待机状态
读盘&写盘&校验&寻道
- AH的值
- AH=0x02(读盘)
- AH=0x03(写盘)
- AH=0x04(校验)
- AH=0x0c(寻道)
- AL=处理对象的扇片数(只能同时处理连续的扇区)
- CH=柱面号&0xFF
- CL=扇区号(0-5位)|(柱面号&0x300)>>2
- DH=磁头号
- DL=驱动器号
- ES:BX=缓冲地址(校验及寻道时不使用)
- 返回值
- FLAGS.CF==0 没有错误,AH=0
- FLAGS.CF==1 有错误,错误号码存入到AH内(与重置功能一样)
Makefile
Makefile是一个相当聪明的批处理文件,其中有些特殊符号包括:
相关的语法有:
1 | # 文件生成规则: |
文件生成规则为其中某个文件如果缺失了,Makefile会自动地根据这个生成规则进行生成,相当智能的一点是,Makefile不仅会判断这个文件是否存在,还会判断这个文件是否是最新的,以此判断是否需要重新生成输出文件。
在使用文件生成规则时需使用:make -r 文件名
。
1 | # 命令 |
命令语句就可以直接执行对应的指令,Makefile还会自动判断所需文件是否存在决定是否需要重新生成。
在使用命令语句时需使用:make 命令
。