【专栏】30天自制操作系统系列——目录
白羽:day00——前言&&目录【专栏】30天自制操作系统
1.继续开发
新建文件夹helloos3,包含以下文件
![fe01f6f35adb36f87bd027b2f8de0e72.png](https://i-blog.csdnimg.cn/blog_migrate/2f588a7013704f56ac34d6ff826307f2.png)
重写helloos.nas文件
新指令介绍
ORG:“origin”,源头,起点。该指令告诉汇编器nask,程序从指定的地方开始,即将程序装载到内存的哪个地址。
JMP:跳转,相当于C语言的goto。
entry:标签的声明,用于指定JMP指令的跳转目的地。entry是入口的意思。
MOV:赋值,MOV AX, 0,相当于AX=0, MOV SS AX,相当于SS=AX。在源数据和目的数据位数相同的是可以省略数据大小,不然要加上数据大小,BYTE,WORD, DWORD
ADD:累加,ADD SI, 1,给SI加1
CMP:比较指令
JE:跳转指令,和CMP连用时表示如果相等就跳转
INT:软件中断指令,中断理解比较复杂,暂且理解为函数调用,来源于英文“interrupt”,中途打断
HLT:让CPU停止动作的指令,并不是彻底的停止,而是让CPU进入待机指令。如果没有HLT指令,CPU就会全力执行JMP fin指令,使CPU的复合达到100%,非常费电。来源于英文“halt”,停止。
; hello-os
打开cons执行run
![1212dd2a3e2e58d9503cec1b4add333b.png](https://i-blog.csdnimg.cn/blog_migrate/632e443ab62316ae64f692fb4b09a87c.jpeg)
2.AX和SS是什么?
在CPU中,使用寄存器来保存计算需要的数据以及计算后得到的数据。非常有代表性的寄存器有8个。
AX——累加寄存器
CX——计数寄存器
DX——数据寄存器
BX——基址寄存器
SP——栈指针寄存器
BP——基址指针寄存器
SI——源变址寄存器
DI——目的变址寄存器
以上这些寄存器都是16位寄存器,可以存储16位的二进制数。前四个寄存器后缀都是X来源于extend,拓展,表示将8位的寄存器拓展了一倍。
另外,还有一些其他的寄存器。
AL——累加寄存器低位
CL——计数寄存器低位
DL——数据寄存器低位
BL——基址寄存器低位
AH——累加寄存器高位
CH——计数寄存器高位
DH——数据寄存器高位
BH——基址寄存器高位
这8个寄存器是8位寄存器。看起来和16位AX,CX,DX,BX有些像,这是因为AX寄存器一共有16位,其中0到7位的低8位称为AL,而8到15位的高8位称为AH。
然而BP,SP,SI,DL却没有区分L和H。如果要取这几个寄存器的高位或者低位的数据,就必须先把SI的值赋给AX(MOV AX, SI),然后再用AL和AH来进行取值。
ES——附加段寄存器
CS——代码段寄存器
SS——栈段寄存器
DS——数据段寄存器
FS——没有名称
GS——没有名称
这些都是16位的段寄存器。
16位的CPU已经离我们很远了,现在常见的的是32位和64位,这里不使用64位,就不介绍了。
EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI。这里的前缀E同样来源于extend。
3.制作启动区
新建文件夹helloos4
![ed896ef0ac09b6b7fcc6b916c62dd400.png](https://i-blog.csdnimg.cn/blog_migrate/15b0bea8d72bbd5cdb307a310a2d87e5.png)
首先把helloos.nas的后半部分截掉,因为我们只制作启动区。并将文件改名为ipl.nas。
ipl.nas
; hello-os
; TAB=4
ORG 0x7c00 ; 指明程序的装载地址
; 以下的记述用于标记标准FAT12的软盘
JMP entry
DB 0x90
DB "HELLOIPL" ; 启动区的名称可以是任意字符(8字节)
DW 512 ; 每个扇区(sector)的大小(必须为512字节)
DB 1 ; 簇(cluster)的大小(必须为1个扇区)
DW 1 ; FAT的起始位置(一般从第一个扇区开始)
DB 2 ; FAT的个数(必须为2)
DW 224 ; 根目录的大小(一般设成224项)
DW 2880 ; 该磁盘的大小(必须是2880扇区)
DB 0xf0 ; 磁盘的种类(必须是0xf0)
DW 9 ; FAT的长度(必须是9扇区)
DW 18 ; 1个磁道(track)有几个扇区(必须是18)
DW 2 ; 磁头数(必须是2)
DD 0 ; 不适用分区,必须是0
DD 2880 ; 重写一次磁盘大小
DB 0, 0, 0x29 ; 意义不明,固定
DD 0xffffffff ; (可能是)卷标号码
DB "HELLO-OS " ; 磁盘的名称(11字节)
DB "FAT12 " ; 磁盘格式名称(8字节)
RESB 18 ; 先空出18字节
; 程序核心
entry:
MOV AX, 0 ; 初始化寄存器
MOV SS, AX
MOV SP, 0x7c00
MOV DS, AX
MOV ES, AX
MOV SI, msg
putloop:
MOV AL, [SI]
ADD SI, 1 ; 给SI加1
CMP AL, 0
JE fin
MOV AH, 0x0e ; 显示一个文字
MOV BX, 15 ; 指定字符颜色
INT 0x10 ; 调用显卡BIOS
JMP putloop
fin:
HLT ; 让CPU停止,等待指令
JMP fin ; 无限循环
msg:
DB 0x0a, 0x0a ; 换行2次
DB "hello, world! by BaiYu"
DB 0x0a ; 换行
DB 0
RESB 0x7dfe-$ ; 填写0x00,直到0x7dfe
DB 0x55, 0xaa
然后改造asm.bat,生成ipl.bin,ipl.lst
asm.bat
..z_toolsnask.exe ipl.nas ipl.bin ipl.lst
增加makeimg.bat。利用磁盘镜像管理工具edimg.exe,限度如一个空白的磁盘映像文件,然后在开头写入ipl.bin的内容,最后将结果输出为helloos.img的磁盘映像文件。
makeimg.bat
..z_toolsedimg.exe imgin:../z_tools/fdimg0at.tek wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img
打开cons运行asm->makeimg->run
![235c3b6a32c2bd165dda0ccf7c6b6dcd.png](https://i-blog.csdnimg.cn/blog_migrate/494d4f88e558a62dd53ea68a28b552ae.jpeg)
4.Makefile入门
新建helloos5文件夹,make.bat在tolsetz_new_w中,复制过来即可。
![dcddf75cc90d4e2bbe304bef1a62336c.png](https://i-blog.csdnimg.cn/blog_migrate/2cd6c8a93b9a9296be79028b2eefddce.png)
每次新写一个文件,就要增加一条批处理指令,非常麻烦。所以借助Makefile来简化操作。
首先生成一个不带拓展名的Makefile,然后用文本编辑器写入以下内容。
# 默认操作
打开cons运行make run
![55c5e0f57110c6610de1b4166f9288bd.png](https://i-blog.csdnimg.cn/blog_migrate/0ca33200fa3334d9ead6b9e4120418ab.jpeg)
如果本文对你有用,点个赞再走吧!或者关注我,我会带来更多优质的内容。