DOS API最初是86-DOS中的應用程序接口(API),並也被MS-DOS/PC-DOS及其他DOS兼容操作系統使用。大多數對DOS API的調用是使用中斷21h(INT英語INT (x86 instruction) 21h)。在調用INT 21h時,在AH 寄存器中帶有子函數號,其他寄存器中帶有其他參數,從而調用各個DOS服務。DOS服務包括鍵盤輸入、視頻輸入、磁盤文件訪問、執行程序、內存分配及其他事務。在1980年代後期,圍繞DOS保護模式接口英語DOS Protected Mode Interface(DPMI)的DOS擴展器允許程序在16位元或32位元的保護模式下運行,並仍可訪問DOS API。

DOS API的歷史

在86-DOS和MS-DOS 1.0中的原始DOS API在設計上與CP/M兼容。文件訪問使用文件控制塊英語file control block(FCB)。在MS-DOS 2.0中的DOS API大大擴展了數個Unix概念,包括使用文件描述符分層目錄和設備I/O控制的文件訪問。[1]DOS 3.1中添加了網絡重定向器英語network redirector的支持。MS-DOS 3.31中,INT 25h/26h函數被增強以支持大於32MB的硬盤。MS-DOS 5添加了使用高端內存塊英語upper memory blocks(UMB)的支持。在MS-DOS 5之後,連續、獨立發布的DOS沒有改變DOS API。

DOS API與Windows

Windows 9x,DOS通常作為引導加載程序加載受保護模式的操作系統和圖形外殼。DOS通常從一個DOS虛擬機英語virtual DOS machine(VDM)訪問,但也可以不加載Windows而直接啟動到真實模式的MS-DOS 7.0。DOS API已增強國際化和長文件名支持,儘管長文件名支持僅在VDM中可用。隨着Windows 95 OSR2,DOS被更新到7.1,添加了FAT32及對其DOS API的支持。Windows 98Windows Me也實現了MS-DOS 7.1 API,儘管Windows ME本身自稱為MS-DOS 8.0。

Windows NT及基於它的系統(例如Windows XPWindows Vista)不是基於MS-DOS,但也可使用一個虛擬機器——NTVDM英語NTVDM處理DOS API。NTVDM將DOS程序在虛擬8086模式Intel 80386及更高處理器上可在保護模式下進行真實模式的仿真)模式下運行。NTVDM支持DOS 5.0 API。面向LinuxDOSEMU英語DOSEMU使用類似的方法。

DOS使用的中斷向量

中斷向量 描述 版本 備註
20h 終止程序並檢查空白空間 1.0+ 在DOS內核中實現
21h Main DOS API 1.0+ 在DOS內核中實現
22h 程序終止地址 1.0+ 返回調用程序中的地址
23h Control-C處理器地址 1.0+ 默認處理程序在命令外殼(通常是COMMAND.COM)
24h 嚴重錯誤處理器地址 1.0+ 默認處理程序在命令外殼(通常是COMMAND.COM)
25h 絕對磁盤讀取 1.0+ 在DOS內核中實現,在DOS 3.31中增強,最多支持2 GB分區
26h 絕對磁盤寫入 1.0+ 在DOS內核中實現,在DOS 3.31中增強,最多支持2 GB分區
27h 終止並駐留 1.0+ DOS 1.0中在COMMAND.COM中實現,DOS 2.0+中則在DOS內核
28h Idle callout 2.0+ 等待輸入時由DOS內核調用
29h 快速控制台輸出 2.0+ 由內置的控制台設備驅動程序或替換驅動程序(如ANSI.SYS)實現
2Ah 網絡和關鍵部分 3.0+ 由DOS內核調用,與網絡軟件交互
2Bh 未使用
2Ch 未使用
2Dh 未使用
2Eh Reload transient 2.0+ 在COMMAND.COM中實現
2Fh Multiplex 3.0+ 在DOS內核和各種程序(PRINT、MSCDEX、DOSKEY、APPEND等)中實現,取決於子功能號碼

DOS INT 21h服務

AH 描述 版本
00h 程序終止 1.0+
01h 字符輸入 1.0+
02h 字符輸出 1.0+
03h 輔助輸入 1.0+
04h 輔助輸出 1.0+
05h 打印機輸出 1.0+
06h 直接控制台I/O 1.0+
07h 無回顯直接控制台輸入 1.0+
08h 無回顯控制台輸入 1.0+
09h 顯示字符串 1.0+
0Ah 緩衝的鍵盤輸入 1.0+
0Bh 獲取輸入狀態 1.0+
0Ch 刷新輸入緩衝區和輸入 1.0+
0Dh 磁盤重置 1.0+
0Eh 設置默認驅動器 1.0+
0Fh 打開文件 1.0+
10h 關閉文件 1.0+
11h 查找第一個文件 1.0+
12h 查找下一個文件 1.0+
13h 刪除文件 1.0+
14h 順序讀 1.0+
15h 順序寫 1.0+
16h 創建或截斷文件 1.0+
17h 重命名文件 1.0+
18h 保留 1.0+
19h 獲取默認驅動器 1.0+
1Ah 設置磁盤傳輸地址 1.0+
1Bh 獲取默認驅動器的分配信息 1.0+
1Ch 獲取指定驅動器的分配信息 1.0+
1Dh 保留 1.0+
1Eh 保留 1.0+
1Fh 獲取默認驅動器的磁盤參數塊 1.0+
20h 保留 1.0+
21h 隨機讀取 1.0+
22h 隨機寫入 1.0+
23h 獲取記錄中的文件大小 1.0+
24h 設置隨機記錄號 1.0+
25h 設置中斷向量 1.0+
26h 創建PSP 1.0+
27h 隨機塊讀取 1.0+
28h 隨機塊寫入 1.0+
29h 解析文件名 1.0+
2Ah 獲取日期 1.0+
2Bh 設置日期 1.0+
2Ch 獲取時間 1.0+
2Dh 設置時間 1.0+
2Eh 設置驗證標誌 1.0+
2Fh 獲取磁盤傳輸地址 2.0+
30h 獲取DOS版本 2.0+
31h 終止並駐留 2.0+
32h 獲取指定驅動器的磁盤參數塊 2.0+
33h 獲取或設置Ctrl-Break 2.0+
34h 獲取InDOS標誌指針 2.0+
35h 獲取中斷向量 2.0+
36h 獲取可用磁盤空間 2.0+
37h 獲取或設置開關字符 2.0+
38h 獲取或設置國家/地區信息 2.0+
39h 創建子目錄 2.0+
3Ah 移除子目錄 2.0+
3Bh 更改當前目錄 2.0+
3Ch 創建或截斷文件 2.0+
3Dh 打開文件 2.0+
3Eh 關閉文件 2.0+
3Fh 讀取文件或設備 2.0+
40h 寫入文件或設備 2.0+
41h 刪除文件 2.0+
42h 移動文件指針 2.0+
43h 獲取或設置文件屬性 2.0+
44h 設備的I/O控制 2.0+
45h 複製句柄 2.0+
46h 重定向句柄 2.0+
47h 獲取當前目錄 2.0+
48h 分配內存 2.0+
49h 釋放內存 2.0+
4Ah 重新分配內存 2.0+
4Bh 執行程序 2.0+
4Ch 用指定返回代碼終止 2.0+
4Dh 獲取程序返回代碼 2.0+
4Eh 查找第一個文件 2.0+
4Fh 查找下一個文件 2.0+
50h 設置當前PSP 2.0+
51h 獲取當前PSP 2.0+
52h 獲取DOS內部指針(SYSVARS) 2.0+
53h 創建磁盤參數塊 2.0+
54h 獲取驗證標誌 2.0+
55h 創建程序PSP 2.0+
56h 重命名文件 2.0+
57h 獲取或設置文件的日期和時間 2.0+
58h 獲取或設置分配策略 2.11+
59h 獲取擴展錯誤信息 3.0+
5Ah 創建唯一文件 3.0+
5Bh 創建新文件 3.0+
5Ch 鎖定或解鎖文件 3.0+
5Dh 文件共享功能 3.0+
5Eh 網絡功能 3.0+
5Fh 網絡重定向功能 3.0+
60h 限定文件名 3.0+
61h 保留 3.0+
62h 獲取當前PSP 3.0+
63h 獲取DBCS引導字節表指針 3.0+
64h 設置等待外部事件標誌 3.2+
65h 獲取擴展的國家信息 3.3+
66h 獲取或設置代碼頁 3.3+
67h 設置句柄數 3.3+
68h 提交文件 3.3+
69h 獲取或設置ID 4.0+
6Ah 提交文件 4.0+
6Bh 保留 4.0+
6Ch 擴展的打開/創建文件 4.0+

支持MS-DOS API的操作系統

支持MS-DOS API的程序

參見

參考資料

  1. ^ Ray Duncan. Advanced MS-DOS Programming: The Microsoft Guide for Assembly Language and C Programmers. Microsoft Press. 1988. ISBN 0914845772.