13 Read the disk
首先要知道 hard disk 長怎樣、如何指定讀取哪個位置的資料,參考Day 3 進入 32 bit 模式並導入 C 語言。
使用 BIOS 讀取 hard disk
BIOS 提供我們讀取 hard disk 的 routine,讓我們不用煩惱 chip 跟 bus 等硬體對讀取 hard disk 資料的問題。(BIOS 提供了一層抽象!)
要 call 這個 routine 是 intterupt 0x13
並且將 ah
設為 0x02
。另外必須設置幾個 register 的值,好讓 BIOS 知道我們要讀取哪些 sector、要把讀到的資料放到 memory 的哪個位置:
dl
:第幾個 drive,由 0 開始ch
:cylinder 編號dh
:磁片的哪一面,由 0 開始cl
:第幾個 sector,由 1 開始al
:讀取幾個 sectores
:預設存放資料的 memory 位置的 segment registerbx
:預設存放資料的 memory 位置的 offset
BIOS 可能因為各種原因沒有成功讀取資料,因此我們需要處理錯誤的狀況。BIOS 在讀取有錯誤時會將 carry flag set 起來,另外在 al
register 會有實際讀取多少 sector 的值。我們可以用以下程式來處理讀取 disk 的相關錯誤:
1 | ... |
read hard disk routine
isk_load.asm
1 | disk_load: |
print_hex.asm
1 | ; prints the value of DX as hex. |
print_string.asm
1 | print_string: ; function name |
boot_sector_load_disk.asm
1 | [org 0x7c00] |