30天自製作業系統 第3天

2021-10-05 16:00:46 字數 3097 閱讀 5793

cf:進製標誌,1位暫存器

jc:若進製標誌是1,則跳轉

int 0x13:

呼叫磁碟bios

ah = 0x00(系統復位)/ 0x02(讀盤)/ 0x03(寫盤)/ 0x04(校驗)/ 0x0c(尋道)

al = 處理物件的扇區數

ch = 柱面號 & 0xff

cl = 扇區號(0-5位)| (柱面號 & 0x300)>> 2

dh = 磁頭號

dl = 驅動器號

es:bx = 緩衝位址,讀取到記憶體的**,實際值為es * 16 + bx,相當於16進製制的es只左移了1位,但要加上4位的bx,最大能表達10ffef,而不是fffff

返回值:flags.cf=0:沒有錯誤,同時ah=0

flags.cf=1:有錯誤,同時錯誤**存入ah

記憶體的0x8000~0x81ff:512個位元組留給啟動區,要將啟動區的內容讀到這裡

記憶體的0x8200~0x83ff:存放磁碟其餘內容

指定記憶體位址時,會預設省略段暫存器ds,為避免錯誤寫入,要先將ds設為0

複製磁碟的乙個扇區內容到記憶體

es = 0x820

ch = 0

dh = 0

cl = 2

ah = 0x02

al = 1

bx = 0

dl = 0x00

int 0x13

jc error

jnc:若進製標誌等於0,則跳轉

jae:若大於等於,則跳轉

為避免讀取軟盤出錯,讀乙個扇區時要多讀幾次

初始化引數和原來一樣

si = 0

retry:

讀取磁碟

jnc fin

si += 1;比較si和5:jae error

重置驅動器:ah = 0x00;dl = 0x00;int 0x13;

jmp retry

jbe:小於等於時跳轉

讀取18個扇區

初始化引數和原來一樣

readloop:

si = 0

retry:

讀取磁碟和原來一樣

讀取磁碟後,jnc next

出錯的話和原來一樣

next:

es += 0x200 記憶體裝載位址向後移動512個位元組

cl += 1;比較cl和18:jbe readloop

jb:小於時跳轉

cyls equ 10:宣告乙個常數,cyls = 10

0x08200~0x34fff:用來儲存磁碟除啟動區的10個柱面內容

讀取10個柱面

前面和原來相同

next:

es += 0x200

cl += 1;比較cl和18:jbe readloop

cl = 1

dh += 1;比較dh和2;jb readloop

dh = 0

ch += 1;比較ch和10:jb readloop

製作包含啟動區和作業系統的完整映象檔案

編寫作業系統**.nas檔案

使用nask,將.nas檔案編譯為二進位制檔案,生成.sys檔案

使用edimg,使用啟動區二進位制檔案製作映象檔案,並將作業系統二進位制檔案複製進該映象檔案,生成.img檔案

映象檔案的0x002600附近儲存了作業系統檔案的名稱

映象檔案的0x004200附近儲存了作業系統檔案的具體內容

磁碟內容被裝載到記憶體的0x8000開始的位置,因此作業系統的內容從記憶體的0xc200位置開始

作業系統完成執行流程

啟動區**最後加上 jmp 0xc200

作業系統**開頭加上 org 0xc200

int 0x10:

切換顯示模式

ah = 0x00

al = 0x03(16色字元模式,80x25)/ 0x12(vga圖形模式,640x480x4位彩色模式,4面儲存模式)/ 0x13(vga模式,320x200x8位彩色模式,調色盤模式)/ 0x6a(擴充套件vga圖形模式,800x600x4位彩色模式,4面儲存模式)

返回值:無

設定完成後,0x000a000~0xaffff就成為了視訊記憶體位址,修改這一段記憶體的值會改變螢幕的畫素

系統切換到32位模式之後,就再也不能呼叫bios函式了,因此需要bios完成的工作要放在切換模式之前

int 0x16:

獲取鍵盤指示燈狀態

ah = 0x02

int 0x16

設定完成後,al的值即為指示燈狀態

使用c語言編寫作業系統:

在作業系統的組合語言檔案中新增了很多內容,但需要以後再講解

c語言變為二進位制檔案:

使用cc1(c語言編譯器),從c語言檔案生成.gas檔案(gas組合語言的源程式,和nask組合語言不相容)

使用gas2nash,從.gas生成.nas(將gas組合語言的**轉換為nask組合語言的**)

使用nask,從.nas生成.obj(由c語言生成的一種特殊的機器語言檔案,可以與其他.obj檔案鏈結起來實現對c語言功能上的補充)

使用obj2bim,從.obj生成.bim(二進位制映像檔案,為了做成完整的機器語言檔案,將必要的目標檔案全部鏈結上)

使用bim2hrb,從.bim生成.hrb(為了使生成的機器語言能實際使用,還需要根據作業系統要求新增檔案頭、壓縮等,.hrb是作者自己寫的一種檔案格式)

製作作業系統檔案:

使用nask,將作業系統的組合語言.nask部分的檔案編譯而二進位制檔案.bin

將c語言變為二進位制檔案.hrb

使用windows的複製指令,將彙編的二進位制檔案.bin和c語言的二進位制檔案.hrb簡單拼接起來,生成.sys檔案

ret:返回指令,呼叫該函式前會自動儲存正在執行的位置,函式執行完後呼叫ret,會自動找到呼叫本函式之前指定到的位置,然後繼續執行

c語言呼叫組合語言:

編寫組合語言**:

使用wcoff目標檔案模式

使用32位模式

宣告源檔名

宣告本檔案包含的函式名

[section .text]

_函式名:

retc語言**:

宣告組合語言寫成的函式,不需要加_

最近又要趕**。。先鴿乙個月了。。

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

30天自製作業系統 第0天

hello os tab 4 標準fat12格式軟盤專用 db 0xeb 0x4e 0x90 db helloipl 啟動區的名稱 可為任意字串 dw 512 每個扇區的大小 必須為512位元組 db 1 簇的大小 必須為1個扇區 dw 1 fat的起始位置 一般從第乙個扇區開始 db 2 fat的...