編程:實(shí)現(xiàn)從軟盤啟動進(jìn)入自己寫的超迷你“操作系統(tǒng)”
- 超迷你“操作系統(tǒng)”,功能:在屏幕中間顯示 hello world!
hello world!.png

從軟盤啟動操作系統(tǒng).png
運(yùn)行:編譯、連接、調(diào)試源代碼
進(jìn)入 虛擬機(jī)XP
打開 CMD.EXE
確認(rèn)軟驅(qū)插入軟盤
將軟盤格式化
[插入 軟盤 具體步驟參考本文最下方測試部分的圖解]
1 開機(jī) 遇到提示請插入軟盤 向虛擬機(jī)XP插入軟盤.png
2 軟盤使用之前需要進(jìn)行格式化.png
※※※※※※※※※※※※※※※※※※※※※※※※※※
編譯、連接、運(yùn)行 【引導(dǎo)程序】
masm bootcode.asm
link bootcode.obj
(直接運(yùn)行)bootcode.exe
(調(diào)試模式)debug bootcode.exe
完成后這個步驟后,軟盤A: 0面 0道 1扇區(qū),被寫入 [操作系統(tǒng)引導(dǎo)程序 boot ];
※※※※※※※※※※※※※※※※※※※※※※※※※※
編譯、連接、運(yùn)行 【任務(wù)程序】
masm taskcode.asm
link taskcode.obj
(直接運(yùn)行)taskcode.exe
(調(diào)試模式)debug taskcode.exe
完成這個步驟后,軟盤A: 0面 0道 2扇區(qū),被寫入[任務(wù)程序 task];
※※※※※※※※※※※※※※※※※※※※※※※※※※
關(guān)機(jī)
關(guān)機(jī)狀態(tài)下 設(shè)置 虛擬機(jī)XP 從 [軟盤] 啟動
[設(shè)置 從軟盤啟動 具體步驟參考本文最下方測試部分的圖解]
3 關(guān)機(jī) 對軟盤 勾選 啟動時連接 虛擬機(jī)XP將從軟盤啟動操作系統(tǒng).png
4 勾選好 軟盤 啟動時連接后,再開機(jī),點(diǎn)擊開啟此虛擬機(jī).png
※※※※※※※※※※※※※※※※※※※※※※※※※※
開機(jī)
※※※※※※※※※※※※※※※※※※※※※※※※※※
以下都是自動發(fā)生的,不需要人的操作了
CPU 自動
將 軟盤A: 0面 0道 1扇區(qū) 的 [引導(dǎo)程序 boot ]
讀到 內(nèi)存 0000:7C00H ,
并且設(shè)置CS:IP = 0000:7C00H,立刻跳轉(zhuǎn),
相當(dāng)于 自動 開始執(zhí)行 [引導(dǎo)程序 boot ]
[引導(dǎo)程序 boot ]
0、它知道 [task] 就放在 0面0道2扇區(qū);
1、會將[任務(wù)程序 task ] 放到內(nèi)存 0000:7E00H 開始;
2、然后 將CS:IP設(shè)置為 0000:7E00H,使得CPU在讀扇區(qū)工作結(jié)束之后,
立刻跳轉(zhuǎn)到 CS:IP = 0000:7E00h 開始執(zhí)行[任務(wù)程序]。
[任務(wù)程序 task]
完成 hello world! 在屏幕上的顯示。
備注:
1個扇區(qū)有512個字節(jié)(KB),
十進(jìn)制 512D = 十六進(jìn)制 200H ,
因此,
0000:7C00H ~ 0000:7DFFH ,這個512個內(nèi)存單元用來放 boot,
0000:7E00H 開始的內(nèi)存單元 放 task .
完整源碼
引導(dǎo)程序 boot
- 引導(dǎo)程序
bootcode.asm,包括 :引導(dǎo)程序boot 本體 以及 將其安裝到軟盤的安裝步驟; - 安裝步驟,是先將 boot本體 的機(jī)器碼 全部復(fù)制到
開辟的內(nèi)存空間data段中,然后調(diào)用BIOS int 13h中斷完成 寫扇區(qū);
assume cs:code
data segment
db 512 dup (0)
data ends
code segment
start: mov ax,cs
mov ds,ax
mov si, offset boot
mov ax,data
mov es,ax
mov di,0
mov cx,offset bootend - offset boot
cld
rep movsb
jmp short write
boot: jmp short bootstart
db 10 dup(0)
; 引導(dǎo)程序 boot 將被安裝到內(nèi)存data開始
; 引導(dǎo)程序的功能: 1.讀扇區(qū) 將 任務(wù)程序task 0面0道2扇區(qū) 寫到內(nèi)存 0000:7E00H;
; 2.將CS:IP指向 0000:7E00H
bootstart:
mov ax,cs
mov ss,ax
mov sp,10
mov ax,0
mov es,ax
mov bx,7E00H
mov al,1
mov ch,0
mov cl,2
mov dl,0
mov dh,0
mov ah,2
int 13h
mov bx,0
push bx
mov bx,7E00H
push bx
retf
bootend: nop
write:
; 利用 int 13H 中斷
; 將內(nèi)存 data 處的引導(dǎo)程序 boot
; 寫入 軟盤A 0面 0道 1扇區(qū)
mov ax,data
mov es,ax
mov bx,0
mov al,1
mov ch,0
mov cl,1
mov dl,0
mov dh,0
mov ah,3
int 13h
mov ax,4c00H
int 21H
code ends
end start
任務(wù)程序 task
- 任務(wù)程序
taskcode.asm,包括 :任務(wù)程序task 本體 以及 將其安裝到軟盤的安裝步驟; - 安裝步驟,是先將 task本體 的機(jī)器碼 全部復(fù)制到
開辟的內(nèi)存空間data段中,然后調(diào)用BIOS int 13h中斷完成 寫扇區(qū);
assume cs:code
data segment
db 512 dup (0)
data ends
code segment
start:
mov ax,cs
mov ds,ax
mov si, offset task
mov ax,data
mov es,ax
mov di,0
mov cx,offset taskend - offset task
cld
rep movsb
jmp short write
task: jmp short taskstart
db "hello world!"
taskstart: mov ax,cs
mov ds,ax
mov si,7E02h
mov ax,0b800H
mov es,ax
mov di,160*12+40*2
mov cx,12
mov ah,02H
hellos: mov al,[si]
mov es:[di],al
mov es:[di+1],ah
inc si
add di,2
loop hellos
taskend: nop
write:
; 利用 int 13H 中斷
; 將內(nèi)存 data 處的任務(wù)程序
; 寫入 軟盤A 0面 0道 2扇區(qū)
mov ax,data
mov es,ax
mov bx,0
mov al,1
mov ch,0
mov cl,2
mov dl,0
mov dh,0
mov ah,3
int 13h
mov ax,4c00h
int 21H
code ends
end start
測試:從軟盤啟動操作系統(tǒng)(圖解)
- 結(jié)合 運(yùn)行:編譯、連接、調(diào)試源代碼部分的說明來看

1 開機(jī) 遇到提示請插入軟盤 向虛擬機(jī)XP插入軟盤.png

2 軟盤使用之前需要進(jìn)行格式化.png

3 關(guān)機(jī) 對軟盤 勾選 啟動時連接 虛擬機(jī)XP將從軟盤啟動操作系統(tǒng).png

4 勾選好 軟盤 啟動時連接后,再開機(jī),點(diǎn)擊開啟此虛擬機(jī).png

5 再次開機(jī)后 進(jìn)入我們自己寫的操作系統(tǒng).png

6 如何回到虛擬機(jī)XP.png
