上一期,我講述了如何在軟盤的啟動扇區寫一些**,然後再從軟盤啟動的過程。製作好乙個啟動扇區,在切換到保護模式之前,我們還應該知道如何使用bios中斷。bios中斷是一些由bios提供的、為了使作業系統的建立更容易的低階程式。在本文中,我們將學習處理bios的中斷。
為什麼要用bios
bios會把啟動扇區拷貝至ram中,並且執行這些**。除此之外,bios還要做很多其它的事情。當乙個作業系統剛開始啟動時,系統中並沒有顯示卡驅動、軟盤驅動等任何驅動程式。因此,啟動扇區中不可能包含任何乙個驅動程式,我們要採取其它的途徑。這個時候,bios就可以幫助我們了。bios中包含有各種可以使用的程式,包括檢測安裝的裝置、控制印表機、計算記憶體大小等用於各種目的的程式。這些程式就是所說的bios中斷。
如何呼叫bios中斷
在一般的程式語言中,函式的呼叫是一件非常容易的事情。比如在c語言中,如果有乙個名為display的程式,它帶有兩個引數,其中引數noofchar表示顯示的字元數,引數attr表示顯示字元的屬性。那麼要呼叫它,只需給出程式的名稱即可。對於中斷的呼叫,我們使用的是組合語言中的int指令。
比如,在c語言中要顯示一些東西時,使用的指令如下所示:
display(nofchar,attr);
而使用bios時,要實現相同功能使用的指令如下:
int 0x10
如何傳遞引數
在呼叫bios中斷之前,我們需要先往暫存器中送一些特定的值。假設要使用bios的中斷13h,該中斷的功能是把資料從軟盤傳送至記憶體之中。在呼叫該中斷之前,要先指定拷貝資料的段位址,指定驅動器號、磁軌號、扇區號,以及要傳送的扇區數等等。然後,就要往相應的暫存器送入相應的值。在進行下面的步驟前,讀者有必要對這一點有比較明確地認識。
此外,乙個比較重要的事實是同乙個中斷往往可以實現各種不同的功能。中斷所實現的確切功能取決於所選擇的功能號,功能號一般都存在ah暫存器之中。比如中斷13h可以用於讀磁碟、寫磁碟等功能,如果把3送入ah暫存器中,那麼中斷選擇的功能就是寫磁碟;如果把2送入ah暫存器中,選擇的功能則是讀磁碟等。
我們要做的事情
這次我們的源**由兩個組合語言程式和乙個c程式組成。第乙個彙編檔案是引導扇區的**。在引導扇區中,我們寫的**是要把軟盤中第二扇區拷貝至記憶體段的0x500處(位址是0x5000,即偏移位址為0)。這時我們需要使用bios的中斷13h。這時啟動扇區的**就會把控制權轉移至0x500處。在第二個彙編檔案中,**會使用bios中斷10h在螢幕上顯示乙個資訊。c程式實現的功能則是把可執行的檔案1拷貝至啟動扇區,把可執行的檔案2拷貝至軟盤的第二扇區。
啟動扇區**
使用中斷13h,啟動扇區把軟盤第二扇區裡的內容載入至記憶體的0x5000處(段位址為0x500)。下面的**是用於實現這一目的的**,將其儲存至檔案sbect.s中。
loc1=0x500entry start
start:
mov ax,#loc1
mov es,ax
mov bx,#0
mov dl,#0
mov dh,#0
mov ch,#0
mov cl,#2
mov al,#1
mov ah,#2
int 0x13
jmpi 0,#loc1
上面**第一行類似於乙個巨集。接下去的兩行則是把值0x500載入至es暫存器中,這是軟盤上第二扇區**將拷貝到的地方(第一扇區是啟動扇區)。這時,把段內的偏移設為0。
接下來把驅動器號送入dl暫存器中,其中磁頭號送入dl暫存器中,磁軌號送入ch暫存器中,扇區號送入cl暫存器中,扇區數送入al暫存器之中。我們想要實現的功能是把扇區2、磁軌號為0、驅動器號為0的內容送至段位址0x500處。所有這些引數都和1.44mb的軟盤相對應。
把2送入ah暫存器中,是選擇了由中斷13h提供的相應功能,即實現從軟碟機轉移資料的功能。
最後呼叫中斷13h,並且轉至偏移為0的段位址0x500處。
第二個扇區的**
第二個扇區中的**如下所示(把這些**儲存至檔案sbect2.s之中):
entry startstart:
mov ah,#0x03
xor bh,bh
int 0x10
mov cx,#26
mov bx,#0x0007
mov bp,#mymsg
mov ax,#0x1301
int 0x10
loop1: jmp loop1
mymsg:
.byte 13,10
.ascii 「operating system is loading......」
上面**將被載入至段位址為0x500處,並且被執行。在這段**中,使用了中斷10h來獲取目前的游標位置,然後顯示資訊。
從第3行到第5行用於得到目前游標的位置,在此中斷10h選用的是功能3。然後,清除了bh暫存器的內容,並把字串送至ch暫存器中。在bx中,我們送入了頁碼及顯示的屬性。此處,我們想要在黑背景上顯示白色的字元。然後,把要顯示字元的位址送到bp之中,資訊由兩個位元組組成,其值分別為13的10,它們分別對應回車和lf(換行)的ascⅱ值。接下來是乙個由29個字元組成的串;在下面實現的功能是輸出字串然後移動游標;最後是呼叫中斷,然後進入迴圈。
c程式**
c程式的源**如下所示,將其儲存為write.c檔案。
#include/* unistd.h needs this */
#include
/* contains read/write */
#include
int main()
在上一期中,我曾經介紹過如何操作能啟動的軟盤。現在這乙個過程稍微有點不同,首先把由bsect.s編譯出來的可執行檔案bsect拷貝至軟盤的啟動扇區。然後再把由sect2.s產生的可執行檔案sect2拷貝至軟盤的第二個扇區。
把上述檔案置於同一目錄之下,然後分別對其進行編譯,方法如下所示:
as86 bsect.s -o bsect.old86 -d bsect.o -o bsect
對sect2.s檔案重複以上的操作,得出可執行檔案sect2。編譯write.c,插入軟盤後執行write檔案,命令如下所示:
cc write.c -o write./write
下一步我們要做的事情
從軟盤啟動以後,可以看到顯示出來的字串。這是使用了bios中斷來完成的。下一期要做的事情是在這個作業系統中實現實模式向保護模式的轉換。
自己動手寫作業系統 二
自己動手寫作業系統 二 上一期 我講述了如何在軟盤的啟動扇區寫一些 然後再從軟盤啟動的過程。製作好乙個啟動扇區,在切換到保護模式之前,我們還應該知道如何使用bios中斷。bios中斷是一些由bios提供的 為了使作業系統的建立更容易的低階程式。在本文中,我們將學習處理bios的中斷。為什麼要用bio...
自己動手寫作業系統(二)
系統啟動流程簡單來說就是下面的順序 1.bios 開機主動執行的韌體,會認識到第乙個可開機的裝置 2.mbr 第乙個可開機裝置的第乙個扇區內的主引導分割槽塊,內包含引導引導程式 由stage1.asm編譯成的boot.bin被寫入mbr分割槽 3.引導引導程式 boot loader 一支可讀取核心...
自己動手寫作業系統
virtual pc 5.2 下 dos7.1 中 執行.com檔案相關問題 2009 09 09 12 55 剛才在進入dos後,編譯.asm檔案獲得.com檔案,但系統會出現 emm386 unrecoverable privileged operation error n9.press ent...