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了。

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