30天自製作業系統第3天harib00d

2021-10-03 03:55:46 字數 4154 閱讀 6966

harib00d

準備材料(windows環境)

開始實驗

在tolset資料夾下建立子檔案俠harib00d;

開啟記事本,輸入以下**並另存為 !cons_nt.bat檔案(windows 批處理),存放在harib00d資料夾中;

cmd.exe
ps:當然也可以直接使用 win + r 快捷鍵也可以,不過最好還是建立乙個比較好。因為以後開啟時不需要再麻煩了。

開啟 vc code 建立 ipl.nas 檔案,輸入以下**,也存放的harib00d中;

; haribote-ipl

; tab=4

cyls equ 10 ; 要讀到什麼程度

org 0x7c00 ; 啟動裝載程式

; 以下記述用於標準fat12格式軟盤

jmp entry

db 0x90

db "haribote" ; 磁碟名稱(可以是任意字串)

dw 512 ; 每個扇區的大小(必須是512)

db 1 ; 簇的大小(必須為乙個扇區)

dw 1 ; fat12的起始位置(一般從第乙個扇區開始

db 2 ; fat的個數(必須為2)

dw 224 ; 根目錄的大小(一般設成224項)

dw 2880 ; 該磁碟的大小(必須是2880扇區)

db 0xf0 ; 該磁碟的種類(必須是0xf0

dw 9 ; fat的長度(必須是9扇區)

dw 18 ; 乙個磁軌有幾個扇區(必須是18)

dw 2 ; 磁頭數(必須是2)

dd 0 ; 不使用分割槽,必須是0

dd 2880 ; 磁碟大小

db 0,0,0x29 ; 意義不明固定

dd 0xffffffff ; (可能是)卷標號碼

db "hariboteos " ; 磁碟的名稱(11位元組)

db "fat12 " ; 磁碟格式名稱(8位元組)

resb 18 ; 先空出18位元組

; 程式主體

entry:

mov ax,0 ; 初始化暫存器

mov ss,ax

mov sp,0x7c00

mov ds,ax

; 坊磁碟

mov ax,0x0820

mov es,ax

mov ch,0 ; 柱面 0

mov dh,0 ; 磁頭 0

mov cl,2 ; 扇區 2

readloop:

mov si,0 ; 記錄失敗次數的暫存器

retry:

mov ah,0x02 ; ah=0x02 : 讀入磁碟

mov al,1 ; 1 個扇區

mov bx,0

mov dl,0x00 ; a 驅動器

int 0x13 ; 呼叫磁碟bios

jnc next ; 沒出錯時跳轉到next

add si,1 ; si 加 1

cmp si,5 ; 比較 si 與 5

jae error ; si >= 5 時,跳轉到error

mov ah,0x00

mov dl,0x00 ; a 驅動器

int 0x13 ; 重置驅動器

jmp retry

next:

mov ax,es ; 把記憶體位址後移0x200

add ax,0x0020

mov es,ax ; 因為沒有 add es,0x020 指令,所以這裡稍微繞個彎

add cl,1 ; cl 加 1

cmp cl,18 ; 比較 cl 與 18

jbe readloop ; 如果 cl <= 18,則跳轉至readloop

mov cl,1

add dh,1

cmp dh,2

jb readloop ; 如果 dh < 2, 則跳轉到readloop

mov dh,0

add ch,1

cmp ch,cyls

jb readloop ; 如果 ch < cyls,則跳轉至readloop

; 雖然讀完了,但是因為暫時沒有要做的事所以停止等待指令

fin:

hlt ; 讓cpu停止,等待指令

jmp fin ; 無限迴圈

error:

mov si,msg

putloop:

mov al,[si]

add si,1 ; si 加 1

cmp al,0

je fin

mov ah,0x0e ; 顯示乙個文字

mov bx,15 ; 指定字元顏色

int 0x10 ; 呼叫顯示卡bios

jmp putloop

msg:

db 0x0a, 0x0a ; 換行兩次

db "load error"

db 0x0a ; 換行

db 0

resb 0x7dfe-$ ; 重複0x00一直到0x7dfe

db 0x55, 0xaa

開啟記事本,輸入以下**,另存為 make.bat, 同樣放到harib00d中;

..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
建立 makefile,並輸入以下**並存放到harib00d中;

toolpath = ../z_tools/

make = $(toolpath)make.exe -r

nask = $(toolpath)nask.exe

edimg = $(toolpath)edimg.exe

imgtol = $(toolpath)imgtol.com

copy = copy

del = del

# 預設操作

default :

$(make) img

# 檔案生成規則

ipl.bin : ipl.nas makefile

$(nask) ipl.nas ipl.bin ipl.lst

haribote.img : ipl.bin makefile

$(edimg) imgin:../z_tools/fdimg0at.tek \

wbinimg src:ipl.bin len:512 from:0 to:0 imgout:haribote.img

# 命令

asm :

$(make) ipl.bin

img :

$(make) haribote.img

run :

$(make) img

$(copy) haribote.img ..\z_tools\qemu\fdimage0.bin

$(make) -c ../z_tools/qemu

install :

$(make) img

$(imgtol) w a: haribote.img

clean :

-$(del) ipl.bin

-$(del) ipl.lst

src_only :

$(make) clean

-$(del) haribote.img

編譯及執行

雙擊 !cons_nt.bat,並在開啟的命令列中輸入 make run

vmware中執行結果,如下圖

ps: 結果就是這樣,因為本次實驗的目的是讀入 10 個柱面,而且什麼都沒輸出。

好的今天到這裡harib00d就張結束了,請大家多多支援!!!

30天自製作業系統 第3天

cf 進製標誌,1位暫存器 jc 若進製標誌是1,則跳轉 int 0x13 呼叫磁碟bios ah 0x00 系統復位 0x02 讀盤 0x03 寫盤 0x04 校驗 0x0c 尋道 al 處理物件的扇區數 ch 柱面號 0xff cl 扇區號 0 5位 柱面號 0x300 2 dh 磁頭號 dl ...

《30天自製作業系統》第4天

1.c語言與畫面顯示的練習 彙編與c 語言結合時能自由使用的寄存區只有 eax,ecx,edx3 個,其他寄存區用於記憶非常重要的值,只能讀不能寫。intel系列 cpu 8086 80186 286 386 486 pentium pentiumpro pentium2 pentium3 pent...

《30天自製作業系統》第6天

1.pic 可程式設計中斷控制器 pic 連線 8個中斷訊號,監視輸入管腳的 8個中斷訊號。主 pic irq0 irq7 irq2 連線到從 pic irq8 irq15 中斷發生後,cpu 命令pic傳送2 個位元組的資料,格式是 0xcd 0 cpu收到2 個位元組後把資料當做指令來執行。0x...