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

全盤掃描磁碟機資訊:DRIVES 組合語言源碼詳解

     編輯:組合語言

程式概覽

DRIVES 是 Lee Hamel 於 1994 年撰寫的微型 COM 程式(.MODEL TINY),僅 200 餘行即完成 A:–Z: 全盤掃描,輸出每個磁碟機的:存在性、可移動/固定、本地/遠端/共享、類型(軟碟/硬碟/RAM/SUBST/CD-ROM)。它巧妙組合 DOS 21h/4408h/4409h、INT 2Fh/1500h/150Bh 等多重介面,展現了 DOS 時代系統程式設計的精髓。

核心檢測流程

第一階段:A: / B: 軟碟機專屬邏輯

  • 讀取 BIOS 資料區 0040h:0010h 獲取軟碟機數量(位 6-7 編碼)
  • 對 A:、B: 兩個磁碟機逐一呼叫 INT 21h/4409h(IOCTL 取裝置資訊)
  • 若 DH bit 7=1 表示 SUBST 虛擬磁碟,遞減實體計數器並標記類型
  • 其餘標記為可移動 + 軟碟

第二階段:C:–Z: 通用磁碟機迴圈

以 CL='C' 起始,CH=24 迴圈 24 次:

  1. 4409h 確認存在 → 不存在則跳過
  2. 4408h 判斷可移動/固定(AL=0/1)
  3. 解析 DX 回傳位元:DH bit 4=遠端/本地,DH bit 7=SUBST
  4. 若非遠端,檢查 BH bit 1 判斷可共享 → SHARED
  5. 遠端磁碟進一步呼叫 INT 2Fh/1500h 檢測 MSCDEX,再以 150Bh 確認該磁碟機受 MSCDEX 管理 → CD-ROM
  6. 本地固定磁碟檢查 BL bit 1 → RAM 磁碟,否則預設 HARD

輸出格式化

採用查表法:將屬性編碼(0/1/2/3/4)乘以字串長度(16/8/8)作為索引,直接從 removablemsg、localmsg、typemsg 三張表取字串,配合 INT 21h/09h(列印 $ 結尾字串)與 INT 29h(列印單字元)高速輸出,結構極其緊湊。

技術亮點

  • 善用 BIOS 資料區(0040h:0010h)獲取硬體資訊,避免額外 BIOS 呼叫
  • 位元操作密集:SHR/SHL/TEST/AND/OR 完成多重屬性解碼
  • MSCDEX 偵測雙重驗證(驅動程式存在 + 磁碟機受管理)確保 CD-ROM 判定準確
  • 全程無臨時變數,所有狀態寄存於 drives 陣列(每磁碟機 4 位元組),空間效率極致

現代啟示

雖然現代作業系統提供 WMI / sysfs / SetupAPI 等高層列舉介面,但 DRIVES 展示的「多來源交叉驗證、位元級屬性編碼、查表式輸出」思想,在裝置驅動程式、韌體診斷工具、資產管理代理程式中依然普遍適用。

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