0%

30天自制操作系统-汇编程序制作软盘进阶

前言

我们刚刚用的汇编程序,不过是把0x00的书写简化了,程序内容依然是看不懂的十六进制字符串。现在我们把汇编程序写得更易懂一些。

汇编程序

这个程序代码最好是用编辑器写(比如我用的是VScode),如果用记事本写,会因为tab键的问题而导致无法用nask转换为img镜像。<亲身经验

程序代码:helloostest.nas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
; 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

扇区
512byte(字节)为一个扇区,软盘有1440KB(即1474560byte),1474560/512=2880。也就是说这个软盘一共有2880个扇区。第一个扇区是启动区(boot sector),启动区的最后两个字节是0x550xaa

IPL
IPL(initial program loader),启动程序加载器。操作系统一般将本身的程序放到启动区。

制作软盘镜像

把程序文件拷贝到nask程序所在目录,打开powershell执行命令:.\nask.exe .\helloostest.nas .\hello77.img

启动qemu

把生成的img镜像放到qemu程序所在目录,打开powershell执行命令:.\qemu-system-i386.exe -hdd .\hello77.img
image.png
更改程序里面这行代码,可以修改操作系统界面的显示内容。

DB "hello, world" ; 可以自定义操作系统显示界面

image.png

总结

写程序还是使用编辑器比较好,用记事本太容易引起格式错误了,多么惨痛的教训……

-------------本文结束感谢您的阅读-------------