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.