日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

自己動(dòng)手寫操作系統(tǒng)( 三 )


而使用BIOS時(shí),要實(shí)現(xiàn)相同功能使用的指令如下:int 0x10
如何傳遞參數(shù)
在調(diào)用BIOS中斷之前,我們需要先往寄存器中送一些特定的值 。假設(shè)要使用BIOS的中斷13h,該中斷的功能是把數(shù)據(jù)從軟盤傳送至內(nèi)存之中 。在調(diào)用該中斷之前,要先指定拷貝數(shù)據(jù)的段地址,指定驅(qū)動(dòng)器號(hào)、磁道號(hào)、扇區(qū)號(hào),以及要傳送的扇區(qū)數(shù)等等 。然后,就要往相應(yīng)的寄存器送入相應(yīng)的值 。在進(jìn)行下面的步驟前,讀者有必要對(duì)這一點(diǎn)有比較明確地認(rèn)識(shí) 。此外,一個(gè)比較重要的事實(shí)是同一個(gè)中斷往往可以實(shí)現(xiàn)各種不同的功能 。中斷所實(shí)現(xiàn)的確切功能取決于所選擇的功能號(hào),功能號(hào)一般都存在ah寄存器之中 。比如中斷13h可以用于讀磁盤、寫磁盤等功能,如果把3送入ah寄存器中,那么中斷選擇的功能就是寫磁盤;如果把2送入ah寄存器中,選擇的功能則是讀磁盤等 。
我們要做的事情
這次我們的源代碼由兩個(gè)匯編語(yǔ)言程序和一個(gè)C程序組成 。第一個(gè)匯編文件是引導(dǎo)扇區(qū)的代碼 。在引導(dǎo)扇區(qū)中,我們寫的代碼是要把軟盤中第二扇區(qū)拷貝至內(nèi)存段的0x500處(地址是0x5000,即偏移地址為0) 。這時(shí)我們需要使用BIOS的中斷13h 。這時(shí)啟動(dòng)扇區(qū)的代碼就會(huì)把控制權(quán)轉(zhuǎn)移至0x500處 。在第二個(gè)匯編文件中,代碼會(huì)使用BIOS中斷10h在屏幕上顯示一個(gè)信息 。C程序?qū)崿F(xiàn)的功能則是把可執(zhí)行的文件1拷貝至啟動(dòng)扇區(qū),把可執(zhí)行的文件2拷貝至軟盤的第二扇區(qū) 。
啟動(dòng)扇區(qū)代碼
使用中斷13h,啟動(dòng)扇區(qū)把軟盤第二扇區(qū)里的內(nèi)容加載至內(nèi)存的0x5000處(段地址為0x500) 。下面的代碼是用于實(shí)現(xiàn)這一目的的代碼,將其保存至文件sbect.s中 。LOC1=0x500
entry 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
上面代碼第一行類似于一個(gè)宏 。接下去的兩行則是把值0x500加載至es寄存器中,這是軟盤上第二扇區(qū)代碼將拷貝到的地方(第一扇區(qū)是啟動(dòng)扇區(qū)) 。這時(shí),把段內(nèi)的偏移設(shè)為0 。接下來(lái)把驅(qū)動(dòng)器號(hào)送入dl寄存器中,其中磁頭號(hào)送入dl寄存器中,磁道號(hào)送入ch寄存器中,扇區(qū)號(hào)送入cl寄存器中,扇區(qū)數(shù)送入al寄存器之中 。我們想要實(shí)現(xiàn)的功能是把扇區(qū)2、磁道號(hào)為0、驅(qū)動(dòng)器號(hào)為0的內(nèi)容送至段地址0x500處 。所有這些參數(shù)都和1.44MB的軟盤相對(duì)應(yīng) 。把2送入ah寄存器中,是選擇了由中斷13h提供的相應(yīng)功能,即實(shí)現(xiàn)從軟驅(qū)轉(zhuǎn)移數(shù)據(jù)的功能 。最后調(diào)用中斷13h,并且轉(zhuǎn)至偏移為0的段地址0x500處 。
第二個(gè)扇區(qū)的代碼
第二個(gè)扇區(qū)中的代碼如下所示(把這些代碼保存至文件sbect2.s之中):entry start
start:
mov ah,#0x03
xor bh,bh
int 0x10mov cx,#26
mov bx,#0x0007
mov bp,#mymsg
mov ax,#0x1301
int 0x10loop1: jmp loop1
mymsg:
.byte 13,10
.ascii “Operating System is Loading......”
上面代碼將被加載至段地址為0x500處,并且被執(zhí)行 。在這段代碼中,使用了中斷10h來(lái)獲取目前的光標(biāo)位置,然后顯示信息 。從第3行到第5行用于得到目前光標(biāo)的位置,在此中斷10h選用的是功能3 。然后,清除了bh寄存器的內(nèi)容,并把字符串送至ch寄存器中 。在bx中,我們送入了頁(yè)碼及顯示的屬性 。此處,我們想要在黑背景上顯示白色的字符 。然后,把要顯示字符的地址送到bp之中,信息由兩個(gè)字節(jié)組成,其值分別為13的10,它們分別對(duì)應(yīng)回車和LF(換行)的ASCⅡ值 。接下來(lái)是一個(gè)由29個(gè)字符組成的串;在下面實(shí)現(xiàn)的功能是輸出字符串然后移動(dòng)光標(biāo);最后是調(diào)用中斷,然后進(jìn)入循環(huán) 。
C程序代碼
C程序的源代碼如下所示,將其存儲(chǔ)為write.c文件 。#include/* unistd.h needs this */
#include /* contains read/write */

推薦閱讀