《30天自制操作系统》第1天

第1天 从计算机结构到汇编程序入门

温馨提示:最好像此书的源码文件结构一样,每章都创建一个文件夹,在每章的文件夹下每小节也创建一个文件夹,这样方便以后对知识的复习巩固。另外,最好将..\z_tools改为自己的文件目录。

1.先动手操作

如果没有《30天自制操作系统》的光盘资源的话,可以到这个网址http://aprilsloan.ys168.com/下载,资源在“文件”文件夹下。

首先打开二进制编辑器(我的光盘资源中有此软件),在软件中输入如下字符:

接着从0000:0090开始后面全都是00,一直输入到最后0016:8000。输入00的时候可以复制粘贴加快速度。

其中1F01400位置有些部分不全为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指令的汇编文件也让人看不懂,之后的汇编代码虽然更加清晰了,但也就信息显示部分能看看。但这仅仅这是开始,后面的难度慢慢增加,希望大家都能坚持学习,学有所获!

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值