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.