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

絕對磁區讀取經典實作:GETSEC 組合語言源碼解析

     編輯:組合語言

歷史背景與用途

GETSEC 是 Mike Sirmans 於 1984 年為 Computer Innovations C-86 編譯器編寫的組合語言函式庫模組,提供「絕對磁區讀取」功能。它直接呼叫 BIOS 中斷 INT 25h,繞過 DOS 檔案系統,按邏輯磁區號直接讀取軟碟或硬碟資料。這在開機磁區備份、磁碟編輯器、防毒掃描引擎等底層工具中極為關鍵。

介面設計

int getsec(unsigned drive, unsigned numsec, unsigned begsec, char *buffer);
  • drive:0=A:, 1=B:, 以此類推
  • numsec:欲讀取磁區數
  • begsec:起始邏輯磁區號(0 起算,磁頭優先、磁軌次之)
  • buffer:傳輸緩衝區位址

核心邏輯逐行解讀

  1. 建立堆疊框架:PUSH BP / MOV BP,SP,以 BP 定址參數(相對 BP 的正位移)。
  2. 載入暫存器:AL=磁碟機號、CX=磁區數、DX=起始磁區、ES:BX=緩衝區位址——完全符合 INT 25h 入口規範。
  3. 執行 BIOS 呼叫:INT 25h。注意:INT 25h 返回時會在堆疊殘留旗標暫存器,必須手動清理。
  4. 錯誤處理:CF=1 表失敗,AL 為錯誤碼(80h/40h/20h/10h/08h/04h/03h/02h/FFh)。特殊處理 AL=00h:改為 FFh 以區別成功碼 00h。
  5. 清理堆疊並返回:POPF / POP BP / RET。

關鍵技術細節

  • 邏輯磁區號轉換:註解詳細說明 CHS→LBA 對應關係,對理解早期磁碟幾何結構極有幫助。
  • 暫存器保存約定:僅保留段暫存器,其餘全毀,符合 C 呼叫約定的「呼叫端保存」原則。
  • 危險性警示:原作者在標題以大寫強調「THIS ROUTINE IS POWERFUL... DANGEROUS IN THE WRONG HANDS」,因為直接磁區讀寫可繞過檔案系統保護,導致資料毀損。

現代對應

現代 Windows/Linux 以 DeviceIoControl / ioctl + SG_IO 取代 INT 25h/26h,但「邏輯磁區號 → 實體位置」的核心演算法在 RAID 控制器韌體、檔案系統驅動程式中依然通用。研讀 GETSEC 有助於理解區塊裝置驅動的基石邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved