首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

DOS 6.0 硬碟引導記錄 (FDBOOT.ASM) 核心原始碼分析

     編輯:組合語言

本文呈現 Microsoft DOS 6.0 官方原始碼中的硬碟啟動扇區程式 FDBOOT.ASM。這是標準的 MBR (Master Boot Record) 程式碼,負責從分區表選擇可啟動分區,載入其引導扇區並移交控制權。

程式碼核心流程

  1. 初始化:CLI 關中斷,建立堆疊 SS:SP = 0000:7C00,STI 開中斷
  2. 自我搬移:將自身從 0000:7C00 複製到 0000:0600 (避免被後續載入覆蓋),遠跳轉繼續執行
  3. 掃描分區表:從 1BEH 開始,檢查 4 個分區項:
    • 啟動標誌 = 80h → 可啟動,跳轉 boot
    • 啟動標誌 = 00h → 繼續下一項
    • 其他值 → 分區表損壞,顯示錯誤訊息 m1 並死循環
  4. 無可啟動分區:INT 18H 呼叫 ROM BASIC
  5. 讀取分區引導扇區:使用 INT 13H AH=02h 讀取 1 扇區到 7C00h,重試 5 次,失敗顯示 m2 錯誤
  6. 驗證簽名:檢查 7DFEh 處是否為 AA55h,否則顯示 m3 "Invalid system disk"
  7. 移交控制權:遠跳轉 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

技術亮點

  • 極致精簡:512 位元組內完成分區掃描、錯誤處理、重試邏輯、簽名驗證、控制權移交
  • CHS/LBA 兼容:分區表同時儲存 CHS 與 LBA 地址,支援大硬碟
  • 標準約定:將分區表項地址置 SI 傳給 PBR (Partition Boot Record),後者可由此判斷啟動分區屬性
  • 錯誤訊息直寫視訊:使用 INT 10H AH=0Eh 逐字元輸出,無需資料段
  • 自我搬移:避免覆蓋自身,經典 MBR 技巧

歷史價值

此代碼是 PC 相容機啟動流程的標準參考實作,後續 Windows 9x/NT/2000 的 MBR 皆在此基礎上演變。研究它有助於理解:

  • BIOS 啟動流程與 INT 13H/10H/18H 服務
  • 分區表結構與啟動標誌機制
  • 引導載入器鏈式載入架構
  • 實模式 16 位組合語言程式設計精髓
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved