即便是非常袖珍的程序,也有可能遇到不能正确运行的情况,对此你一定并不惊讶,谁都可能少写一个标点,或者在一个小小的逻辑问题上犯迷糊。好在我们可以调试,通过调试,可以发现错误,让程序日臻完美。但是对于操作系统这样的特殊程序,我们没有办法用普通的调试工具来调试。可是,哪怕一个小小的Boot Sector,我们也没有十足的把握一次就写好,那么,遇到不能正确运行的时候该怎么办呢?在屏幕上没有看到我们所要的东西,甚至于机器一下子重启了,你该如何是好呢?
每一个问题都是一把锁,你要相信,世界上一定存在一把钥匙可以打开这把锁。你也一定能找到这把钥匙。
一个引导扇区代码可能只有20行,如果Copy&Paste的话,10秒钟就搞定了,即便自己敲键盘抄一遍下来,也用不了10分钟。可是,在遇到一个问题时,如果不小心犯了小错,自己到运行时才发现,你可能不得不花费10个10分钟甚至更长时间来解决它。笔者把这20行的程序称做水面以上的冰山,而把你花了数小时的时间做的工作称做水面下的冰山。
古人云:“授之以鱼,不如授之以渔。”本书将努力将冰山下的部分展示给读者。这些都是笔者经历了痛苦的摸索后的一些心得,这些方法可能不是最好的,但至少可以给你提供一个参考。
好了,以Boot Sector为例,你可以想像得到,将来我们一定会对这20行进行扩充,最后得到200行甚至更多的代码,我们总得想一个办法,让它调试起来容易一些。其实很容易,我们只要把“org
nasm boot.asm –o boot.com
好了,一个易于执行和调试的Boot Sector就制作完毕了。调试.COM文件可能让你仿佛一下子回到了20世纪,没关系,怀旧一下感觉还是蛮不错的。
Turbo Debugger是一个不错的调试工具,“图形化”界面,全屏操作,用起来感觉和一个“严重”精简后的Windows差不多J。
调试完之后要放到软盘上进行试验,我们需要再把0100h改成
代码1-2 节自\chapter1\b\boot.asm
;%define _BOOT_DEBUG_ ; 做 Boot Sector 时一定将此行注释掉!
; 将此行打开后用 nasm Boot.asm -o Boot.com
; 做成一个.COM文件易于调试
%ifdef _BOOT_DEBUG_
org 0100h ; 调试状态,做成 .COM 文件,可调试
%else
org
; 处并开始执行
%endif
这样一来,如果我们想要调试,就让第一行有效,想要做Boot Sector时,将它注释掉就可以了。
这里的预编译命令跟C差不多,就不用多解释了。
至此,你不但已经学会了如何写一个简单的引导扇区,更具备了扩充它的条件——知道如何排错,如何调试。这就好比从石器时代走到了铁器时代,宽阔的道路展现在眼前,运用工具,你无所不能。
如果说开始我们还是在黑暗中摸索,到现在为止,我们至少已经看到了光亮,我们有信心将Boot Sector进行不断扩充,让它变成一个真正的操作系统的一部分。






