[原创]使用masm8写磁盘引导程序的思考
〈〈自己动手写操作系统〉〉一书,相信不少人看过,其中作者使用nasm汇编工具写了一个很简单的磁盘引导程序,其中的原理写的也很明白。最近我想用masm8。0写一个。毕竟微软目前很少有人可以与之相抗衡,学习masm的人应当多一些,当程序写大了,更多人的会更容易理解。如果你看过Linux 0。98版本的引导程序,你就知道差不多大约300多行吧,加上系统的head.s,和kernel.s也就有一千左右吧。也这是我想用masm8。0写一个的原因。但多次实验,结果不理想。第一:在masm8。0中程序的入口是一定要有的。因此编译后的程序二进制文件,在其程序的开头会加入一些代码(由编译器或者是链接器)。这和nasm生成的二进制文件一开头就是二进制的机器操作指令极大的不一样。
第二:就是如何定义最后一个字为:aa55h的问题。(aa55h是引导区的启动标识)在nasm中很简单,就是在最后放一条语句: dw 0xaa55 这就ok了。但在masm中则一定要以end 结束,或以 end main (main为入口过程),这时生的二进制则不是以aa55h结束的。为了能让它以aa55h结束,我试着直接修改二进制文件,结果也不行。:(
第三:masm编译后生成*.obj文件,其中经过查有一些很特殊的东西(我想可能是用于link使用的),即使都用汇编指令不用库文件(毕竟在一台裸机,它是不知道有微软的),也是如此。而nasm则会生成很纯的二进制机器指令。
最后,(个人观点)微软为了保持其统治地位,在幕后做了很多我们所不为人知的事情。而且masm8.0也不在是真正意义上的汇编了,在NT下你是不能直接访问硬件,而是用WIN32API函数,以前DOS,WIN95/98/ME是可以的,这主要是为了安全。
所以,感觉用masm8.0写一个磁盘引导序有点困难。(或有点不太可能)。虽然网上也有其他人用masm写的,但经我试过之后,还没有找到正确的。希望能起点抛砖引玉的作用。