[084][匯編語言]編程:實(shí)現(xiàn)從軟盤啟動進(jìn)入自己寫的超迷你“操作系統(tǒng)”: 顯示 hello world!

編程:實(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,094評論 25 709
  • 前段時間給同事們講了《狂人日記》這篇小說,不覺間反而讓自己深陷了進(jìn)去,為魯迅先生的這種反思精神所折服。原因有三,其...
    二月寒雪閱讀 1,099評論 0 2
  • “生病了才知道誰最愛你,喝醉了才知道你最愛誰”,如果按照這句話來講,阿七想她是喜歡沈濤的。 算一算,阿七和沈濤相識...
    七淑閱讀 196評論 0 0

友情鏈接更多精彩內(nèi)容