第1天 从计算机结构到汇编程序入门
温馨提示:最好像此书的源码文件结构一样,每章都创建一个文件夹,在每章的文件夹下每小节也创建一个文件夹,这样方便以后对知识的复习巩固。另外,最好将..\z_tools改为自己的文件目录。
1.先动手操作
如果没有《30天自制操作系统》的光盘资源的话,可以到这个网址http://aprilsloan.ys168.com/下载,资源在“文件”文件夹下。
首先打开二进制编辑器(我的光盘资源中有此软件),在软件中输入如下字符:
接着从0000:0090开始后面全都是00,一直输入到最后0016:8000。输入00的时候可以复制粘贴加快速度。
其中1F0和1400位置有些部分不全为00,要记得改过来。
保存文件为helloos.img,并查看文件属性,文件大小应为1474560字节。
然后创建一个文本文档,并添加以下内容:
copy helloos.img ..\z_tools\qemu\fdimage0.bin
..\z_tools\make.exe -C ..\z_tools\qemu
可以根据自己的情况,对..\z_tools的文件位置进行修改。保存文档,并重命名为run.bat。双击此文件即可运行,运行显示的界面如下:
2.初次体验汇编程序
新建一个文件,命名为helloos.nas,并添加一下内容:
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指令是“data byte”的缩写,也就是往文件里直接写入1个字节的指令。小写的“db”也是一样的。
RESB指令是“reserve byte”的略写。如果想要从现在的地址开始空出10个字节来,就可以写成RESB 10,意思是占用这10个字节,并在这连续的10个地址中填入0x00。
新建一个文本文档,填入以下内容:
..\z_tools\nask.exe helloos.nas helloos.img
重命名为asm.bat,双击运行,得到helloos.img。再双击运行run.bat,得到的界面为:
3.加工润色
再次对helloos.nas进行修改,其内容变更为以下代码:
; hello-os
; TAB = 4
; 以下这段是标准FAT12格式软盘专用的代码
DB 0xeb, 0x4e, 0x90
DB "HELLOIPL" ; 启动区的名称可以是任意的字符串(8字符)
DW 512 ; 每个扇区(sector)的大小
DB 1 ; 簇(cluster)的大小(必须为1个扇区)
DW 1 ; FAT的起始位置(一般从第一个扇区开始)
DB 2 ; FAT的个数(必须为2)
DW 224 ; 根目录的大小(一般设成224项)
DW 2880 ; 该磁盘的大小(必须是2880扇区)(软盘大小1440KB除以扇区大小512B得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 2600
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432
“;”命令是一个注释命令,相当于C或是C++中的“//”。
此次解锁了DB指令的新姿势,可以直接用它写字符串。
DW指令和DD指令分别是“data word”和“data double-word”的缩写,word指的是“16位”,也就是2个字节,“double-word”是“32位”,也就是4个字节。
RESB 0x1fe-$中,$是一个变量,表示这一行现在的字节数。在这个程序里,在前面已经输出流132字节,所以这里的$就是132,。因此nask瞎用0x1fe减去132,得出378这一结果,然后连续输出178个字节的0x00。
双击运行asm.bat和run.bat,最后得到的界面为:
第1天的内容就到此结束。第一天的内容并不难,毕竟直接动手写img文件根本理解不了什么东西,而只用DB和RESB指令的汇编文件也让人看不懂,之后的汇编代码虽然更加清晰了,但也就信息显示部分能看看。但这仅仅这是开始,后面的难度慢慢增加,希望大家都能坚持学习,学有所获!