30天自制操作系统(一)从计算机结构到汇编程序入门
2021/8/27 9:36:00
本文主要是介绍30天自制操作系统(一)从计算机结构到汇编程序入门,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
其实本文的绝大多数的内容都是根据《30天自制操作系统》进行撰写的。可以把本文看做是原书的一些辅助教程吧。
在阅读文章之前,建议大家手头有一本《30天自制操作系统》以及其附带的文件。附带光盘中的文件,很多网上都有下载。
我们先看第一章。第一章的内容简单概括一下:
1.用十六进制编辑器(叫二进制编辑器也可以,个人习惯)编写img文件
2.汇编语言的DB和RESB指令
首先,我们先看十六进制编辑器。原文是这样写的:
这个网页在笔者的电脑上是打不开的,下图:
由于原书的出版年代较早,导致部分网页是打不开的,对于这类十六进制编辑器之类的辅助工具,笔者这里找到一个网址:
https://www.cr173.com/soft/44565.html
打开应该是这样的:
左边的东西是十六进制的编码,右边的其实是把十六进制的编码转换为字符后的编码。这样我们就可以看到一些字符串的值。例如,右边类似HELLOIPL FAT32等标记就是字符串。
如果要运行的话,注意!把z_tools文件夹复制到同一目录下!
这样,我们就完成了最简单的操作系统的开发。
顺带说明一下,
其中的美元符号其实是反斜杠。这是由于日语编码的问题。
后面对于十六进制和二进制的相关介绍,原书写的很清楚,这里不再阐述。
然后我们就开始编写汇编语言程序了。其实在现在这个年代,其实汇编语言已经很少再使用了。不过在操作系统的领域内,汇编语言其实也是不可缺少的。
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 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
这段东西中只有DB和RESB指令。仔细一看就知道和刚才的img一样的。
DB表示往这个文件里面放入一个字节的指令。DB是data byte的缩写。RESB表示空出相应的字节数,填充0x00。
这样,我们就往文件里面写入了1440KB的指令。系统起动时候,会把这些指令放入内存中进行执行。(系统是不会直接在软盘执行数据的,因为内存相对磁盘读写比较快)
理解了这些,我们来看看helloos2.
; hello-os ; TAB=4 ; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述 DB 0xeb, 0x4e, 0x90 DB "HELLOIPL" ; ブートセクタの名前を自由に書いてよい(8バイト) DW 512 ; 1セクタの大きさ(512にしなければいけない) DB 1 ; クラスタの大きさ(1セクタにしなければいけない) DW 1 ; FATがどこから始まるか(普通は1セクタ目からにする) DB 2 ; FATの個数(2にしなければいけない) DW 224 ; ルートディレクトリ領域の大きさ(普通は224エントリにする) DW 2880 ; このドライブの大きさ(2880セクタにしなければいけない) DB 0xf0 ; メディアのタイプ(0xf0にしなければいけない) DW 9 ; FAT領域の長さ(9セクタにしなければいけない) DW 18 ; 1トラックにいくつのセクタがあるか(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-$ ; 0x001feまでを0x00で埋める命令 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.起动区的最后两个字节必须为0x55和0xaa
2.汇编语言的字符串没有转义字符,需要手动在后面添加DB 0x0a,不能写作:DB"hello world\n"这样输出不对,出现下图的情况
(C语言写多的人一定要注意!)
这篇关于30天自制操作系统(一)从计算机结构到汇编程序入门的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23linux 系统宝塔查看网站访问的命令是什么?-icode9专业技术文章分享
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南