30天自制操作系统第1天——从机器结构到汇编程序入门

一、开发工具介绍、安装、环境配置

​ 接下来介绍的开发工具可能会让大家直接傻眼,一开始的开发我们既不使用C语言,也不使用汇编语言,而是使用二进制编辑器,有些同学可能就会觉得完蛋,废了。其实我也是这样感觉的,我也准备好迎接一场史诗性的挑战了。

下载链接https://pan.baidu.com/s/1aDxkpJ2uPt5XKr0kPlPpaA

提取码:uhzy

启动页面:

image-20240124123801603

保存文件名称建议名称:helloos.img

光盘启动盘

链接:https://pan.baidu.com/s/1kG_XXmB7wo4CMaKOMkgv7w
提取码:69x9

将里面的tolset文件夹移到任意一个位置,只要这个盘中有100MB即可(最好自己创建一个分盘出来,如果不会自己找教程)

UltraISO

链接:https://pan.baidu.com/s/1uqb6EBNmSlHyCVx5i2ehJg
提取码:jwqq

汇编程序环境配置

官网下载:QEMU for Windows (需要配置环境变量,非常简单,不懂自己查)

官网下载: NASM for Windows (需要配置环境变量,非常简单,不懂自己查)

官方下载: MSYS2 (需要配置环境变量,非常简单,不懂自己查)

VSCode + Hex Editor + x86 and x86_64 Assembly

来个例子(无需弄明白,先看看效果):

光盘中已经将工具代码写好,由于目前也看不太懂,因此可以采取下列步骤直接进行(非常粗暴,后续详细代码会一一详细解说)

第一步:将”OS\projects\01_day\helloos1”文件夹复制到”OS\tolset”文件夹下

第二步:“OS\tolset\helloos1”文件夹,将helloos.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
; hello-os
; TAB=4

ORG 0x7c00 ; 指明程序的装载地址

; 以下这段是标准FAT12格式软盘专用的代码

JMP entry
DB 0x90
DB "HELLOIPL" ; freeparam 启动区的名称可以是任意的字符串(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 " ; freeparam 磁盘的名称(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, bitzhuwei's OS!" ; freeparam
DB 0x0a ; 换行
DB 0

RESB 0x7dfe-$ ; 填写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

第三步: 双击!cons_nt.bat (没有用再双击!cons_9x.bat

第四步: 弹出窗口中依次输入

1
2
$ asm
$ run

出现以下窗口表示启动成功我们的helloos.img操作系统!!!

image-20240124135917935

二、制作启动盘

第一步:准备一个U盘,里面的数据全部为空。

第二步:使用UltraISO软件,打开刚刚的helloos.img

image-20240124141939944

image-20240124142047508

第三步:

image-20240124143626465

三、真机启动

​ 接着就可以重启之后,然后从 BIOS 打开选择从**U盘启动。如下图(待补充)**

四、基本讲解步骤(最好自己慢慢看)

P19~20

​ 回到我们的最先介绍的二进制编码工具,它实际上就是生成一系列比如说音乐、图片等等信息的二进制代码,一行就是32位,有多少行就有多少条指令。

只要你够牛逼,你遇到了过于付费的软件,但是又不想花钱,你也可以自己用这个编辑器自己编出一个软件。当然,这也是个不切实际的想法,即使你真有这么牛,你也会认为:哇,这个软件真值,这么便宜:laughing::laughing::laughing::laughing:

当然我们现在还是更加习惯于使用十六进制或者八进制。

五、初次体验汇编程序(环境配置见上)

使用汇编语言最大的好处:就是可以简化代码,可以将前面的近上万行的二进制代码转换为几十行代码

测试NASM配置

image-20240124161000919

通过以下指令即可实现汇编语言转换为机器语言的16进制模式,也就是前面提到的img文件模式

1
$ nasm -f bin day1.asm -o day1.img

image-20240124161011375

测试QEMU

第一步:首先将dat1.img使用UltraISO转换为软盘映像文件**(前面已经介绍过)**

第二步: 然后再在img当前目录打开cmd执行以下指令即可:

1
$ qemu-system-i386 day1.img

如下图(待补充)

六、知识点小补充

DB指令

  • 往文件直接写入1个字节的指令。这个指令是程序员的杀手锏,有了这些DB指令 可以用它做出任何数据(甚至程序), 所以说几乎没有任何汇编语言编不出的程序。其他语言很多最后都是转为汇编语言然后再由它转为机器语言提供给CPU识别执行;
  • 直接写字符串,汇编语言会自动查找字符串中每一个字符对应的编码,然后把它们一个一个字节排列出来;

RESB:

​ 如果想要从现在的地址开始空出10个字节,就可以写为RESB 10 ,相当于预约了10个字节。(大家可以想象成对号入座预定了10个连续的位置)

;为注释含义:

​ 和C语言中的 // 一个含义

DW指令和DD指令:

word相当于16位,即为2字节,double-word相当于32位,即为4字节。

注意

RESB 0x1fe-$$ 表示的是 我们这一行现在的字节数(其他含义)

image-20240124172241468

image-20240124172251651