Write Your Own Operating System Tutorial(中文版) - Lesson 2: 着手我们第一张启动盘

 Lesson 2: 着手我们第一张启动盘


这一课,我们将学习如何在软盘上做一个启动程序。我们将从修改Microsoft DOS Boot Record开始。

对于我们来说,我们想做的是替换掉boot loader的代码而不改动启动扇区的其他数据。如果我们把那些数据修改成无效的东西,DOS和WINDOWS认不出这张盘了。WINDOWS会给出提示信息说这张软盘尚未格式化,于是你将不能访问盘上的文件。但是,我们可以把启动程序的代码改成我们想要的样子,只要我们不去碰其它数据,DOS和Windows仍将能够读写盘上的文件。

我们将留下第一条指令(jmp 0x3E),因为我们需要跳过那些引导记录的数据。所以我们可以从0x3E开始我们的修改。运行DOS的DEBUG程序,把软盘上的第一个扇区加载到以0开始的内存,然后输入:

-u 3E

察看那里的指令。现在我们可以来修改了。输入命令:

-a 3E

来开始加入汇编代码。提示符从连接线变成了我们所在位置的内存地址。输入下面的指令并且回车。

jmp 3E

这条指令将变成机器码放置在内存里,提示符变成了你输入的指令之后的有效内存地址。再输入一个回车退出汇编状态。在我的机器上整个过程看上去像这样:

-a 3E

0AFC:003E jmp 3E

0AFC:0040

-

段地址(我这里是0x0AFC)可能(也将会)和你机器上的不一样。甚至有可能位于DEBUG的不同区。现在输入反汇编命令,来看看你刚才打入的指令。

-u 3E

正如你看到的,第一条指令是我们的跳转指令。这会导致一个死循环。如果我们现在就退出DEBUG,我们做的修改将不会被保存,不过我们可以通过输入下面的命令来把经过我们修改的启动扇区写入磁盘。

-w 0 0 0 1


"write"命令和"load"命令使用相同的语法。它把从内存地址0开始的数据写如磁盘0从第一个扇区开始的地方,总共写一个扇区。在用write命令的时候请千万小心。这个命令可以被用来覆盖磁盘上的数据,从而导致数据损失。

现在,你可以用这张盘来启动了。当你用它启动时,BIOS将把第一个扇区载入内存,并且开始从扇区开始的地方执行命令。这是一条跳转至0x3E的指令。而那里也是跳转到0x3E的指令,于是这将永远继续下去。试一试!用这张盘启动。看上去什么都没有发生,计算机呆坐在那里什么都不干。但是,你崭新的“操作系统”已经在运行了。

好好好,我知道你在说什么,你想要证明你的代码确实在运行而没有把你的计算机搞得一团糟。想要做到那一步,我们将调用BIOS的函数(至少在一开始)。在我写这个的时候,你应该能够在http://users.win.be/W0005997/GI/biosref.html找到一份BIOS函数的小列表。稍长的关于软件中断的列表可以在http://burak1.virtualave.net/Interrup.txt找到。当然你得记住,有些中断是BIOS调用,而有些是MS-DOS调用。后者现在不能使用,因为MS-DOS没有运行。在使用它们之前你将不得不自己实现那些函数。

我们将使用中断0x10的0x0E函数,来在屏幕上写一个字符。寄存器需要设成下面的值。

AH = 0x0E

AL = ASCII code of the character to be printed

BL = color/style of character

 

现在,重复这一课的指令,不过不要像上次那样输入一个跳转指令,这次输入下面的。

-a 3E

0AF6:003E mov ah, 0e

0AF6:0040 mov al, 48

0AF6:0042 mov bl, 07

0AF6:0044 int 10

0AF6:0046 jmp 46

0AF6:0048

-

 

首先我们把AH设为0,AL设成0x48(ASCII中代表‘H’),BL为7(黑屏白字的颜色代码),然后我们调用负责显示控制的中断0x10。像以前一样,最后一条指令产生了一个死循环,所以就在那里结束了。存盘(-w 0 0 0 1)并且试着用它来启动。这次你能在系统挂机前在屏幕上看到字母“h”。

稍许欣赏一下这个。你可以重复输出字符的代码,来输出一个短语,你也可以试试其它的软中断。如果你完成了,继续我们的下一课,我们将使用一个汇编语言编译器,而不再使用DEBUG了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章