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

2021-10-03 03:53:42 字數 3917 閱讀 6321

harib00c

準備材料(windows環境)

開始實驗

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

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

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

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

; haribote-ipl

; tab=4

org 0x7c00 ; 啟動裝載程式

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

jmp entry

db 0x90

db "haribote" ; 啟動區的名稱可是任意的字串

dw 512 ; 每個扇區(sector)的大小(必須為512位元組)

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

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

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

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

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

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

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

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

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

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

dd 2880 ; 磁碟大小

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

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

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

db "fat12 " ; 磁碟格式名稱

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

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

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, 同樣放到harib00c中;

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

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: 結果就是這樣,因為本次實驗的目的是試錯,而且什麼都沒輸出。

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

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...