上一期
我講述了如何在軟盤的啟動扇區寫一些代碼
然後再從軟盤啟動的過程
制作好一個啟動扇區
在切換到保護模式之前
我們還應該知道如何使用BIOS中斷
BIOS中斷是一些由BIOS提供的
為了使操作系統的創建更容易的低級程序
在本文中
我們將學習處理BIOS的中斷
為什麼要用BIOS
BIOS會把啟動扇區拷貝至RAM中
並且執行這些代碼
除此之外
BIOS還要做很多其它的事情
當一個操作系統剛開始啟動時
系統中並沒有顯卡驅動
軟盤驅動等任何驅動程序
因此
啟動扇區中不可能包含任何一個驅動程序
我們要采取其它的途徑
這個時候
BIOS就可以幫助我們了
BIOS中包含有各種可以使用的程序
包括檢測安裝的設備
控制打印機
計算內存大小等用於各種目的的程序
這些程序就是所說的BIOS中斷
如何調用BIOS中斷
在一般的程序設計語言中
函數的調用是一件非常容易的事情
比如在C語言中
如果有一個名為display的程序
它帶有兩個參數
其中參數noofchar表示顯示的字符數
參數attr表示顯示字符的屬性
那麼要調用它
只需給出程序的名稱即可
對於中斷的調用
我們使用的是匯編語言中的int指令
比如
在C語言中要顯示一些東西時
使用的指令如下所示
display(nofchar
attr)
而使用BIOS時
要實現相同功能使用的指令如下
int
x
如何傳遞參數
在調用BIOS中斷之前
我們需要先往寄存器中送一些特定的值
假設要使用BIOS的中斷
h
該中斷的功能是把數據從軟盤傳送至內存之中
在調用該中斷之前
要先指定拷貝數據的段地址
指定驅動器號
磁道號
扇區號
以及要傳送的扇區數等等
然後
就要往相應的寄存器送入相應的值
在進行下面的步驟前
讀者有必要對這一點有比較明確地認識
此外
一個比較重要的事實是同一個中斷往往可以實現各種不同的功能
中斷所實現的確切功能取決於所選擇的功能號
功能號一般都存在ah寄存器之中
比如中斷
h可以用於讀磁盤
寫磁盤等功能
如果把
送入ah寄存器中
那麼中斷選擇的功能就是寫磁盤
如果把
送入ah寄存器中
選擇的功能則是讀磁盤等
我們要做的事情
這次我們的源代碼由兩個匯編語言程序和一個C程序組成
第一個匯編文件是引導扇區的代碼
在引導扇區中
我們寫的代碼是要把軟盤中第二扇區拷貝至內存段的
x
處(地址是
x
即偏移地址為
)
這時我們需要使用BIOS的中斷
h
這時啟動扇區的代碼就會把控制權轉移至
x
處
在第二個匯編文件中
代碼會使用BIOS中斷
h在屏幕上顯示一個信息
C程序實現的功能則是把可執行的文件
拷貝至啟動扇區
把可執行的文件
拷貝至軟盤的第二扇區
啟動扇區代碼
使用中斷
h
啟動扇區把軟盤第二扇區裡的內容加載至內存的
x
處(段地址為
x
)
下面的代碼是用於實現這一目的的代碼
將其保存至文件sbect
s中
LOC
=
x
entry start
start:
mov ax
#LOC
mov es
ax
mov bx
#
mov dl
#
mov dh
#
mov ch
#
mov cl
#
mov al
#
mov ah
#
int
x
jmpi
#LOC
上面代碼第一行類似於一個宏
接下去的兩行則是把值
x
加載至es寄存器中
這是軟盤上第二扇區代碼將拷貝到的地方(第一扇區是啟動扇區)
這時
把段內的偏移設為
接下來把驅動器號送入dl寄存器中
其中磁頭號送入dl寄存器中
磁道號送入ch寄存器中
扇區號送入cl寄存器中
扇區數送入al寄存器之中
我們想要實現的功能是把扇區
磁道號為
驅動器號為
的內容送至段地址
x
處
所有這些參數都和
MB的軟盤相對應
把
送入ah寄存器中
是選擇了由中斷
h提供的相應功能
即實現從軟驅轉移數據的功能
最後調用中斷
h
並且轉至偏移為
的段地址
x
處
第二個扇區的代碼
第二個扇區中的代碼如下所示(把這些代碼保存至文件sbect
s之中)
entry start
start:
mov ah
#
x
xor bh
bh
int
x
mov cx
#
mov bx
#
x
mov bp
#mymsg
mov ax
#
x
int
x
loop
: jmp loop
mymsg:
byte
ascii
Operating System is Loading
上面代碼將被加載至段地址為
x
處
並且被執行
在這段代碼中
使用了中斷
h來獲取目前的光標位置
然後顯示信息
從第
行到第
行用於得到目前光標的位置
在此中斷
h選用的是功能
然後
清除了bh寄存器的內容
並把字符串送至ch寄存器中
在bx中
我們送入了頁碼及顯示的屬性
此處
我們想要在黑背景上顯示白色的字符
然後
把要顯示字符的地址送到bp之中
信息由兩個字節組成
其值分別為
的
它們分別對應回車和LF(換行)的ASCⅡ值
接下來是一個由
個字符組成的串
在下面實現的功能是輸出字符串然後移動光標
最後是調用中斷
然後進入循環
C程序代碼
C程序的源代碼如下所示
將其存儲為write
c文件
#include
/* unistdh needs this */
#include /* contains read/write */
#include
int main()
{
char boot_buf[];
int floppy_desc file_desc;
file_desc = open(/bsect O_RDONLY);
read(file_desc boot_buf );
close(file_desc);
boot_buf[] = x;
boot_buf[] = xaa;
floppy_desc = open(/dev/fd O_RDWR);
lseek(floppy_desc SEEK_SET);
write(floppy_desc boot_buf );
file_desc = open(/sect O_RDONLY);
read(file_desc boot_buf );
close(file_desc);
lseek(floppy_desc SEEK_SET);
write(floppy_desc boot_buf );
close(floppy_desc);
}
在上一期中我曾經介紹過如何操作能啟動的軟盤現在這一個過程稍微有點不同首先把由bsects編譯出來的可執行文件bsect拷貝至軟盤的啟動扇區然後再把由sects產生的可執行文件sect拷貝至軟盤的第二個扇區
把上述文件置於同一目錄之下然後分別對其進行編譯方法如下所示
as bsects o bsecto
ld d bsecto o bsect
對sects文件重復以上的操作得出可執行文件sect編譯writec插入軟盤後執行write文件命令如下所示
cc writec o write
/write
下一步我們要做的事情
從軟盤啟動以後可以看到顯示出來的字符串這是使用了BIOS中斷來完成的下一期要做的事情是在這個操作系統中實現實模式向保護模式的轉換
From:http://tw.wingwit.com/Article/program/Oracle/201311/16947.html