3 初次体验汇编程序
好,现在就让我们马上来写一个汇编程序,用它来生成一个跟刚才完全一样的helloos.img吧。我们这次使用的汇编语言编译器是笔者自己开发的,名为“nask”,其中的很多语法都模仿了自由软件里享有盛名的汇编器“NASM”,不过在“NASM”的基础之上又提高了自动优化能力。
超长的源代码
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 (为节省纸张,这里省略中间的18万4314行) DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
我们使用复制粘帖的方法,就可以写出这样一个超长的源代码来,将其命名为“helloos.nas”,并保存在helloos0中。仔细看一下就能发现这个文件内容与我们用二进制编辑器输入的内容是一模一样的。
接着,我们用“! cons_nt.bat”或是“! cons_9x.bat”(我们在前面已经说过,要根据Windows的版本决定用哪一个。以后每次都这样解释一遍的话比较麻烦,所以我们就将它简写为!cons好了)打开一个命令行窗口(console),输入以下指令(提示符部分不用输入):
提示符>..\z_tools\nask.exe helloos.nas helloos.img
这样我们就得到了映像文件helloos.img。
好,我们的第一个汇编语言程序就这样做成了!……不过这么写程序也太麻烦了,要做个18万行的程序,不但浪费时间,还浪费硬盘空间。与其这样还不如用二进制编辑器呢,不用输入“0x”、“, ”什么的,还能轻松一点。
■■■■■
其实要解决这个问题并不难,如果我们不只使用DB指令,而把RESB指令也用上的话,就可以一下将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
我们自己动手输入这段源程序比较麻烦,所以笔者把它放在附带光盘的projects\01_day\helloos1目录下了。大家只要把helloos1文件夹复制粘帖到tolset文件夹里就可以了。之前的helloos0文件夹以后就不用了,我们可以把它删除,也可以放在那里留作纪念。顺便说一下,笔者将helloos0文件夹名改为了helloos1,删掉了其中没用的文件,新建并编辑了需要用到的文件,这样就做出了新的helloos1文件夹。操作系统就是这样一点一点地成长起来的。
每次进行汇编编译的时候,我们都要输入刚才的指令,这太麻烦了,所以笔者就做了一个批处理文件asm.bat。有了这个批处理文件,我们只要在用“! cons”打开的命令行窗口里输入“asm”,就可以生成helloos.img文件。在用“asm”作成img文件后,再执行“run”指令,就可以得到与刚才一样的结果。
■■■■■
DB指令是“define byte”的缩写,也就是往文件里直接写入1个字节的指令。笔者喜欢用大写字母来写汇编指令,但小写的“db”也是一样的。
在汇编语言的世界里,这个指令是程序员的杀手锏,也就是说只要有了DB指令,我们就可以用它做出任何数据(甚至是程序)。所以可以说,没有用汇编语言做不出来的文件。文本文件也好,图像文件也好,只要能叫上名的文件,我们都能用汇编语言写出来。而其他的语言(比如C语言)就没有这么万能。
RESB指令是“reserve byte”的略写,如果想要从现在的地址开始空出10个字节来,就可以写成RESB 10,意思是我们预约了这10个字节(大家可以想象成在对号入座的火车里,预订了10个连号座位的情形)。而且nask不仅仅是把指定的地址空出来,它还会在空出来的地址上自动填入0x00,所以我们这次用这个指令就可以输出很多的0x00,省得我们自己去写18万行程序了,真是帮了个大忙。
这里还要说一下,数字的前面加上0x,就成了十六进制数,不加0x,就是十进制数。这一点跟C语言是一样的。