《30天自制操作系统》学习笔记 day1 - 机器语言到汇编语言
十年前的读物
刚翻开这本书就被灰尘扑了一脸,看来这本书真的有些年代了。
一切的开始 - hello, world
今天的任务是让计算机识别我们写的代码,并能够在裸机上显示 hello, world
。
我们知道高级语言 (C/C++、Java、Python 等) 是不能够直接在裸机上运行的,需要经过编译转为二进制程序运行或使用解释器运行,特别的,Java 程序需要编译成为 Java 字节码,再通过 Java 虚拟机 (JVM) 运行。
因此,在没有任何编译器程序、仅有裸机的情况下,只有低级语言能够直接在裸机上运行,作者这里采用机器语言和汇编语言分别实现了 hello, world
。
机器语言实现 hello, world
书里首先给出了一个二进制程序作为引入,作为一个 21 世纪 20 年代 (现在是 2025 年) 的程序员,我选择使用 Visual Studio Code
搭配 Hex Editor
插件编写程序 helloos.img
(作为一个前 CTFer,我也强烈安利 010 Editor
、Win Hex
等软件)。
好吧,感觉这样写要写半天还容易错,还是用脚本写程序吧… (事实证明就算用脚本也有可能写错)
1 | file = open('helloos.img', 'wb') |
生成 helloos.img
之后,使用作者提供的工具链(在这里下载),将其装载到 qemu
之中,就能够 顺利地 看到 hello, world
字样了。
使用汇编语言实现 hello, world
作者作者
你的机器语言确实很强
但还是太吃操作了
有没有什么简单又清晰的语言推荐一下
有的朋友,有的
像这么简单的语言还有一种
就是 汇编语言
为了提高代码的可读性和持续性,作者介绍了汇编语言实现 hello, world
的方式。
第一种实现方式其实还是机器语言的直译:
1 | DB 0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f |
依旧和机器语言一样不具有可读性(其实就是机器语言),不过至少能够在一个屏幕上显示了。
第二种实现方式则更具有可读性,更像一个“程序”了:
1 | ; hello-os |
笔记
汇编指令 | 全称 | 作用 |
---|---|---|
RESB |
reseve byte | 将指定的地址空出,并在空出的地址上自动填入 0x00 |
DB |
define byte | 往文件里直接写入 1 个字节 / 一串字符 |
DW |
define word | 往文件里直接写入 2 个字节 |
DD |
define double-word | 往文件里直接写入 4 个字节 |
$
目前可以理解为指代当前行的字节数(具体含义后续章节会补充)
后记
就这样,第一天的学习在大段的的十六进制码中结束了,说说我的感受吧。
硬件发展更迭好快
这本书里使用 软盘 装载操作系统,“这是什么?”或许是大部分出生在 21 世纪的人(包括我)看到这两个字的第一反应,毕竟我们只在保存按钮和一些视频中看见过软盘的样貌,现在容量更大、存取速度更快的存储设备已经完全取代了软盘、光盘等等媒介。
在我们的父母甚至祖父母那一辈却不然,他们经历了计算机在国内引进和发展的过程,亲眼见证了计算机体积的缩小,见证了制造技术的不断改进,见证了移动设备的兴起,或许他们读这本书的感受会和我们不一样。
而在我们之后出生的人,他们接触到的是一个高度发展的信息时代,旧的设备几乎被完全淘汰,新的设备不断更迭,很多人甚至不会还使用电脑就会使用手机了(其实我们这辈就有),他们又会如何理解和认识软盘之类的设备, 又会如何看待这些接近硬件层面的技术呢?
低级语言好麻烦
今天这三个程序的编写(仅仅只是显示一个 Hello, world
)就耗费了一下午时间,而且还是在有完整工具链和现代化工具(甚至使用 Python 脚本辅助)的情况下实现的,很难想象在半个多世纪以前,科学家们是如何一步步实现如此庞大的计算机系统的,又是如何调试运行的。
学习这些底层技术知识,重走来时路,或许是我们感受前人智慧的一种好方法,万一有一天我的经历也会成为他人阅读的历史呢?
- 标题: 《30天自制操作系统》学习笔记 day1 - 机器语言到汇编语言
- 作者: Hervey
- 创建于 : 2025-03-02 12:56:52
- 更新于 : 2025-03-04 02:07:40
- 链接: https://herveyb3b4.github.io/2025/03/02/OSASK/OSASK-day1/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。