本文呈現 Microsoft DOS 6.0 官方原始碼中的硬碟啟動扇區程式 FDBOOT.ASM。這是標準的 MBR (Master Boot Record) 程式碼,負責從分區表選擇可啟動分區,載入其引導扇區並移交控制權。
CLI 關中斷,建立堆疊 SS:SP = 0000:7C00,STI 開中斷0000:7C00 複製到 0000:0600 (避免被後續載入覆蓋),遠跳轉繼續執行1BEH 開始,檢查 4 個分區項:
80h → 可啟動,跳轉 boot00h → 繼續下一項m1 並死循環INT 18H 呼叫 ROM BASICINT 13H AH=02h 讀取 1 扇區到 7C00h,重試 5 次,失敗顯示 m2 錯誤7DFEh 處是否為 AA55h,否則顯示 m3 "Invalid system disk"7C00:0000,並將分區表項目地址傳入 SI (傳統約定)org 7BEh
tab: ; 分區表 (64 bytes)
; 分區 1 (16 bytes)
dw 0,0 ; 起始 CHS
dw 0,0 ; 結束 CHS
dw 0,0 ; 相對扇區 (LBA low, high)
dw 0,0 ; 總扇區數 (low, high)
; 分區 2, 3, 4 同結構
signa db 55h, 0AAh ; MBR 結束簽名
; Microsoft Confidential, Copyright (C) 1983-1991
_data segment public
assume cs:_data, ds:_data
org 600h ; 搬移後位址
cli
xor ax,ax
mov ss,ax
mov sp,7c00h
mov si,sp
push ax; pop es
push ax; pop ds
sti
cld
mov di,0600h
mov cx,100h
repnz movsw ; 搬移 256 words = 512 bytes
db 0eah ; JMP FAR 指令機器碼
dw $+4, 0 ; 目標位移:段 = entry2:0
entry2:
mov si, offset tab
mov bl, 4
next:
cmp byte ptr [si], 80h
je boot
cmp byte ptr [si], 0
jne bad
add si, 16
dec bl
jnz next
int 18h ; ROM BASIC
boot:
mov dx, [si] ; DH=磁頭, DL=磁碟
mov cx, [si+2] ; CH=柱面低8位, CL[5:0]=扇區, CL[7:6]=柱面高2位
mov bp, si ; 保存分區表項地址傳給 PBR
next1:
add si, 16
dec bl
jz tabok
cmp byte ptr [si], 0
je next1
bad:
mov si, offset m1
msg:
lodsb
cmp al, 0
je hold
push si
mov bx, 7
mov ah, 14
int 10h ; 顯示字元
pop si
jmp msg
hold: jmp hold
tabok:
mov di, 5 ; 重試 5 次
rdboot:
mov bx, 7c00h
mov ax, 0201h
push di
int 13h ; 讀取扇區
pop di
jnc goboot
xor ax, ax
int 13h ; 重新校準
dec di
jnz rdboot
mov si, offset m2
jmp msg
goboot:
mov si, offset m3
mov di, 07dfeh
cmp word ptr [di], 0aa55h
jne msg
mov si, bp
db 0eah ; JMP FAR 7C00:0000
dw 7c00h, 0
include fdisk5.cl1 ; 包含 fdisk 相關常數/巨集
org 7beh
tab: ; 分區表
; ... 4 partitions x 16 bytes ...
signa db 55h, 0AAh
_data ends
end
SI 傳給 PBR (Partition Boot Record),後者可由此判斷啟動分區屬性INT 10H AH=0Eh 逐字元輸出,無需資料段此代碼是 PC 相容機啟動流程的標準參考實作,後續 Windows 9x/NT/2000 的 MBR 皆在此基礎上演變。研究它有助於理解: