編程:實現從軟盤啟動進入自己寫的超迷你“操作系統”
- 超迷你“操作系統”,功能:在屏幕中間顯示 hello world!
運行:編譯假丧、連接双揪、調試源代碼
進入 虛擬機XP
打開 CMD.EXE
確認軟驅插入軟盤
將軟盤格式化
[插入 軟盤 具體步驟參考本文最下方測試部分的圖解]
1 開機 遇到提示請插入軟盤 向虛擬機XP插入軟盤.png
2 軟盤使用之前需要進行格式化.png
※※※※※※※※※※※※※※※※※※※※※※※※※※
編譯、連接包帚、運行 【引導程序】
masm bootcode.asm
link bootcode.obj
(直接運行)bootcode.exe
(調試模式)debug bootcode.exe
完成后這個步驟后渔期,軟盤A: 0面 0道 1扇區(qū),被寫入 [操作系統引導程序 boot ]渴邦;
※※※※※※※※※※※※※※※※※※※※※※※※※※
編譯疯趟、連接、運行 【任務程序】
masm taskcode.asm
link taskcode.obj
(直接運行)taskcode.exe
(調試模式)debug taskcode.exe
完成這個步驟后谋梭,軟盤A: 0面 0道 2扇區(qū)迅办,被寫入[任務程序 task];
※※※※※※※※※※※※※※※※※※※※※※※※※※
關機
關機狀態(tài)下 設置 虛擬機XP 從 [軟盤] 啟動
[設置 從軟盤啟動 具體步驟參考本文最下方測試部分的圖解]
3 關機 對軟盤 勾選 啟動時連接 虛擬機XP將從軟盤啟動操作系統.png
4 勾選好 軟盤 啟動時連接后章蚣,再開機站欺,點擊開啟此虛擬機.png
※※※※※※※※※※※※※※※※※※※※※※※※※※
開機
※※※※※※※※※※※※※※※※※※※※※※※※※※
以下都是自動發(fā)生的姨夹,不需要人的操作了
CPU 自動
將 軟盤A: 0面 0道 1扇區(qū) 的 [引導程序 boot ]
讀到 內存 0000:7C00H ,
并且設置CS:IP = 0000:7C00H矾策,立刻跳轉磷账,
相當于 自動 開始執(zhí)行 [引導程序 boot ]
[引導程序 boot ]
0、它知道 [task] 就放在 0面0道2扇區(qū)贾虽;
1逃糟、會將[任務程序 task ] 放到內存 0000:7E00H 開始;
2蓬豁、然后 將CS:IP設置為 0000:7E00H绰咽,使得CPU在讀扇區(qū)工作結束之后,
立刻跳轉到 CS:IP = 0000:7E00h 開始執(zhí)行[任務程序]地粪。
[任務程序 task]
完成 hello world! 在屏幕上的顯示取募。
備注:
1個扇區(qū)有512個字節(jié)(KB),
十進制 512D = 十六進制 200H 蟆技,
因此玩敏,
0000:7C00H ~ 0000:7DFFH ,這個512個內存單元用來放 boot质礼,
0000:7E00H 開始的內存單元 放 task .
完整源碼
引導程序 boot
- 引導程序
bootcode.asm
旺聚,包括 :引導程序boot 本體 以及 將其安裝到軟盤的安裝步驟;
- 安裝步驟眶蕉,是先將 boot本體 的機器碼 全部復制到
開辟的內存空間data段
中砰粹,然后調用 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)
; 引導程序 boot 將被安裝到內存data開始
; 引導程序的功能: 1.讀扇區(qū) 將 任務程序task 0面0道2扇區(qū) 寫到內存 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 中斷
; 將內存 data 處的引導程序 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
任務程序 task
- 任務程序
taskcode.asm
造挽,包括 :任務程序task 本體 以及 將其安裝到軟盤的安裝步驟伸眶;
- 安裝步驟,是先將 task本體 的機器碼 全部復制到
開辟的內存空間data段
中刽宪,然后調用 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 中斷
; 將內存 data 處的任務程序
; 寫入 軟盤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
測試:從軟盤啟動操作系統(圖解)
- 結合 運行:編譯界酒、連接圣拄、調試源代碼部分的說明來看
1 開機 遇到提示請插入軟盤 向虛擬機XP插入軟盤.png
3 關機 對軟盤 勾選 啟動時連接 虛擬機XP將從軟盤啟動操作系統.png
4 勾選好 軟盤 啟動時連接后,再開機毁欣,點擊開啟此虛擬機.png