DEV.ASM 是一個實用的 DOS 系統工具,用於掃描並顯示系統中所有已安裝字元/區塊裝置驅動程式的標頭資訊。它直接走訪 DOS 內部裝置鏈結串列,無需呼叫高階 API,展示了對 DOS 內部資料結構的深度理解。
dev proc far
push ds; xor ax,ax; push ax ; 保存 PSP:0 以便返回 DOS
mov ax,data; mov ds,ax; mov es,ax
mov ah,30h; int 21h ; 取得 DOS 版本
cmp al,2; jae dev1 ; 需 DOS 2.0+
...
dev1: mov ah,15; mov dx,offset nulfcb; int 21h ; 開啟 NUL 裝置
...
; 從 NUL FCB 保留區取得裝置鏈指標 (DOS 2.x/3.x 位移不同)
dev5: call prdev ; 列印裝置資訊
les bx,dword ptr es:[bx] ; 取得下一個裝置標頭
cmp bx,-1; jne dev5 ; -1 為串列結束
...
dev endp
程式先開啟 NUL 裝置 (AH=0Fh),DOS 會在 FCB 保留區填入該裝置驅動程式標頭的雙字指標。位移因 DOS 版本不同而異:
NULFCB+25h (offset), +27h (segment)NULFCB+26h (offset), +28h (segment)利用 NUL 裝置必然存在的特性,避免硬編碼系統變數位址,極具移植性。
; 裝置標頭結構 (每個驅動程式開頭)
DWORD 下一個裝置標頭指標 (ES:BX)
WORD 屬性字
WORD 策略進入點
WORD 中斷處理進入點
; 字元裝置:8 位元組名稱
; 區塊裝置:單元數 (BYTE) + 類型標記
prdev 程序依屬性字 Bit 15 (08000h) 區分字元/區塊裝置:
hexasc (Word) → btoa (Byte) → ascii (Nibble) 三層呼叫,將位址、屬性、策略/中斷指標轉為 4 位元組十六進位字串顯示。ascii 使用經典 ADD AL,'0'; CMP AL,'9'; JLE ...; ADD AL,'A'-'9'-1 技巧處理 0-9/A-F。
程式開頭檢查 DOS 版本 (AL≥2),並根據版本選擇 FCB 位移,展示良好的版本適應能力。
Addr Attr Str Int Type Units Name
XXXX:XXXX XXXX XXXX XXXX X XX NAME
...
End of device chain.
1984 年 Ray Duncan 編寫,發表於《PC Magazine》或同類技術刊物。當時 DOS 缺乏內建列舉驅動程式工具,DEV 填補此缺口,幫助開發者除錯驅動程式、分析系統配置、理解裝置命名空間。其核心演算法 (走訪鏈結串列、解析標頭結構) 在現代驅動程式開發框架 (WDM/KMDF/UMDF) 中仍以不同形式存在。
DEV.ASM 以約 150 行程式碼實現完整的裝置驅動程式列舉器。它展示了:DOS 內部資料結構逆向工程、版本相容性處理、底層輸出格式化、系統程式設計的簡潔哲學。對於學習作業系統內核資料結構、驅動程式架構、組合語言系統工具開發的開發者,這是極佳的教學案例。