今天开始正式学习操作系统啦!!!《30天自制操作系统》一本比较老旧的书,希望30天都能坚持看完。
内容1:利用二进制编辑器编写操作系统,输出“hello world”;
重点总结:
- 了解ASCII码相关知识,查询ASCII码对应表。
- 打开二进制编辑器,学会利用二进制表示法编写操作系统,输出hello world
- 根据课本提示要求,输入相关二进制,编写run.bat和install.bat
- 打开!cons_nt.bat文件,输入run执行,调用PC模拟器,实现最终的hello world输出。
关键代码:
000000:HELLOIPL启动区的名称可以是任意的字符串(8字节)
000020:HELLO-OS磁盘的名称(11字节)
000030:FAT12磁盘格式名称(8字节)
000070:hello,world程序主体
内容2:利用nask写汇编程序,同样输出“hello world”;
重点总结:
- 利用nask编译器编写汇编程序,输出hello world;
- 了解RESB指令和DB指令的含义,DB指令是“define byte”的缩写,指往文件里直接写入了1个字节的指令。RESB指令是“reserve byte”的缩写,指从现在地址空出任意个地址出来。
- 学会利用nask.exe将.nas文件编译成为.img文件。操作如下:
提示符>..\z_tools\nask.exe helloos.nas helloos.img
- 将上述用二进制编译器编写的代码利用nask编译器重新编写,编译为.img文件之后重复上述操作,实现输出“hello world”
关键代码:
DB 0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f
DB 0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00
DB 0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00
DB 0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
DB 0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff
DB 0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f
DB 0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41
DB 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00
RESB 16
;程序主体
DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
DB 0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65 ;0x0a表示换行,之后的表示hello,world
DB 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72
DB 0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 368
DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432
内容3:改写上述汇编程序,增强可读性,并做修改。
重点总结:
- 将上述代码加工润色,增强代码的可读性
- 学习DW指令和DD指令。DW指令是指“define word”,即为具体的两个字节。DD指令是指“double define word”,即为具体的四个字节。
- 明白$符号的含义,$符号是一个变量,负责告诉我们这一行现在的字节数,从而可以保证最终整个代码长度的固定。
- 了解FAT12格式软盘专用的代码格式。
关键代码:
; hello-os
; TAB=4
; 以下这段是标准FAT12格式软盘专用的代码
DB 0xeb, 0x4e, 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字节
; 程序主体
DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
DB 0xee, 0xf4, 0xeb, 0xfd
; 信息显示部分
DB 0x0a, 0x0a ; 2个换行
DB "hello, world"
DB 0x0a ; 换行
DB 0
RESB 0x1fe-$ ; 填写0x00,直到0x001fe
DB 0x55, 0xaa
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
; 以下是启动区以外部分的输出
RESB 4600
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432
这就是第一天的内容,比较少也比较简单,但是还是有一些问题需要注意:
1.一个是文件路径问题需要考虑清楚,一定要放在tolset文件夹下方,或者自己可以修改.bat文件的路径。
2.二是如果!con_nx.bat(!con_9x.bat)双击之后闪退,说明是路径出现问题,右击编辑然后修改路径即可