DOS程序员手册(九)
第14章参考手册概述
本书余下的章节将向读者们介绍BIOS、DOS各种各样API函数和服务,作为一名程
序员,了解和掌握这些知识是很有好处的。在所介绍的参考手册中,每部手册都汇集了大
量的资源。所有的内容都力求给出准确的技术以及当前最新最流行的信息,如果读者发现
书中有不恰当之处,请向我们的Que公司的有关部门反映,对读者所提的每一个问题他
们都会很重视。
以下几章的主要内容是:
· BIOS参考手册
· DOS参考手册
. 鼠标参考手册
· EMS参考手册
· XMS参考手册
· DPMI参考手册
·任务切换参考手册
· DoubleSpace参考手册
14.1怎样介绍各个服务
每一部分参考手册都采用一种标准格式来展现中断或功能。书中按中断号和功能号
的次序由小到大将各个服务依次组织起来。例如:
Int 21h 功能44h 子功能08h V3
块设备能否移动?
上例中的第一行代表中断号、功能号(如果有)、子功能号(如果有)以及可提供此服务
的版本号。第二行表明该功能的用途。其他的信息还包括简要描述、调用寄存器、返回寄
存器和注释。要仔细阅读这种格式中的每一元素。
14.1.1中断号
中断号用于请求服务。表14.1中介绍了大量的中断信息。
354页
表14.1“DOS程序员参考手册”中介绍的一断
中断号 用途
00h 被零除中断
01h 单步中断
02h 不可屏蔽中断
03h 断点中断
04h 运算溢出中断
05h 打印屏幕
06h 保留
07h 保留
08h 系统计时器
09h 键盘中断
0Ah 保留
0Bh 通信
0Ch 通信
0Dh 硬盘控制卡
0Eh 软盘管理
0Fh 打印机管理
10h 视频显示
11h 获取设备状态
12h 获取内存大小
13h 软盘
14h 异步通信
15h 系统服务
16h 键盘
17h 打印机
18h 执行ROMBASIC
19h 系统热引导
1Ah 系统计时器/实时时钟服务
1Bh Ctrl-Break地址
1Ch 计时器计数中断
1Dh 视频初始化参数表
1Eh 磁盘初始化参数表
1Fh 图形显示字符位图表
20h 程序终止
21h DOS功能调用程序
22h 终止地址
23h Ctrl-C中断向量
24h 关键出错中断向量
25h 绝对磁盘读
26h 绝对磁盘写
27h 终止并驻留
28h 键盘忙碌循环
29h 快速输出字符
2Ah 网络接口
2Eh 执行命令
2Fh 多路复用接口
31h DPMI接口
33h 鼠标接口
4Fh VESABIOS服务器
67h LIM-EMS接口
70h 实时时钟中断
14.1.2功能号
功能号是一种几乎全部都装载在AH寄存器中的标志符,中断处理程序用它来确定
期望获取哪一种服务。尽管功能号取决于被调用的中断,但它们都是必须的。例如,仅Int
21h就有超过150种可用的功能。若没有功能号,中断处理程序对使用者的要求就会显得
不知所措。
14.1.3子功能号
同功能号一样,子功能号也是一种可选的标志符,它更进一步定义了所期望的服务。
划分成子功能的功能不是很多。若所选择的DOS功能要求说明某个子功能,那么在调用
此功能之前,就应把该子功能号装入AL寄存器。若此功能不支持任何子功能,则定义AL
的用途,或用AL来把其它参数传送给所调用的服务。
355页
14.1.4版本的有效性
本书中所有的功能都不涉及版本的有效性。版本有效性只是作为一种软件版本号的
标志,用以衡量该服务是否可用。这种信息对开发程序至关重要,因为没有人想调用不为
程序运行于其上的系统所支持的服务。
14.1.5用途
接下来将介绍此服务的用途。这样做的目的是想让读者快速地从总体上了解服务所
能实现的功能。在绝大多数情况下,这些用途摘自于IBM、Microsoft或其他厂商的科技出
版物。但是,在极个别的情况下,某些厂商所公布的用途可能不清楚、用词含混或不精确、
遇到这些情况,应对该服务的用途进行语法上的修改,以使之更加清晰明了。
14.1.6描述
简略地用一两句话概括出该服务所能做到的事情。这一部分类似于“用途”部分,只不
过增加了对服务的使用范围所进行的简要说明。
14.1.7调用寄存器
这一部分介绍CPU寄存器的设置列表,所调用的服务必须用这些设置才能正确地行
使功能。通常情况下,这些设置就是指参数,尽管它们可以包含指向所要求的参数表的指
针。这种功能列表是服务所要求的寄存器设置的快速查阅列表。
14.1.8返回寄存器
同“调用寄存器”部分一样,“返回寄存器”也是一种快速的查阅列表,表中所列的是调
用的服务通过寄存器所返回的值。它完整地列出了特殊服务所提供的内容。
14.1.9注释
注释部分是每个服务列表的主体部分。它较准确地说明了对应的功能所做的事情、如
何使用该功能,该功能可能的用途以及所有要注意的地方。若某一功能要求说明参数表的
用途,则在注释部分进行说明或者提供帮助你确定参数表内容的信息。
14.2详细的功能总结
下面给出的是本书中所涉及的具体功能列表,可以以这份列表为参考指南来从总体
上了解某个具体服务的有关信息。
注意:列表中凡是未公开的功能都注明了星号标记(*)。
356页
中断号 功能 子功能 用 途
00 被零除中断
01 单步中断
02 不可屏蔽中断
03 断点中断
04 运算溢出中断
05 打印屏幕
06 保留
07 保留
08 系统计时器
09 键盘中断
0A 保留
0B 通信
0C 通信
0D 硬盘控制卡
0E 软盘管理
0F 打印机管理
10 视频
00 设置视频模式
01 设置光标类型
02 设置光标位置
03 读光标位置和配置
04 读光笔位置
05 选择活动显示页
06 上卷窗口
07 下卷窗口
08 读字符和属性
09 写字符和属性
0A 在光标处写字符
0B 设置彩色调色板
0C 写图形像素
0D 读图形像素
0E 用电传方式写文本
0F 获取当前显示模式
10 设置调色板寄存器
11 字符生成程序
12 选择可选字符集
13 写字符串
1A 读/写显示代码
1B 获取显示状态
1C 保存/恢复显示状态
4F VESA BIOS服务
00 返回Super VGA信息
357页
中断号 功能 子功能 用 途
01 返回Super VGA模式信息
02 设置Super VGA显示模式
03 返回Super VGA显示模式
04 保存/恢复superVGA视频状态
05 显示内存窗口控制
F0 读一个寄存器
F1 写一个寄存器
F2 读寄存器范围
F3 写寄存器范围
F4 读寄存器集
F5 写寄存器集
F6 恢复到默认寄存器
F7 定义默认寄存器表
FA 询问驱动程序
11 获取设备状态
12 获取内存大小
13 软盘
00 重置磁盘系统
01 获取磁盘系统状态
02 读磁盘扇区
03 写磁盘扇区
04 检验磁盘扇区
05 格式化磁盘磁道
06 格式化柱面并设置坏扇区标志
07 从指定柱面中格式化驱动器
08 返回磁盘驱动器参数
09 初始化硬盘表
0A 读长扇区
0B 写长扇区
0C 查找柱面
0D 磁盘重置
0E 读扇区缓冲
0F 写扇区缓冲
10 检验硬盘系统状态
11 重新校准硬盘驱动器
12 诊断控制卡RAM
13 诊断驱动器
14 诊断控制卡
15 返回DASD类型
16 读磁盘变换行状态
17 为磁盘格式化设置DASD类型
358页
中断号 功能 子功能 用 途
18 为格式化设置介质类型
19 停泊磁头
1A 格式化ESDI单元
14 异步通信
00 初始化通信端口
01 把字符写给通信端口
02 从通信端口中读字符
03 请求通信端口状态
04 扩展的初始化
05 扩展的通信端控制
15 系统服务
00 打开磁带电机
01 关闭磁带电机
02 从磁带驱动器中读取数据块
03 把数据块写给磁带驱动器
0F ESDI单元格式化周期性中断
21 开电自检出错记录
4F 键盘截获
80 设备打开
81 设备关闭
82 程序终止
83 事件等待
84 操纵杆支持
85 系统请求键已按下
86 延迟
87 移动块
88 扩充内存大小测定
89 把处理器切换到保护模式下
90 设备等待
C0 中断完成
C1 返回系统配置参数
C2 返回扩充的BIOS数据区段地址
C3 指向设备BIOS接口
C4 允许/禁止监视器超时
C5 可编程的选项选择
D8 00 读取EISA Slot信息
01 读取EISA功能信息
02 清除EISA CMOS
03 写入EISA COMS
16 键盘
00 读取键盘字符
359页
中断号 功能 子功能 用 途
01 读取键盘状态
02 返回键盘标志
03 调整键盘重复率
04 键击开/关
05 写入键盘缓冲区
10 获取击键
11 检查键盘
12 获取键盘状态标志
17 打印机
00 把字符写入打印机
01 初始化打印机端口
02 请求打印机端口状态
18 执行ROMBASIC
19 系统热引导
1A 系统计时器/实时时钟服务
00 获取时钟计数器
01 设置时钟计数器
02 读取实时时钟
03 设置实时时钟
04 从实时时钟内读取日期
05 设置实时时钟的日期
06 设置系统报答信号
07 禁止实时时钟报答
09 读取实时时钟报警
0A 获取日计数
0B 设置日计数
80 设置声源
1B Ctrl-Break地址
1C 时钟节拍中断
1D 视频初始化参数表
1E 磁盘初始化参数表
1F 图形显示字符位图表
20 终止程序
21 DOS功能调度程序
00 终止程序
01 带回显的键盘输入
02 显示输出
03 辅助输入
04 辅助输出
05 打印机输出
06 直接的控制台I/O
360页
中断号 功能 子功能 用 途
07 直接的STDIN输入
08 STDIN输入
09 显示串
0A 缓冲的STDIN输入
0B 检查STDIN状态
0C 清空缓冲区和输入内容
0D 重置磁盘
0E 选择磁盘
0F 打开文件(FCB)
10 关闭文件(FCB)
11 搜索第一项(FCB)
12 搜索第二项(FCB)
13 删除文件(FCB)
14 读顺序文件(FCB)
15 写顺序文件(FCB)
16 创建文件(FCB)
17 重命名文件(FCB)
18 保留
19 获取默认驱动器
1A 设置DTA地址
1B 获取分配表信息
1C 获取指定驱动器的分配表信息
1D 保留
1E 保留
1F 获取默认磁盘参数块
20 保留
21 随机文件读(FCB)
22 随机文件写(FCB)
23 获取文件大小(FCB)
24 设置随机记录字段(FCB)
25 设置中断向量
26 创建PSP
27 随机块读(FCB)
28 随机块写(FCB)
29 分析文件名
2A 获取系统日期
2B 设置系统日期
2C 获取系统时间
2D 设置系统时间
2E 设置检验标志
2F 获取DTA地址
361页
中断号 功能 子功能 用 途
30 获取DOS版本号
31 终止并驻留
32 获取驱动器参数块
33 00 获取Ctrl-Break标志
33 01 设置Ctrl-Break标志
33 05 获取引导驱动器代码
33 06 获取MS-DOS版本
34 返回InDOS标志的地址
35 获取中断向量
36 获取自由磁盘空间
37 00* 获取开关字符
01* 设置开关字符
02* 读取设备有效性
03* 设置设备有效性
38 获取/设置国家信息
39 创建子目录
3A 移动子目录
3B 设置目录
3C 创建/截断文件(句柄)
3D 打开文件(句柄)
3E 关闭文件(句柄)
3F 读文件或设备(句柄)
40 写文件或设备(句柄)
41 删除文件
42 移动文件指针
43 00 获取文件属性
43 01 设置文件属性
44 设备驱动程序控制(IOCTL)
44 00 获取设备信息
01 设置设备信息
02 设备IOCTL读
03 设备IOCTL写
04 块驱动程序IOCTL读
05 块驱动程序IOCTL写
06 获取输入状态
07 获取输出状态
08 块设备可移动与否?
09 块设备是本地的还是远程的?
0A 句柄是是本地的还是远程的?
0B 设置共享重试计数
0C 用于句柄的通用I/O控制
362页
中断号 功能 子功能 用 途
0D 用于块设备的通用I/O控制
0E 获取逻辑驱动器映象
0F 设置逻辑驱动器映象
10 询问IOCTL句柄
11 询问IOCTL设备
45 复制句柄
46 强制复制句柄
47 获取当前目录
48 分配内存
49 释放内存
4A 修改内存分配
4B 执行程序(EXEC)
4C 带返回代码的终止
4D 获取返回代码
4E 搜索最先匹配
4F 搜索第二匹配
50 设置PSP段
51 获取PSP段
52* 获取磁盘列表
53* 把BPB转换成DPB
54* 获取检验标志
55* 创建PSP
56 重命名文件
57 00 获取文件日期和时间
01 设置文件日期和时间
58 00 获取分配策略
01 设置分配策略
02 获取UMB连接状态
03 设置UMB连接状态
59 获取扩展的出错信息
5A 创建唯一命名的文件
5B 创建新文件
5C 00 设置文件访问锁定
5C 01 清除文件访问锁定
5D 00* 把数据复制给DOS保存区
06* 获取关键出错标志地址
0A 设置出错数据值
5E 00 获取机器名
01* 设置机器名
02 设置网络打印机装置
363页
中断号 功能 子功能 用 途
03 获取网络打印机装置
5F 02 获取重定向列表项
03 设置重定向列表项
04 取消重定向列表项
60* 扩展路径名串
61 保留
62 获取PSP地址
63 00 获取系统前导字节表
01 设置/清除临时控制台标志
02 获取临时控制台标志
64* 设置当前国家字节
65 获取扩展的国家信息
20 转换字符
21 转换串
22 转换ASCIIZ串
66 01 获取全局代码页
02 设置全局代码页
67 设置句柄计数
68 清空缓冲区
69 保留
6A* 分配内存
6B 保留
6C 扩充的打开/创建
22 终止地址
23 Ctrl-C中断处理程序
24 关键出错处理程序
25 绝对磁盘读
26 绝对磁盘写
27 终止并驻留
28* DOS可安全使用
29* 快速放置字符
2A* Microsoft网络接口
2B 保留
2C 保留
2D 保留
2E* 主外围程序加载器
2F 多种复用服务中断
01 00 打印安装检查
01 把文件保存到打印假脱机程序中
02 从打印队列中移走文件
03 取消打印队列中的全部文件
364页
中断号 功能 子功能 用 途
04 保持打印作业
05 结束打印保持
06 获取打印机设备
05* 获取外围关键出错处理程序安装状态
06 获取ASSIGN.COM/ASSIGN.EXE安装状态
08* 获取DRIVER.SYS安装状态
10 获取SHARE.EXE安装状态
11 获取网络重定向程序安装状态
12 00* 获取DOS安装状态
01* 清空文件
02* 获取中断向量地址
03* 获取DOS日期段
04* 正规化路径分隔符
05* 输出一个字符
06* 请求关键出错
07* 移动磁盘缓冲区
08* 减少用户计数
0C* 供DOS使用的IOCTL打开
0D* 获取文件关闭的日期和时间
0E* 搜索缓冲区链
10* 找出已修改的缓冲区,时间延迟
11* 正规化ASCIIZ文件名
12* 找到ASCIIZ串长度
13* 大小写和国家约定
14* 比较32位的数字
16* 获取DCB地址
17* 获取LDT地址
18* 获取用户堆栈地址
19* 设置LDT指针
1A* 从路径名中获取驱动器代码
1B* 较正闰年
1C* 计算从月头起的天数
1D* 计算日期
1E* 比较串
1F* 初始化LDT
20* 获取DCB数值
21* 扩展ASCIIZ路径名
22* 翻译扩充的出错代码
24* 执行延迟
25* 获取ASCIIZ串长度
26* 打开文件
365页
中断号 功能 子功能 用 途
27* 关闭文件
28* 定位文件指针
29* 读取文件
2B * IOCTL接口
2D* 获取扩充的出错代码
2F* 保存Dx
14 00 获取NLAFUNC安装状态
15* CDROM接口
16 80 MS-DOS空闲调用
释放当前虚拟机器的时间片(DPMI)
86 获取CPU模式(DPMI)
87 保存由实模式至保护模式的切换入口点(DPMI)
8A 获取厂商指定的入口点(DPMI)
1A 00 获取已安装的ANSI.SYS状态
43 00 获取已安装的XMS驱动程序状态
01 获取XMS驱动程序入口点地址
48 00 获取DOSKEY.COM的安装状态
10 读命令行
4B 01 建立通报链
02 检测切换程序
03 分配切换程序ID号
04 自由切换程序ID
05 标识实例数据
AD 80 获取KEYB.COM版本号
81 获取KEYB.COM活动代码页
82 设置KEYB.COM国家标志
83 获取KEYB.COM国家标志
B0 00 获取已安装的GRAFTABL.COM状态
87 00 检查APPEND安装
02 获取APPEND版本
04 获取APPEND路径指针
06 获取APPEND功能状态
07 设置APPEND功能状态
11 设置返回找到的名称状态
31 DPMI中断
00 00 分配LDT描述符
00 01 释放LDT描述符
00 02 分段描述符
00 03 获取选择子增加值
00 06 获取段基地址
00 07 设置段基地址
366页
续
中断号 功能 子功能 用 途
00 08 设置段界限
00 09 设置描述符访问权限
00 0A 创建别名描述符
00 08 获取描述符
00 0C 设置描述符
00 0D 分配指定的LDT描述符
00 0E 获取多个描述符
00 0F 设置多个描述符
01 00 分配DOS内存块
01 01 释放DOS内存块
01 02 重新规定DOS内存块的大小
02 00 获取实模式中断向量
02 01 设置实模式中断向量
02 02 获取处理器异常处理程序向量
02 03 设置处理器异常处理程序向量
02 04 获取保护模式中断向量
02 05 设置保护模式中断向量
02 10 获取扩充的处理器异常程序向量(保护模式)
02 11 获取扩充的处理器异常程序向量(实模式)
02 12 设置扩充的处理器异常程序向量(保护模式)
02 13 设置扩充的处理器异常程序向量(实模式)
03 00 模拟实模式中断
03 01 用远返回调用实模式过程
03 02 用IRET调用实模式过程
03 03 分配实模式回调程序地址
03 04 释放实模式回调程序地址
03 05 获取状态保存/恢复地址
03 06 获取原始模式切换地址
04 00 获取版本
04 01 获取DPMI功能
05 00 获取自由内存信息
05 01 分配内存块
05 02 释放内存块
05 03 重新规定内存的大小
05 04 分配线性内存块
05 05 重新规定线性内存块的大小
05 06 获取页属性
05 07 设置页属性
05 08 在内存块中映射设备
05 09 在内存块中映射常规内存
05 0A 获取内存块大小和基地址
367页
(续)
中断号 功能 子功能 用 途
05 03 获取内存信息
06 00 锁定线性区域
06 01 解锁线性区域
06 02 把实模式区域标记为可分页的区域
06 03 重新锁定实模式区域
06 04 获取页面大小
07 02 将页面标记为要求分页的对象
07 03 删除页面内容
08 00 物理地址映象
08 01 释放物理地址映象
09 00 获取并禁止虚拟中断状态
09 01 获取并允许虚拟中断状态
09 02 获取虚拟中断状态
0A 00 获取厂商指定的API入口点
0B 00 设置调试监视点
0B 01 清除调试监视点
0B 02 获取调试监视点的状态
0B 03 重置调试监视点
0C 00 安装常驻服务供应者回调程序
0C 01 终止并驻留
0D 00 分配共享内存
0D 01 释放共享内存
0D 02 在共享内存上进行串行化
0D 03 释放共享内存上的串行化处理
0E 00 获取协处理器状态
0E 01 设置处理器仿真
33 鼠标中断
00 初始化鼠标
01 显示鼠标光标
02 隐藏鼠标光标
03 获取鼠标位置
04 设置鼠标位置
05 获取按钮压下信息
06 获取按钮释放信息
07 设置鼠标x限
08 设置鼠标Y限
09 设置图形光标形状
0A 设置文本光标类型
0B 读取运行计数器
0C 设置用户定义的事件处理程序
0D 启动光笔仿真
368页
中断号 功能 子功能 用 途
0E 停止光笔仿真
0F 设置设备与象素的比例
10 有条件的鼠标关闭
13 设置双速阈值
14 交换用户事件处理程序
15 获取保存状态的存储容量
16 保存鼠标驱动程序状态
17 恢复鼠标驱动程序状态
18 设置备用的鼠标用户处理程序
19 获取用户备用的中断向量
1A 设置鼠标灵敏度
1B 获取鼠标灵敏度
1C 设置中断速率
1D 设置CRT页号
1E 获取CRT页号
1F 禁止鼠标驱动程序
20 允许鼠标驱动程序
21 软件重置
22 设置消息语言
23 获取消息语言
24 获取鼠标信息
25 获取通用的驱动程序信息
26 获取最大的虚拟坐标系
27 获取光标屏蔽和素基计数
28 设置视频模式
29 获取受支持的视频模式
2A 获取光标热点
2B 设置加速曲线
2C 获取加速曲线
2D 设置或获取活动的加速曲线
2F 鼠标硬件重置
30 设置或获取球点信息
31 获取虚拟坐标
32 获取现有的高级功能
33 获取切换设置
34 获取MOUSE.INI路径
4A 实时时钟警告中断
67 LIM-EMS接口
40 获取管理器状态
41 获取页框段
42 获取页面计数
369页
(续)
中断号 功能 子功能 用 途
43 获取句柄并分配内存
44 映射/不映射内存
45 解除对句柄和内存的分配
46 获取EMM版本
47 保存页面映象
48 恢复页面映象
49 保留
4A 保留
4B 获取句柄计数
4C 获取句柄拥有的页
4D 获取所有句柄的页
4E 00 获取页映象寄存器
01 设置页映象寄存器
02 获取并设置页映象寄存器
03 获取页映象数组的大小
4F 00 获取部分页映象
01 设置部分页映象
02 获取部分页映象的大小
50 00 映射/不映射多重句柄页(物理页号模式)
01 映射/不映射多重句柄页(段地址模式)
51 重分配页面
52 00 获取句柄属性
01 设置句柄属性
02 获取属性功能
53 00 获取句柄名
01 设置句柄名
54 00 获取句柄目录
01 查找命名句柄
02 获取句柄名计数
55 修改页映象并跳转
56 修改页面映象并调用
02 获取堆栈空间大小
57 00 移动内存区域
01 交换内存区域
58 00 获取可映射的物理地址数组
01 获取可映射的物理地址数组大小
59 00 获取扩展内存硬件信息
01 获取未分配的原始页计数
5A 00 分配标准页
01 分配原始页
5B 00 获取备用映象寄存器
370页
续
中断号 功能 子功能 用 途
01 设置备用映象寄存器
02 获取备用映象寄存器集大小
03 分配备用映象寄存器集
04 解除对备用映象寄存器集的分配
05 分配DMA寄存器集
06 允许DMA寄存器集
07 禁止DMA寄存器集
08 解除对DMA寄存器集的分配
5C 准备用于热引导的硬件
5D 00 允许OS/E功能
01 禁止OS/E功能
02 OS/E存取键代码到EMS上
70 实时时钟中断
第15章BIOS参考手册
BIOS(基本输入/输出系统)功能是任何PC机或兼容计算机的基础。BIOS功能包括
一些基本的操作,通过这些操作就能成功地使用计算机的硬件资源。在PC机或兼容机上
的绝大多数编程操作是在BIOS层之上进行的。在需要某些特殊功能却又无计可施的情
况下,程序员们可直接调用BIOS功能。有时候,BIOS甚至没有提供必须的服务,此时,程
序员就必须深入到BIOS之下,并进入硬件层。
PC机或兼容计算机的BIOS通常被保存在ROM中(因而产生了一种术语为“ROM
BIOS”),并把它作为硬件系统的一部分。通常情况下,系统的制造厂家都按照Microsoft
的MS-DOS规范提供BIOS,可以很容易地把用于EGA监视器或其他设备的ROM BIOS
扩展部分加进系统。这些扩展部分构成了PC环境可扩展属性的基础。在系统引导时,
BIOS的某些部分(一个隐藏的文件,通常称之为IO.SYS或IBMBIO.COM)可以从磁盘
中进行装载。如何引导DOS的详细介绍可参见第3章“动态的DOS"。
ROM发表日期被定位在以F000:FFF5h为开头的8字节中。表15.1中列出了重要
的BIOS发表日期。
表15.1 BIOS发表日期
日期 机器类型
04/24/81 PC
10/19/81 修正PC机中常见的故障
08/16/82 PC XT
10/27/82 PC至XT升级
11/08/82 便携式PC机
06/01/83 PCjr
01/10/84 个人计算机AT
09/13/85 Convertible PC
04/21/86 PCxT286
09/02/86 PS/2系列
上述这些日期都只是IBM的ROM BIOS的发表日期,仅仅在使用IBM PC时,这些
期才有意义。那些没有真正的IBM ROM的系统很可能拥有不同的日期,上表中没有涉
之所有的ROM BIOS。尽管一些杂志和公告板(大多数报告故障)上常提醒用户注意ROM
其他日期,但可以肯定地讲,不存在很复杂的日期列表。
可用型号标识字节(定位于F000:FFFEh处)来区分不同的型号(见表15.2)。ps/2
372页
系列继续支持这种型号标识字节。但是,对于非IBM机器,不能依赖于这种字节;因为它
们没有建立标准的值集。
表15.2标识字节
字节 系 统
9Ah COMPAQ Plus
FFh IBM PC
FEh PC XT便携式PC
FDh PCjr
FCh 个人计算机AT,PS/1,PS/2,Model 50和60
FBh PCXT(1/10/86以后)
FAh PS/2Model30
F9h Convertible C
F8h PS/2MOdel 80
关于BIOS发表日期和型号标识的其他信息,可参见本节后面的Int 15,功能C0h。
在PS/2上,OS/2和硬件之间没有BIOS。所有的硬件接口连接是通过设备驱动程序:
来实现的(关于设备驱动程序的介绍,可参见第12章“设备驱动程序”)。让BIOS留在PS/
2系统中出于下列三种原因:引导操作系统;支持DOS(若使用DOS的话)以及为运行
DOS程序支持兼容性框(Compatiblity Box)。
可直接通过接口把设备驱动程序链接到操作系统中,以控制对硬件的访问。在多任务
操作系统如OS/2、Windows或UNIX中,这些驱动程序能够处理进程(程序)的请求,并
能井井有条地管理好每一件事情。在多任务环境中,必须通过驱动程序进行硬件的访问,
因为任何直接访问硬件或访问全围绕BIOS的程序都会破坏其它程序正在做的事情。
最初编写用于支持DOS的BIOS,能够顺利地在OS/2下运行,因为这种BIOS不在
保护模式中运行。在保护模式中禁止某些处理器指令,并阻止程序访问已指派给其它程序
的内存部分。保护模式使得多任务操作成为可能,因为在保护模式下,可以编写程序但却
不必担心它会影响其它的程序。IBM OS/2包含有一种高级BIOS(ABIOS),它能在实模
式和保护模式下启动设备驱动程序,支持多任务执行并寻址多达16M的内存。
在PS/2上,为了使程序能在Compatibility Box中运行而支持BIOS调用。甚至于
Borland的SideKic(使用了未公开的系统调用)也能运行在PS/2上,尽管Microsoft和
IBM的正式声明只支持已公开的DOS调用。但是在OS/2下,那些必须在后台中运行的
DOS程序却被悬挂起来。 OS/2的开发者们考虑到了最坏的情况,即DOS程序与多任务
不兼容,因为它们直接访问内存(例如,直接写屏幕)。
进入OS/2环境的读者将会发现,本节指明了(在一切可能的地方)BIOS内中断处理
的PS/2特征。记住IBM并没有发表用于PS/2的BIOS的程序清单,但却发表了用于初
始化PC机的BIOS程序清单。不过,它已公布了几乎与旧的PC BIOS完全兼容的入口
点。在BIOS基础上建成的程序能在PS/2上继续运行。在PS/2系列上,那些依靠BIOS的
速度来定时的程序可以比在PC机上运行得更快。
表15.3列出了PS/2中的主要变化。
373页
表15.3 PS/2的不同点 (PS/2)
中断号 含 义
0Bh 保留,不再通信
0Ch 保留,不再通信
0Dh 保留
0Fh 保留
15h 系统服务(磁带I/O)
40h 软盘BIOS向量
41h 硬盘参数
46h 硬盘参数
4Ah 用户警告
71h-74h 保留
76h-77h 保留
F1h-FFh 用户程序中断
除了常常控制中断0Bh和0Ch的通信程序外,这些改变对绝大多数程序没有影响。
若对本章的功能是如何展现的有疑问,可参照本书的“参考手册概述”部分。
系统 Int 00h
被零除中断(硬件出错)
当出现被零除的倾向时,该中断由CPU调用。
调用寄存器:无
返回寄存器:无
注释:当处理器试图执行非法的被零除操作时,自动地调用被零除中断。因为
若除数为零,计算机的除法过程永远都不会终止,在任何计算机上,都把这种
操作当作出错处理。中断处理程序自动地处理这种出错。
在启动时,BIOS把该中断设置为指向IRET指令。但是,DOS把此中断重
新设置成指向产生Divide by zero信息的处理程序,并接着终止这道导致出错
的程序。这一进程是在DOS层上进行处理的,因为在BIOS层上不存在相应
的处理程序。被零除出错会使得操作系统不稳定,并导致其它错误。当被零除
错误出现时,最好的办法是人为地重新启动操作系统或创建一道更好的处理
程序(诸如用于DOS Int 24h的程序)。
如果正在编写一道使用户输入出现这类错误的程序,则必须捕获被零除
中断,并在某个例程中处理该中断。这是一种很好的编程练习,所编写的程序
不仅能保证它们的屏幕用户输入,而且绝不允许这种错误俘获。但是,有时候
程序会以一种意想不到的方式产生被零除中断。
在程序操作期间会意外地出现被零除中断,此时,一种堆栈问题就可能导
374页
致处理器去执行Int 00h。在调试问题的过程中出现特别复杂的堆栈处理时
也会偶尔产生被零除中断。
除了上述原因外,有些DOS版本在遇到访问不存在的文件的尝试时也会
产生被零除中断;若DOS在执行某个计算来把簇号转换成所有磁盘控制程序
所要求的磁道/磁头/扇区的地址格式时,则常常会出现这种错误。被零除错误
是位神秘的不速之客,因为在用户的操作行为和这种错误信息之间没有明显
的关系。
系统 Int 01h
单步中断
若设置俘获标志就由CPU调用。
调用寄存器:无
返回寄存器:无
注释:无论什么时候设置俘获标志,在执行完所有的指令后都会调用Int
01h。调试程序使用这类中断处理程序单步执行(其它类型的程序则不能调用
这类中断)。
在编写调试程序的过程中,尤其要注意用STF(Set Interrupt Flag:设置中
断标志)指令来阻止俘获你自己的中断处理程序。一旦进入了处理程序,中断
就被关闭,并且设置了俘获标志。若在关掉俘获标志之前重新启用中断,就会
单步执行中断处理程序,这样就不得不再次引导计算机以重新获得控制权。
系统 Int 02h
不可屏蔽中断(NMI)
在内存奇偶出错时由CPU调用
调用寄存器:无
返回寄存器:无
注释:从程序员的角度讲,不可屏蔽中断(NMI)是用途最小的中断,因为它表
示在操作过程中主系统失败。若出现NMI错,很可能没有恢复机会。对于
NMI,既不能封锁它也不能关掉它,唯一能做的就是接受它。
在计算机的PC系列中(包括PS/2 30型),这类中断会报告奇偶出错。当
系统板上出现奇偶错误时,ROM BIOS就会显示出PARITY CHECK 1,并随
时锁定机器。PARITY CHECK2表示I/O通道奇偶出错。显示出PARITY
CHECK信息,则表示内存中出现间歇读(intermittent-read)问题。
虽然可以来用循规蹈矩的方式来俘获中断以关闭系统,但中断处理程序
375页
可能不处在好的内存中,因为这类中断正是出自于内存奇偶错误。更为严重的
是,任清空缓冲区或更新文件的尝试都会破坏其它情况下还是好的文件。但
是,有几种公共域和共享件程序可帮助你俘获该中断,并允许你选择除强迫重
引导外的其它操作。
在PS/2系列中(除Model 30外),可用此中断进行奇偶检测,但是错误信
息以数字化的代码方式出现,它们的含义如下表所示:
代码 含 义
110 系统板内存失效
111 I/O通道检查被激活
112 监视程序超时
113 直接内存访问(DMA)总线超时
I/O通道内存中的错误会导致给出错误号111。监视程序超时可用来检测
是否有已遗漏的IRQ0(系统计时器)中断。当允许监视器超时时出现这种中
断,此时就会产生NMI错误112。当直接内存访问(DMA)驱动程序时,若授
予DMA设备以超过7.8微秒的总线控制权时,就会产生错误113。
Int 03h
系统 断点中断
调试程序用该中断来俘获程序断点
调用寄存器:无
返回寄存器:无
注释:正在调试的程序把此中断看作一个指向断点处理例程的向量。调试程
序把Int 03h(使用特殊的单字节同义词操作码0CCh)置于所期望的断点处,
并允许调试的程序运行。当该程序到达此断点时,中断处理程序把控制权归还
给调试程序。
对一些程序员来说,这种特殊的单步操作码可能显得有些陌生,但是In-
tel公司提供的这一种0CDh 03h(用于Int 03h的普通编码)的代用品使得在
可执行代码中能轻而易举地实现断点的布局。
对于调试汇编语言程序来说,中断03h和01h是可以使用的原始硬件工
具。
Int 04h
系统 算术溢出中断
当算术操作溢出时由CPU调用
376页
调用寄存器:无
返回寄存器:无
注释:当算术操作产生的结果大于所允许的数据类型时,可通过执行INTO
(溢出中断)指令来调用该中断。要启用INTO指令,必须在执行运算指令(如:
MUL或IMUL)前设置标志寄存器中的溢出位(位11)。
对于大多数程序来说,由于运算溢出算不上是什么问题,因而通常就没有
采取相应的补救措施。此中断的缺省值指向IRET指令,并立即从此中断里返
回。没有使用任何特殊的处理程序来处理溢出,因为Intel微处理器指令集中
包含有JO和JNO(溢出跳转和未溢出跳转)指令,通常就用这两处指令来处
理溢出。
系统 Int 05h
打印屏幕
把文本屏幕内容在打印机上打印出来
调用寄存器:无
返回寄存器:无
注释:按下PrtSc键(通常为Shift-PrtSc),即可触发把当前屏幕显示的内容
打印在打印机上的这种功能。功能05h传送到一种例程,该例程把视频屏幕缓
冲区的ASCII内容发送给打印机。请读者注意这里的“ASCII内容”一词,若在
处理图形屏幕时该中断引发打印行为,但所打印的内容却不可预测。
大多数DOS版本包含GRAPHICS.COM实用程序,它安装一种代用的
打印屏幕中断处理程序,能处理图形。4.0版本之前的版本只能用于IBM(与
EPSON兼容)图形打印机;4.0版问世以后,它扩展到支持当前所有的IBM
打印机型号。
还有几种备用Int 05h例程也广为使用。例如,Intel提供了一种作为软件
部分的替换处理程序,适用于Above Board Plus EMS内存板,后者突出其软
件打印缓冲设备的控制权并保持打印屏幕的功能。
若要寻找一种打印屏幕显示的方法,可从你自己的程序中调用Int 05h。
在数据库程序中,打印屏幕显示特别有用,例如,可以打印屏幕的内容而不必
打印记录。
有些情况下,可能需要用特殊的处理程序——即能处理特殊的情况或执
行完全不同的功能的处理程序来代替中断向量。标准功能保存光标位置,并接
着在同一系统上把屏幕内容打印给打印机1。它运行已许可的中断,因而在任
何中断(其它打印屏幕除外)都能控制该系统。
此功能不会修改任何寄存器,它只是在内存中的0050:0000处维护一个
状态字节。如果此状态字节为1,就表明打印正在进行;如果此字节值为0,则
377页
表明已完成了一个成功的打印;如果为FFh,则表明最后一次打印操作未能成
功地完成。
系统 Int 08h
系统定时器
由系统时钟每秒大约调用18.2次(每小时65536次)
调用寄存器:无
返回寄存器:无
注释:Int 08h是一个每秒钟要调用18.2次的中断,用于完成高级的各种计
数,该中断直接与系统时钟芯片的通道0相连。要编写实用程序中的TSR,如
SideKick,就会发现Int 08h对于由定时来触发的任务来说是特别有用的。此
中断要调用Int 1Ch(定时计数)。因此大多数TSR应该连接到Int 1Ch而不是
连接到Int 08h上。
由于每隔55毫秒此中断就被调用一次,因而,面向该中断的处理程序必
须尽可能快地执行。中断处理只能是处理器系统常规使用的一小部分。并且,
由于计时器被当作IRQ0(高优先级硬件中断),因而会优先于同一系统上的其
它中断而服务于中断Int 08h。若对该中断处理得不好,就会导致服务于其它
的重要中断(如磁盘服务)时出现问题。
注意,由于在Int 08h处理程序完成其处理之前调用了Int 1Ch(计时器的
用户拴接),因而,面向该中断的操作也领先于其它任何硬件中断请求而得以
执行。富有经验的软件设计人员则常常利用这一事实。
地址0040:006Ch是一个32位按天计算的时间(time-of-day)指示符,计
数自启动以来的时间计数。每当时间计数满24小时,位置0040:0070h就被
置为1,而当BIOS读它时,该位置被清除为零。如果经过了24小时而其间又
没有出现读取操作时,计算机的时间系统中便消失了一整天的时间,并又从零
开始计数。
通过递减位置0040:0040h处的值,该中断就能提供用于磁盘的发动机
自动关闭功能。当位置0040:0040h的值为零时,位于0040:003Fh处的发
动机状态中的发动机运行标志被重置为关掉磁盘发动机。
让计时器采用奇数频率来调用Int 08h(18.2次/秒)的原因在于设计者们
希望通过设置出时间显示来简化这项工作,以便位于0400:006Ch处的32
位值中的高位字正好能每小时增加一次,这样便允许把它与24(十进制)进行
简单的比较,以检测午夜翻转。
用3600(每小时的秒数)来除65536(低位字翻转的计数),其结果正好是
18.20——目标频率。遗憾的是,计时器芯片的递减计数频率略为偏低了一点,
并且实际上在BIOS中检测到的计数数字是11,大于可能显示的结果,实际操
378页
作中,由于不同的系统之间频率是不相同的,因而必须时常重新设置时钟。每
当引导系统时,这一进程通常就会发生;但是在一些拥有单独的实时时钟的系
统上,这些时钟也会在每周超出几秒或丢失几秒钟。
键盘 Int 09h
键盘中断
无论何时按F3键或松开此键,都会调用这一原始的键击中断
调用寄存器:无
返回寄存器:无
注释:无论何时按下F3键或放开此键,键盘就会发送一种信号(IRQ1)来触
发该中断。该中断的处理程序从键盘端口(端口60h)中读取键信息,并把此信
息处理成字符码和扫描码信息,然后将处理后的信息放入32个字节的字符队
列中(通常保存在0040:001Eh处)。这两种代码被放置在由0040:001Ch(键
盘缓冲区尾指针)所指向的位置上,并相应地增加了两个指针。BIOS控制台输
入例程不是直接访问键盘,而是访问这种输入队列,因而程序员在进行键盘处
理时保留某些超前敲入(typeahead)的余地和很多键盘处理中的灵活性。
由中断处理程序解释的特殊键击如下:
键击 处 理
Ctrl 更新0040:0017h和0040:0018h(键盘控制字节)并且
更新0040:0096h(键盘模式标志)
Alt 与Ctrl相同
Shift 与Ctrl相同
Ctrl-Alt-Del 把0040:0072h(重置标志)设置为1234h,并把系统控
制传送给POST(Power-On Self Test:加电自检)例程;
一旦设置了重置标志,POST就可绕过通常的启动检测。
Pause 导致处理程序在获取有效字符之前不断地循环下去。
PrintScreen 使用Int 05h来调用打印屏幕例程。
Ctrl-Break Int 1Bh来调用Control-Break处理程序
System Request PC XT BIOS系统(日期晚于1/1/86)、个人计算机AT
系统、PC AT 286系统、PC Convertible系统和PS/2系
统使用Int 15h功能85h(按下SysReq键)。
若使用具有BIOS发行日期晚于1/10/86的PC XT,或在使用Personal
Computer AT、PC XT 286、PC Convertible或PS/2系统,那么处理完该键击
后,把AL置为02h,该中断就能使用Int 15h的功能91h(中断完成)。(更多的
信息可参见Int 15h的功能91h)。
对键击作出快速响应的TSR(终止并驻留实用程序)常截取并充当该中
379页
断的作用。由于键盘例程要进行大量的处理操作,因而对该中断来说,从普通
的BIOS键盘例程中截取键盘请求是一种更为可取的截取操作。若必须要求
快速响应,则使用Int 09h是最为理想的方法。
通信 Int 0Bh
COM1和COM3中断服务(PC、PCXT)
COM2和COM4中断服务(Personal Computer AT)
保留(PS/2)
当串行端口在IRQ3上发出中断时,调用此中断
调用寄存器:无
返回寄存器:无
注释:远程通信程序通常截取该中断向量。其它所有访问串行端口(BIOS或
DOS功能)的方法都不够快,不能处理超过1200 bps(位/秒)的速度(详细的
情况请参见第7章对“串行设备”和第11章对“中断处理程序”的介绍)。通过
连接此处定制的中断处理程序,再经过仔细的中断处理程序编程,程序员们就
能处理达到机器容量极限的速度(约38.4K bps)。
Int 0Ch处理此中断所不处理的COM端口。
遗憾的是,在PS/2上,该中断被列于保留行列。在PS/2上,必须重新编写
PS/2 在速度上依赖于此中断的通信程序。
通信 Int 0Ch
COM2和COM4中断服务(PC、PCXT)
COM1和COM3中断服务(Personal Computer AT)
保留(PS/2)
当串行端口硬件在IRQ4上发出中断时调用
调用寄存器:无
返回寄存器:无
注释:远程通信程序通常截取该中断向量。其它所有访问串行端口(BIOS或
DOS功能)的方法都不够快,不足以处理超过1200bps的速度(详细情况参见
第7章对“串行设备”和第11章对“中断处理程序”的介绍)。在这里,通过连接
定制的中断处理程序,并在经过仔细的中断处理程序编程后,程序员们就能处
理达到机器所能承受的极限速度(约38.4K字节/秒)。
Int 0Bh处理此中断处理程序所不能处理的COM端口。
380页
(PS/2)遗憾的是,在PS/2上,将此中断标记为保留对象,这样,在PS/2
必须重编写那些在速度上依赖于该中断的通信程序。
磁盘 Int 0Dh
磁盘管理(磁盘控制卡)(PC XT)
LPT2控制(Personal Computer AT)
保留(Ps/2)
指定使用硬件中断请求线IRQ5的硬件控制器时调用该中断
调用寄存器:无
返回寄存器:无
注释:仅在较新的ROM BIOS版本中才加进了此中断处理程序。它给出了一
种从PC XT开始的可用功能。
在Personal Computer AT上,用Int 0Dh进行LPT2处理(有关打印机服
务的讨论参见Int 0Fh)。
<PS/2>在PS/2上,Int 0Dh成为保留;它的功能被重新分布到别的地方。由
于很少有(如果有的话)程序直接使用该中断,因而对大多数程序员来说,这种
改变并未影响他们的工作。
磁盘 Int 0Eh
软盘管理
使用硬件请求线IRQ6的软盘控制器(硬件)时调用此中断。
调用寄存器:无
返回寄存器:无
注释:软盘控制器用Int 0Eh来检测磁盘传送操作是否完成。典型地,由于通
过该中断可实现的操作可以通过其它的BIOS功能来实现,因而可以忽略该
中断。大多数程序员都不使用这种中断。
使用硬件请求线IRQ7的内部打印机控制中断
调用寄存器:无
返回寄存器:无
381页
注释:在pc上,把Int 0Fh指派给打印机控制卡,以检测打印机是否出错,以
及打印工作是否完成。通常情况下程序员们并不使用Int 0Fh,因为许多打印
机控制器不一定产生该中断。通常也可忽略此中断。
若控制卡不能确定是哪一种设备请求服务。
8259 Priority Interrupt Controller(优先权中断控制器)也可按缺省值来产
生IRQ7请求(因为它是最低优先级的请求)。因此,不可能肯定地假设该处理
程序范围内的中断已被打印机初始化;它有可能在别的地方进行了初始化。
<PS/2> 在PS/2上,将Int 0Fh标记为保留;其功能被用到别的地方上。
显示
Int 10h 功能00h
设置视频模式
设置供视频接口卡使用的显示模式
调用寄存器: AH 00h
AL 显示模式(参见表15.4)
返回寄存器:无
表15.4显示模式
视频模式 模式类型 显示接口卡 象素分辨素 框大小 字符 颜色
00h 文本 CGA 320*200 8*8 40*2516(灰色)
EGA^^2 320*350 8*14 40*25 16(灰色)
MCGA 320*400 8*16 40*25 16
VGA^1 360*400 9*16 40*25 16
01h 文本 CGA 320*200 8*8 40*2516
EGA^^2 320*350 8*14 40*25 16
MCGA 320*400 8*16 40*25 16
VGA^1 360*400 9*16 40*25 16
02h 文本 CGA 640*200 8*8 80*25 16(灰色)
EGA^^2 640*350 8*14 80*25 16(灰色)
MCGA 640*400 8*16 80*25 16
VGA^1 720*400 9*16 80*25 16
CGA 640*200 8*8 80*25 16
03h 文本
EGA^^2 640*350 8*14 80* 25 16
MCGA 640*400 8*16 80*25 16
VGA^1 720*400 9*16 80*25 16
04h 图形 CGA/EGA/ 320*200 8*8 40*25 4
MCGA/VGA
05h 图形 CGA/EGA/ 320*200 8*8 40*25 4(灰色)
MCGA/VGA 320*200 8*8 40*25 4
06h 图形 CGA/EGA/ 640* 200 8*8 80*25 2
MCGA/VGA
382页
视频模式 模式类型 显示接口卡 象素分辩素 框大小 字符 颜色
07h 文本 MDA/EGA 720*350 9*14 80*25 Mono
VGA^1 720*400 9*16 80*25 Mono
08h 图形 PCjr 160*200 8*8 20*25 16
09h 图形 PCjr 320*200 8*8 40*25 16
0Ah 图形 PCjr 640*200 8*8 80*25 4
0Bh ——保留——
0Ch ——保留——
0Dh 图形 EGA/VGA 320*200 8*8 40*25 16
0Eh 图形 EGA/VGA 640*200 8*8 80*25 16
0Fh 图形 EGA/VGA 640*350 8*14 80*25 Mono
10h 图形 EGA/VGA 640*350 8*14 80*25 16
11h 图形 MCGA/VGA640*480 8*16 80*30 2
12h 图形 VGA 640*480 8*16 80*30 16
13h 图形 MCGA/VGA320*200 8*8 40*25 256
1增强的VGA模式;如果不是,VGA可以仿真该模式的CGA或EGA特征。
2当连接上一种增强的彩色显示器时为EGA模式;否则,仿真该字符的CGA特征。
注释:该功能设置视频模式,清除屏幕以及选择视频接口卡(如果出现不止一
个的时候)。要阻止在EGA、MCGA和VGA系统上出现屏幕清除操作,可把
AL的位7置为1。
显示
Int 10h 功能01h
设置光标类型
设置显示光标的高度。
调用寄存器: AH 01h
CH 在位0—4中(顶部)光标的开始扫描行
CL 在位0—4中(底部)光标的终止扫描行
返回寄存器:无
注释:该功能通过指定光标的开始和终止扫描行来设置文本模式光标的类
型。通过打开和关闭扫描行,视频显示系统就会显示出闪烁的光标。在CGA
中字符单元有8个扫描行,在EGA中字符单元有14个扫描行。要指定光标的
大小,应从0开始沿顶部向下计数扫描行的行数。
从第0行开始,分别指定字符框的起始和终止扫描行,即可控制文本模式
中光标的大小。在CH中指定起始扫描行;在CL中指定终止扫描行。例如,要
在配备有CGA的机器上产生出占用字符单元中较低两行的两行光标,可把
CX置为0607h。
许多程序员并未意识到在很多视频接口卡上光标交换是在字符单元内部
383页
进行的。若CH小于CL通常只显示单段光标。把CH设置为大于CL,就能创
建出双段光标。在某些接口卡上,进行这种光标类型交换的操作会禁止光标显
示。要在这些允许交换的系统上禁止光标,可设置CH=20h(无须改变CL的
值)。在其它的接口卡上,可能需要把光标定位在不能显示的地址上,如行25,
列0处。
对于所有的视频页面,只存在一种光标类型。若程序在不同的视频页上使
用不同的光标,那么当官改变屏幕页面时,必须管理操作并显式地改变光标。
对单色视频模式而言,缺省处理的起始行为0h;终止行为0Ch。而对于
彩色视频模式,缺省时的起始行为06h;终止行为07h。这些值提供了一种占据
两个扫描行高度的下划线光标;对于整块的光标,可把上述两种情况下的起始
行号都改变为0。
显示
Int 10h 功能02h
设置光标位置
用于指定显示光标的坐标。
调用寄存器: AH 02h
BH 页号(0代表图形模式)
DH 行(以0为基数)
DL 列(以0为基数)
返回寄存器:无
注释:在文本屏幕上,该功能把指定页的光标定位在某一指定的位置上。系统
允许跟踪每个可能显示页的单独光标位置,在文本模式中,最大可能的显示页
为8页。
当屏幕处于文本模式中时,所定义的位置与左上角(位置0,0)相对应。在
80*25文本模式中右下角的位置为79,24;在40*25文本模式中右下角的位
置为39,24。 DL和DH的有效范围的大小依赖于所对应的视频模式。如下表
所示:
80列的文本模式 40列的文本模式
DL=0到79 DL=0到39
DH=0到24 DH=0到24
通常情况下,把此光标替换出屏幕(通常使用位置0,25)就能关掉它。如
果打算在43行模式中装备有VGA的系统上或在VGA的50行显示模式中
运行程序,则应慎用此方法,因为这样做可能会回火(backfire)。
可以在任何页面上定位显示的光标,以便允许程序在屏幕未显示的页面
上处理扩展工作。这样,当完整的屏幕已准备好时,可以几乎同时把该光标显
384页
示给用户。表15.5列出了不同显示模式下的有效页号。只可以显示那些视频
接口卡有充足内存的显示页。例如,MDA只有一个显示页;其余的显示接口
卡(根据各自所处的模式)可以有0-7个显示页。
表15.5不同显示模式下的有效页号
页号 板式 接口卡
0—7 00-01h CGA,EGA,MCGA,VGA
0—3 02—03h CGA
0—7 02—03h EGA,MCGA,vGA
0 07h MDA
0—7 07h EGA,VGA
若在图形模式中工作,就必须把页号置为0。可用功能05h来设置当前显
示的页面。
显示
Int 10h 功能03h
读取光标位置和配置情况
返回光标坐标和类型。
调用寄存器: AH 03h
BH 页号
返回寄存器: BH 显示页号
CH 光标的起始行
CL 光标的终止行
DH 行
DL 列
注释:该功能用于获取当前光标位置并返回通过功能02h来定位光标时设置
的值。在80*25模式中,位置0,0为左上角;右下角的位置为79,24;在40*
25模式中,右下角的位置为39,24;左上角的位置同样为0,0。
该功能也返回光标的起始位置与终止位置(关于设置这些值的信息参见
功能01h)。在改变光标类型前,可以使用该功能来确定最理想的光标类型(因
而在程序完成其工作后,可恢复到该类型)。若程序必须在某个混合程序环境
中与其它程序共存,那么最好的办法就是把它的光标恢复到程序开始时的状
态。
并非所有程序都用BIOS来处理各自的光标定位。 TSR弹出式程序倾向
于绕过BIOS并直接到达视频控制器芯片;当这一过程实现时,所反馈的信息
是BIOS调用无意义。几乎没有什么办法可让其它的程序按你的意志行事,但
385页
至少能保证不受这些杂事的干扰。最好经常使用BIOS来进行光标定位,至少
对每一操作时最后重写的字符应采用此方法,这样可使得其它的程序能正确
地恢复他自己的光标位置和类型。
Int 10h 功能04h
显示 设置光标位置
返回光笔的坐标。
调用寄存器: AH 04h
CH 在位0-4中(顶部)光标的开始扫描行。
返回寄存器: AH 0,光笔未放下或未触发
1,光笔已放下或已触发
BX 象素列(0—39或0-639,根据实际模式而定)
CH 象素行(0—199)
CX 象素行(0-nnn,依实际模式而定)
DL 字符列(0—79或0—36,依具体模式而定)
注释:此功能读取光笔的状态和位置。在PC系统上,虽然鼠标比光笔应用得
更广泛,但有些应用程序却只使用光笔(其余的应用程序也可使用光笔)。在使
用光笔前,必须检查是否已激活光笔AH=1);。若未激活光笔,保存在其它寄
存器中的信息无意义,并应将其忽略。
光笔返回精确到只有两个扫描行的垂直位置。光笔的水平精确度不高于
2个象素(每扫描行320个象素)或4个象素(每扫描行640个象素)。因而,光
笔不适合于高分辨率的图形控制。在大多数单色监视器上,使用光笔的效果并
不理想,因为显示磷光有很长的映象保持时间。
PS/2系统(MCGA或VGA)不支持光笔(AH总是返回00h)。
显示
Int 10h 功能05h
选择活动的显示页
用于选择将被显示的视频显示页
调用寄存器: AH 05h
AL 所选择的页号(参见表15.6)
返回寄存器:无
注释:选择活动(要显示的)视频页的功能可用于CGA、MCGA、EGA和
VGA。不能将它用于单色接口卡,因为单色接口卡只有一个内存的显示页。表
15.6显示了有效的页数。
386页
表15.6有效的页号
页号 模式 接口卡
0-7 00h,01h CGA,EGA,MCGA,VGA
0-3 02h,03h CGA
0-7 02h,03h EGA,MCGA,VGA
0-7 07h,0Dh EGA,VGA
0-3 0Eh EGA,VGA
0-1 0Fh,10h EGA,VGA
注意,当该功能在处理其它型号时,其操作不同于PCjr,在PCjr中,AL
寄存器保存的是子功能代码而不是页号,并且BX保存着CRT以及CPU页
号,这种区别是最主要的,并且大多数PC参考手册缺乏可靠的信息。若需要
在这种机器上进行动画制作,可参见《PCjr技术参考手册》,且不必担心会有
意外的情况发生。
该功能在建立壮观的文本屏幕显示时特别有效。通过在某个未显示的页
面中建立屏幕并接着调用该功能来显示此屏幕,就能创建几乎是同时的屏幕
切换,并给程序一个令人难忘的漂亮外表。大多数重要的输出功能可以写给任
何页面。
显示
Int 10h 功能06h
上滚窗口
用于清空屏幕或将屏幕的某个已定义的区域向上滚动指定的行数。
调用寄存器: AH 06h
AL 要滚动的行数(若为0,表示清空整个窗口)
BH 面向已清空的区域所使用的属性
CH 行,左上角
CL 列,左上角
DH 行,右下角
DL 列,右下角
返回寄存器:无
注释:该功能(与Int10h,功能07h相反)用指定的属性把窗口初始化为空
白,或者将窗口上滚一个指定的行数。这种上滚功能将窗口中所有的行都往上
移动一行。同时在窗口的底部留出一空白行(用指定的属性),所消除的行是先
前位于该窗口的顶部(若要把新的行中填满文字,程序必须进行这项工作)。
可以使用这种面向窗口的功能来定义要在屏幕上清除(或上滚)的矩形区
387页
域,并在窗口中设置被清除行的属性字。
要清除窗口,可把AL置为0或大于此窗口中行数的值。《IBM技术参考
手册》早期版本中的BIOS列表显示了这种功能的实现方式;即“清除一行,减
少一个计数”,直到该计数达到零(在技术参考手册的当前版本中,IBM删去
了BIOS程序清单。若使用这一算法,那么把AL置为0来实现“清除窗口”比
把AL设置为 25(或其它大于所要清除的矩形高度的值所占用的时间要长一
些。除非应用程序是极端的屏幕灵敏型的程序,否则把AL设置为0所造成的
时间误差可以忽略不计。
必须明白的是:在某些BIOS实现程序上,只有把AL置为0才能实现屏
幕清除。如果不是把AL置为非零值而是大于屏幕行数的值,其结果往往是难
以预料的。有了这种概念,若想清除整个屏幕,这时就会想到只需要设置屏幕
模式(功能00h)就行了。若只想清除屏幕中的一部分(仅仅只清除某个指定的
窗口),此时应确保把AL置为0就能保证程序与所碰到的一切BIOS实现程
序兼容。
该功能只对活动的显示页起作用。
显示 int 10h 功能07h
向下滚动窗口
用来把屏幕中某个指定区域里的文本屏幕下滚一个指定的行数
调用寄存器: AH 07h
AL 下滚的行数(若为0表示清除了整个窗口)
BH 为所清除的区域而使用的属性
CH 行,左上角
CL 列,左上角
DH 行,右下角
DL 列,右下角
返回寄存器:无
注释:该功能通过用指定的属性或者把窗口下滚一指定的行数来把窗口初始
化为空白。使用该功能(与Int 10h的功能06h相反)可下滚屏幕。这种下滚功
能把窗口中所有的行都下滚一行,这样就在此窗口的顶部增加了一个空白行
(用指定的属性),并消除了先前曾在该窗口底部的那一行(如果必须将新的一
行填满文字,程序就得处理这项工作)。
可以使用这一面向窗口的功能来定义屏幕上所要清除(或下滚)的矩形区
域,并在窗口中设置被清除行的属性字。
要清除窗口,可把AL置为0或一个大于此窗口中行数的值。《IBM技术
参考手册》早期版本中的BIOS清单介绍了这种功能的实现方式,即为:“清除
388页
一行,减少一个计数”,直到该计数达到零(《IBM技术参考手册》的当前版本
删去了BIOS的程序清单)。若使用这种算法,那么把AL置为0来实现“清除
窗口”比把AL设置为25(或其它大于所要清除的矩形高度的值)所用的时间
要长一些。除非所用的应用程序对屏幕的大小极为敏感,否则可以不考虑由于
把AL设置为0所造成的时间上的差异。
该功能只对当前活动的显示页起作用。
显示:
Int 10h 功能08h
读取字符和属性
在当前的光标位置上返回字符和属性。
调用寄存器: AH 08h
BH 显示页
返回寄存器: AH 属性字节
AL ASCII字符
注释:该功能在光标的当前位置读取字符和属性字节(用于指定的显示页)。
由于可以从屏幕中直接读取这种信息,因而既不用在程序中保存关于屏幕的
信息,也不必千方百计地从一道程序到另一道程序的转换过程中绕过屏幕显
示。屏幕就处在屏幕内存中。
TSR拼写检查实用程序和TSR词库实用程序使用该功能来读取屏幕,
以便这两种实用程序能终止所要检查的词。但是,若要编写这种实用程序,则
应谨慎从事。因为有些程序可直接访问内存,而不必更新屏幕光标,这时,功能
01h至03h中所介绍的光标也可能不指示到你想要的字。
显示
Int 10h 功能09h
写入字符属性
从光标位置开始,用所定义的属性来保存指定的字节个数。
调用寄存器: AH 09h
AL 字符
BH 显示页
BL AL中字符的属性字节
CX 要写入的字符个数
返回寄存器:无
注释:从指定显示页上的当前光标位置开始,该功能把字符和属性字节逐一
389页
地写到屏幕上。使用该功能可以把多个字节快速地写到屏幕上(所有的字符和
属性必须相同)。
在文本模式中,该功能可以把多达65536个字节写到屏幕上(通常情况
下,最大的文本模式显示有132列、50行,能在一个显示页内容纳6600个字
符,但在随后的显示页上若出现这么多的字节则会溢出)。随着该功能不断地
写入字符,它会不断地换行,即从前一行的未尾写至下一行的开头。在图形模
式中,该功能则只能从一行的开头写至该行的末尾。在每个字符不断地出现在
屏幕上时,光标的位置没有改变。
对于使用该功能来说,有一种令人感兴趣的方式:即在调用该字符输出功
能之前,清除屏幕上某个区域文字项。可以用不同的颜色属性来设置这个区域
以使它格外醒目。由于该功能可以清除一个比屏幕还要大的区域。因此可根
据数据项的需要,随意设置区域的大小。同时,由于光标位置未变,因而在输入
数据项之前没有必要重新定位光标。
在图形模式中,可使用BL内的视频属性字节来确定所要写入的字符颜
色。但是,若设置了位7,那么在显示字符时,BL中的值就XOR(异或)上了背
景颜色(这种功能很有用)。这样的话,若打开位7,在图形模式中把字符写到
显示器并重写该字符时,就能从屏幕中擦除该字符。
在图形模式中,用于代码80-FFh的字符出自于一个其地址被保存在中
断向量1Fh中的位图表。通过把此指针重置为指向你自己的某个位图表,就
能创建你自己的字符表(关于位图字符表的情况可参见对功能1Fh的讨论)。
用于代码00-7Fh的字符由不能重置的ROM字符表产生(EGA和VGA用户
可以重置常规的显示字体;具体可参见Int 10h功能11h)。
显示
Int 10h 功能0Ah
在光标处写入字符
从光标位置开始,保存指定的字符个数
调用寄存器: AH 0Ah
AL 字符
BH 显示页号
BL AL中字符的颜色(只限于图形模式)
CX 要写入字符和属性字数
返回寄存器:无
注释:该功能(除了不能在文本模式中设置字符的属性字节外,该功能等同于
功能09h)可在指定显示页的当前光标位置处写入一定数量的字符。每个字符
所写入的位置处的属性继续保持不变。
若想把许多字符快速地写给屏幕,最好使用该功能。在文本模式中,该功
390页
能可以把多达65536个字符写给屏幕。随着该功能不停地写入字符,它也会不
断地换行(即从前一行的未尾写向后一行的开头,如此不停地循环下去)。在图
形模式中,该功能则只能写满一行,即从该行的开头写至未尾,而不能换行。在
整个操作过程中,光标的位置始终保持不变。
在图形模式下,BL确定了所要写入的字符的颜色。但是,若设置了位7,
那么在显示字符中,BL中的值就被XOR(异或)上背景的颜色。对于擦除屏幕
上的字符来说,该功能十分有效,即只需在图形模式中打开位7,再把字符写
给显示并接着重写该字符,就能实现这个目的。
在图形模式中,用于代码80-FFh;的字符出自于一个其地址被保存在中
断向量1Fh中的位图表。通过把指针重新设置为指向你自己的某个位图表,
即可创建出相应的字符表(关于位图字符表的情况,可参见对功能1Fh的讨
论)。用于代码00-7Fh的字符由不能重置的ROM字符表产生(EGA/VGA用
户能重新设置常规的显示字体,具体可参见Int 10h功能11h)。
显示
Int 10h 功能0Bh
设置色彩调色板
选择用于图形显示的颜色。
调用寄存器: AH 0Bh
BH 要设置的调色板的ID号
0,BL拥有背景颜色和边框颜色
1,BL拥有调色板颜色
BL 为这种色彩ID所使用的色彩值
CL 在位0-4中(底部)光标的终止扫描行
返回寄存器:无
注释:当BH为1时,该功能选择或设置用于中分辨率(4色的)图形显示如
模式4的调色板的内容,该功能对内存没有直接的影响。或者可以说通过解释
代码和改变彩色,该功能可以影响6845控制器解释视频内存的方式。用该功
能来迅速地改变调色板,就能产生一次显示清空。功能10h提供了其它的用于
PCjr、EGA、VGA、和MCGA的调色板控制。
在文本模式中(BH=0),此功能设置屏幕的边框色彩。
表15.7列出了该功能可以设置的有效色彩调色板。
表15.7色彩调色板
调色板 象素 颜色
0 0 同背景一样
1 绿色
391页
调色板 象素 颜色
2 红色
3 褐色
1 0 同背景一样
1 青蓝色
2 品红色
3 白色
显示
Int 10h 功能0Ch
写入图形象素
在光标的当前位置处把单个象素写到屏幕上。
调用寄存器: AH 0Ch
AL 颜色值
BH 页号
CX 象素列数
DX 象素行数
返回寄存器:无
注释:该功能能够在指定的图形坐标上把单个象素写到屏幕上,这是一个最
基本的图形绘图服务。复杂的图形处理功能是由设置屏幕象素的值的操作集
合来建立的。
在中等分辨率模式中,该功能能否获得最佳效果依赖于所使用的调色板。
高分辨率的CGA(模式5允许从4种颜色的调色板中设置出象素。使用该功
能时,若把AL的位7置为1,则新的颜色为当前象素XOR(异或)的结果;通
过把该象素写入第二次即可擦除该象素。
根据所使用的图形模式,该功能可以定址的屏幕位置范围,在纵向上为0
—199或0—349;在横向上为0—319或0—639。由模式所规定的屏幕边限的
具体情况可参见表15.4。表15.8给出了此功能使用的有效的页号(BH寄存
器)。
表15.8有效的页号
页号 模式 接口卡
0—7 0Dh EGA,VGA
0—3 0Eh EGA,VGA
0—1 0Fh,10h EGA,VGA
392页
显示
Int 10h 功能0Dh
读取图形象素
返回指定屏幕坐标上象素的颜色。
调用寄存器: AH 0Dh
BH 页号
CX 象素列数
DX 象素行数
返回寄存器: AL 颜色值
注释:此功能用于获取指定图形坐标处理象素的颜色值。该功能经常用于显
示游戏和高级图形应用程序中。在显示游戏中,它的作用是确定冲突。当高级
的图形程序在屏幕上移动一个图形对象时,可用此功能来确定边界。
垂直方向上的地址限制为0—199或0—349,水平方向上的地址为0—
319或0—639,具体的上限要看使用的是哪一个显示模式。可查阅表15.4来
看看各种显示模式下的地址上限。 BH中可设置的有效页号可参见表15.8。
显示
Int 10h 功能0Eh
以电传方式写文本
用带限制的控制处理来输出字符。
调用寄存器: AH 0Eh
AL 字符
BH 显示页(字符模式)
BL 前景颜色(图形模式)
返回寄存器:无
注释:即使屏幕为旧式的电传机器,该功能也能够把文本写入屏幕。该功能解
释用于响铃(07h)、退格(08h)、回车(0Dh)和换行(0Ah)的ASCII字符代码,
以便相应地拉响控制台响铃、退回光标、把光标移到该行的开头或移至下一
行。其余所有的控制字符,包括标记字符和换页字符都被显示出(闪烁的外表、
指示箭头等等)而不是受到了影响。写操作完成后,光标移至下一个字符位置。
尽管在某种程度上略有一些古体风格(这使得你会想到旧的电传打字
机),但该功能的确是很有用的。 DOS将它用在控制台驱动程序中,把操作系
统的文本和信息送至屏幕上。
若在注明日期为4/24/81和10/19/81的PC BIOS ROM上用功能0Eh
来工作,BH寄存器就必须指向当前被显示的页面。若使用日期更晚的ROM,
393页
则该功能既可在已显示的页上又可以在未显示的页上工作。
功能0Eh与其它显示功能间的主要区别在于它除了能换行或上滚行外,
还能自动地处理常规的响铃、换页、换行和回车等的控制功能。尽管该功能不
允许改变所写入字符的视频属性,但对于简单的输出而言,该功能是最理想的
使用对象。
即使在未显示的页面上工作,响铃字符也能拉响系统警铃以引起所有后
台操作的注意。遗憾的是该功能不能把tab字符扩展到指定的位置。
显示:
Int 10h 功能0Fh
获取当前显示模式
返回视频显示模式、屏幕宽度和活动页号。
调用寄存器: AH 0Fh
返回寄存器: AH 屏幕上的列数
AL 显示模式(参照表15.4)
BH 活动的显示页
注释:该功能可获取视频控制器的显示模式,包括字符列数和当前显示页,在
程序初始化过程中,该功能最有用。可以用功能0Fh来确定显示系统的当前
设置,从而当程序操作完成时,可以把显示系统恢复到其初始化显示模式。
若要编写TSR(终止并驻留)实用程序,弄清当前的显示模式就显得极其
重要,因为在另一应用程序的运行过程中,TSR实用程序会突然出现在屏幕
上。实用程序可以在字符屏幕上运行,但该实用程序被启动时,具有控制权的
程序可能已经在使用某个你并不想使用的模式。在大多数情况下,早期的
TSR不能正确地处理屏幕显示,显示的结果往往就像是计算机内已爆炸了一
颗炸弹。
尽管可以用功能0Fh来确定屏幕的宽度,但建议你最好设置想要使用的
模式,而不是去费力地弄清已存在的是什么模式。
显示:
Int 10h 功能10h
设置调色板寄存器
在PCjr、EGA、VGA和MCGA视频控制器中控制调色板寄存器上的操作。
调用寄存器: AH 10h
AL 00h设置调色板寄存器
BX 0712h为唯一允许的值(仅限于MCGA)
BH 彩色值
394页
BL 要设置的调色板
AL 01h,设置边框彩色寄存器(不用于MCGA)
BH 彩色值
AL 02h,设置所有的寄存器和边框(MCGA除外)
ES:DX 指向17字节彩色列表的指针
AL 03h,闪烁/亮度切换
BL 闪烁/亮度 位
00h 允许亮度
01h 允许闪烁
AL 07h,读取调色板寄存器(仅用于VGA)
BL 读调色板寄存器(0—15)
AL 08h,读取过扫描(边框)寄存器(仅用于VGA);
AL 09h,读取调色板寄存器和边框(仅用于VGA)
ES:DX 指向保存值的17字节表的指针
AL 10h,设置单独的彩色寄存器(仅用于VGA和
MCGA)
BX 要设置的彩色寄存器
CH 要设置的绿色值
CL 要设置的蓝色值
DH 要设置的红色值
AL 12h,设置彩色寄存器块(仅用于VGA和
MCGA)
BX 要设置的第一个彩色寄存器
CX 设置彩色寄存器数
ES:DX 指向彩色值的指针
AL 13h,选择彩色页面(仅用于VGA)
BL 00h,选择分页模式
BH 分页模式
00h 64个寄存器中的4寄存器块
01h 16个寄存器中的16寄存器块
AL 13h选择彩色页面(仅用于VGA)
BL 01h选择页面
BH 分页号
00-03h代表64个寄存器块
00-0Fh代表16个寄存器块
AL 15h,读取彩色寄存器(仅用于VGA和MCGA)
BX 要读取的彩色寄存器
AL 17h,读取彩色寄存器块(仅用于VGA和
395页
MCGA)
BX 要读取的第一个彩色寄存器
CX 要读取的彩色寄存器的个数
ES:DX 指向保存有彩色寄存器值的缓冲区的指针
AL 18h,更新视频DAC屏蔽寄存器(仅用于VGA
和MCGA)
BL DAC屏蔽寄存器的值
AL 19h,读取DAC屏蔽寄存器(仅用于VGA和
MCGA)
AL 1Ah,读取彩色页状态(仅用于VGA)
AL 1BH,将彩色值相加变换成灰度(仅用于VGA
和MCGA)
BX 要相加的第一个彩色寄存器
CX 要相加的彩色寄存器个数
返回寄存器:子功能 07h—08h
BH 读取的值
子功能09h
ES:DX 指向17字节表的指针
子功能15h
CH 读取的绿色值
CL 读取的蓝色值
DH 读取的红色值
子功能17h
ES:DX 指向彩色表
子功能19h
BL 读取的值
子功能1Ah
BL 当前分页模式
CX 当前页
注释:在PCjr、MCGA、EGA和VGA显示系统上,该功能通过子功能来控制
对应于不同象素值的颜色。虽然在IBM Personal Computer AT BIOS上将该
功能列为保留,但它仍然是BIOS的扩展,可应用于EGA和VGA显示系统。
本功能的详细说明超出了本书的范围,对直接的显示系统编程有兴趣的
读者可以从本书前面的书目提要为指南,以便系统地阅读本书对此功能各个
方面的介绍。
<PS/2> 在PS/2 Model 30系统上,有些子功能是不可用的(调用这些功能
时,它们的子功能号由AL中的内容指定)。这些子功能分别是01h、02h、07h、
08h、09h、13h和1Ah。
396页
显示:
Int 10h 功能11h
字符生成程序
支持图形字符生成程序的功能,允许设置各自的字符生成程序表。
调用寄存器: AL 00h用户字母装载
(用于EGA、VGA和MCGA)
BH 每字符的字节数
BL 要装载的块
CX 要保存的计数
DX 表中的字符偏移
ES:BP 指向用户表的指针
AL 01h,ROM单色集(用于EGA和VGA)
BL 要装载的块
AL 02h,ROM 8*8双点(用于EGA、VGA和
MCGA)
BL 整块装载
AL 03h,设置块说明符(用于PCjr,EGA、VGA和
MCGA)
BL 字符生成程序块选择
AL 04h,装载8*16ROM(用于VGA和MCGA)
AL 10h,用户字母装载(用于EGA、VGA和
MCGA)
BH 每字符的字节数
BL 要装载的块
CX 要保存的计数
DX 表中的字符偏移值
ES:BP 指向用户表的指针
AL 11h,ROM单色集(用于EGA和VGA)
BL 要装载的块
AL 12h,ROM8*8双点(用于EGA、VGA和MC-
GA)
BL 要装载的块
AL 14h,装载8*16ROM(用于VGA和MCGA)
AL 20h,在1Fh上设置用户图形字符指针(用于
EGA、VGA和MCGA)
ES:BP 指向用户表的指针
397页
AL 21h,在43h处设置用户图形字符指针(用于
EGA、VGA和MCGA)
BL 行说明符
CX 每字符字节数
ES:BP 指向用户表的指针
AL 22h,ROM8*14集(用于EGA、VGA和MC-
GA)
BL 行说明符
AL 23h,ROM8*8双点(EGA、VGA和MCGA)
BL 行说明符
AL 24h,ROM8*16(用于VGA)
BL 行说明符
BH 每屏幕的行数
AL 30h,字体信息(用于EGA、VGA和MCGA)
BH 字体指针
返回寄存器:随子功能的改变而变化
注释:尽管IBM Presonal Computer AT BIOS将该功能列为保留,但它依然
是BIOS的扩展,可应用于EGA和VGA显示系统。
本功能的详细说明超出了本书的范围。对直接的显示系统编程有兴趣的
读者可以本书的目录为指南来参看各方面的信息。
在PS/2 Model 30上,以下几种子功能是不能使用的(各子功能号是由
AL中的内容确定的),它们分别是:01h、10h、11h、12h和22h。
显示
Int 10h 功能12h
备用选择
提供EGA(和EGA的PS/2仿真)的其它控制。
调用寄存器: AH 12h
AL 00h,允许子功能31h-34h以及36h
01h,禁止子功能31h-34h以及36h
BL 10h,返回EGA信息
BL 20h,选择备用的打印屏幕例程
BL 30h,选择用于A/N模式的扫描行
AL 扫描行数
00h 200个扫描行
398页
01h 350个扫描行
02h 400个扫描行
BL 31h,在设置模式命令操作期间控制调色板的
装入
BL 32h,视频开/关
BL 33h,求和至灰色阴影转换的开/关
BL 34h,光标仿真
BL 35h,视频显示切换
AL 00h,初始的接口卡视频关
01h,初始的接口卡视频开
02h,关掉活动的视频
03h,打开不活动的视频
ES:DX 指向128字节的保存区域的指针(用于AL=
00h、02h或03h)
BL 36h,视频清除控制
返回寄存器:子功能10h
BH 缺省BIOS视频模式
00h 彩色
01h 单色
BL EGA视频RAM的总数
00h 64K
01h 128K
02h 192K
03h 256K
CH 功能位
CL 配置切换设置
子功能30h-36h
AL 12h
注释:虽然IBM Personal Computer AT BIOS将该功能列为保留,但它仍然
是BIOS的扩展,可应用于EGA/VGA显示系统。
本功能的详细说明超出了本书的范围。对直接的显示系统编程有兴趣的
读者可以本书的目录为指南,全面地了解该功能的有关信息。
显示
Int 10h 功能13h 〈AT〉
写入串
399页
把ASCII串写到显示器上。
调用寄存器: AH 13h
AL 写入模式(参见表15.9)
BH 视频页
BL 属性(写入模式0和1)
CX 串长度
DH 串写入的行
DL 串写入的列
ES:BP 指向串的指针
返回寄存器:无
表15.9写串的模式
模式 注 释
0 BL中的属性。串只能是字符。未更新光标。
1 BL中的属性。串只能是字符。已更新光标。
2 串可采用字符或属性。未更新光标。
3 串可采用字符或属性。已更新光标。
注释:仅仅在BiOS日期为1/10/86或以后的PC XT Personal Computer AT
以及PS/2系列的机器上该功能才可用,其作用就是把字符串写到当前活动
的显示页上。
可用该功能来标识某个串(通过字符的嵌入或全局属性来标识),并接着
把它写给屏幕。由于该功能依靠其它的BIOS功能来写入串,因而其速度不是
很快。
功能13h是用电传式中断(Teletype interrupt)(Int 10h,功能0Eh)来进行
输出的,这就决定了它通过把光标回移一个位置、拉响控制台报警器、下移一
行或把光标移至当前行的开头的方式来分别响应退格(ASCII 08h)、响铃
(ASCII 07h)、换行(ASCII 0Ah)以及回车(ASCII 0Dh)等字符。它还能实现显
示行的下滚和上滚。
显示
Int 10h 功能1Ah < PS/2>
读或写显示器代码
读或写显示器代码。
调用寄存器: AH 1Ah
AL 00h,读取显示器代码
BH 备用显示器代码
400页
AH 01h,写显示器代码
BL 活动的显示代码
返回寄存器:如果读显示器代码:
BH 备用的显示器代码
BL 活动的显示器代码
如果写显示代码:
AL 1Ah,已改换的代码
注释:这一功能只被PS/2各型号的系统支持,它允许读或写显示器的代码。
可供使用的代码如下表所示:
值 含 义
00h 无显示
01h 具有单色监视器的Mono
02h 具有彩色监视器的CGA
03h 保留
04h 具有彩色监视器的EGA
05h 具有单色监视器的EGA
06h 具有彩色监视器的Professional Graphics System
07h 具有模拟单色监视器的VGA(不能用于Model 30)
08h 具有模拟彩色监视器的VGA(不能用于Model 30)
09h 保留
0Ah 保留
0Bh 具有模拟单色监视器的MCGA(用于Model 30)
0Ch 具有模拟彩色监视器的MCGA(用于Model 30)
0Dh- FEh 保留准备扩展用
FFh 未知的监视器类型
在确定与系统相连接的监视器的类型时,这些代码非常有用。
PS/2
Int 10h 功能1Bh
获取显示状态
(显示)提供与视频系统的具体信息有关的51个字节。
调用寄存器: AH 1Bh
ES:DI 指向64个字节的缓冲区以接收视频状态信息。
返回寄存器: AL 若缓冲区内容有效则为1Bh
注释:该功能只能用于PS/2计算机系统上。若要返回的内容是具有51个字
节的指定数据,则需要用64字节的缓冲区,因为此缓冲区中有13个字节作为
401页
保留。在将来的系统上或许会用到这些保留的字节。
本功能详细的说明超出了本书的范围。对显示系统编程有兴趣的读者可
以本书的目录来详细地了解相关信息。
PS/2
Int 10h 功能1Ch
保存/恢复显示状态
保存或恢复VGA显示系统的状态。
调用寄存器: AH 1Ch
AL 00h,返回所需要的缓冲区大小
01h,保存视频状态
02h,恢复视频状态
CX 请求状态的位图
FEDCBA98 76543210
.. . . . . . . . . . . . . . 1 视频硬件
.. . . . . . . . . . . . . 1. 视频BIOS
.. . . . . . . . . . . . 1. . 视频DAC和彩
色寄存器
0000000000000. . . 未使用
ES : BX 若AL=01或02,则指向视频状态信息的缓冲区
返回寄存器: AL 1Ch如果结果是有效的
BL 为保存缓冲区而请求的64字节块数
注释:该功能只适用于PS/2系列中的50、60和80型号,可用它来保存或恢
复VGA特有的状态信息;如数字视频至模拟视频转换器的状态,彩色寄存器
的状态以及驱动程序数据区的状态。在保存过程中VGA的状态是不稳定的;
必须在保存操作之后跟着进行恢复操作。
如果结果有效,该功能通过AL返回1Ch;其余的任何值都表示不支持此
功能(例如,未安装VGA或安装了非标准的VGA)。
本功能的详细说明超出了本书的范围。直接对显示系统编程有兴趣的读
者可以参照本书的目录,以掌握更多的信息。
显示
Int 10h 功能4Fh 子功能00h
返回Super VGA信息
在此处的VESA功能,其作用是返回所支持的super VGA功能的数据。
402页
调用寄存器: AH 4Fh
AL 00h
ES:DI 256字节缓冲区的地址
返回寄存器: AX 状态(参见表15.10)
ES:DI 256字节缓冲区的地址,其结构如下:
字节03,标记(‘VESA’)
字节4,次版本号
字节5,主版本号
字节6-9,指向ASCIIZ的指针OEM串
字节10-13,当前定义和未使用的功能位,必
须为零
字节14-17,指向受到支持的模式列表的指
针,通过FFFFh结尾的字列表来表示。
(标准VESA显示模式的信息可参见
表15.11)
注释:在调用其它VESA功能之前(都通过Int 10h,功能4Fh进行访问),必
须调用该功能来确定所支持的VESA状态。
表15.10 VESA状态返回值
寄存器 含义
AL = 4Fh 支持此功能
AH=0 功能成功地返回
AH=1 功能失败
AH=2-FF 保留(必须当作失败处理)
表15.11标准的VESA显示模式
模式号 分辨率 颜色数
100h 640*400 256
101h 640*480 256
102h 800*600 16
103h 800*600 256
104h 1024*768 16
105h 1024*768 256
106h 1280x1024 16
107h 1280*1024 256
6Ah 800 *600 16
注意:在得到支持的情况下,可使用标准的VGA BIOS模式Select(设置)
403页
调用(功能00)来设置6Ah模式。
显示
Int 10h 功能4Fh 子功能01h
返回Super VGA模式信息
VESA在此处的功能是返回指定模式的信息。
调用寄存器: AX 4F01h
CX 所期望的模式
ES:DI 256字节缓冲区的地址
返回寄存器: AX 状态(参见表15. 10)
ES:DI 256字节缓冲区的地址,其结构如下:
字节0—1,模式属性,其位图分布如下:
位0,当前显示器支持的模式
位1,任选的信息块有效
位2,支持BIOS文本功能
位3,彩色模式
位4,图形模式
字节2,窗口A属性,其位图分布如下:
位0,支持窗口
位1,窗口是可读的
位2,窗口是可写的
字节3,窗口B属性,其位图分布同上
字节4-5,窗口粒度(最小的增量可用于选
择显示窗口页的起始地址)
字节6-7,窗口大小(显示内存页的大小
以千字节计算)
字节8-9,窗口A段
字节10-11,窗口B 段
12-15,指向显示内存窗口功能指针
字节16-17,每扫描行的字节数
以下为可选择的字段:
字节18-19,水平分辨率,按象素计算(图
形)或按字符计算(文本)
字节20-21,重直分辨率,按象素计算(图
形)或按字符计算(文本)
字节22,按象素计算的字符单元宽度
404页
字节23,按象素计算的字符单元高度
字节24,内存位平面数目
字节25,每象素的位数
字节26,存储区(bank)数
字节27,内存模型
0=文本模式
1=CGA图形
2=Hercules图形
3=4平面图形
4=压缩象素图形
5=非链接的4256彩色图形
6-0F,为VESA所保留
10-FF,生产厂家定义的
字节28,存储区(bank)大小
注释:由于可选字段被预先定义,因而标准的VESA视频模式不要求这些字
段。
显示
Int 10h 功能4Fh 子功能02h
设置Super VGA显示模式
VESA在此处的功能是设置某种显示模式。
调用寄存器: AH 4F02h
BX 显示模式号
返回寄存器: AX 状态(参见表15.10)
注释:模式值必须遵循VESA编号的约定:
位0-8模式号
位9-14留作未来扩展(必须为0)
位15 0,清除内存
1,保存内存
显示
Int 10h 功能4Fh 子功能03h
返回Super VGA显示模式
VESA在此处的功能是获取当前显示模式。
调用寄存器: AH 4F03h
返回寄存器: AX 状态(参见表15.10)
405页
BX 当前显示模式
注释:模式值必须遵循VESA编号的约定:
位0-8 模式号
位9-14 留作未来扩展(必须为0)
位15 0,清除内存
1,保存内存
显示
Int 10h 功能4Fh 子功能04h
保存/恢复Super VGA视频状态
VESA的这一功能是保存和恢复视频状态信息。
调用寄存器: AH 4F04h
DL 子功能
0,返回状态缓冲区的大小
1,保存状态
2,恢复状态
CX 要保存或恢复的状态
位0,视频硬件
位1,视频BIOS数据
位2,视频DAC状态
位3,视频Super VGA状态
ES:BX 指向保存缓冲区的指针(子功能1和2)
返回寄存器: AX 状态(参见表15.10)
BX 需要保存的64字节的块数
指定一个或多个状态(仅限于子功能0)
注释:程序必须先调用子功能0来确定所要求的缓冲区的大小,然后才能安
全地调用子功能1和2。
显示
Int 10h 功能4Fh 子功能05h
显示内存窗口控制
VESA在此处的功能是选择显示内存页或确定要显示的页。
调用寄存器: AH 4F05h
BH 子功能
0,选择显示的内存页号
1,返回当前显示页号
406页
BL 窗口号
0、A
1,B
DX 以粒度为单元的当前页面起始地址
(仅限于子功能0)
返回寄存器: AX 状态(参见表15.10)
DX 以粒度为单元的当前页面起始地址
(仅限于子功能1)
注释:该功能可以直接由某个远程调用进行调用。该功能的地址可通过执行
功能1来保存,是一个位于缓冲区中偏移量为12(0Ch)处的双字指针。若直接
调用,就无需设置AL此时无状态返回,并且AX和DX均被破坏。
系统
Int 11h
获取设备状态
调用寄存器: 无
返回寄存器: AX 设备状态字(参见表15.12)
表15.12设备状态字
位 含 义
0 1=已安装磁盘驱动器
1 1=已安装数学协处理器
2-3 系统板RAM
00=16K
01=32K
10=48K
11=64K
2 指向已安装的设备=1(仅用于PS/2系列)
3 未使用(仅限于PS/2)系列
4-5 初始的视频模式
01=40*25彩色
10=80*25彩色
11=80*25单色
6-7 磁盘驱动器数(如果位0=1)
00=连接有1个驱动器
01=连接有2个驱动器
10=连接有3个驱动器
11=连接有4个驱动器
407页
位 含 义
8 未使用
9-11 已连接的串行卡数
12 1=已安装游戏接口卡
12 未使用(仅限于PS/2系列)
13 未使用
13 1=已安装内部调制解调器(仅限于PS/2系列)
14-15 已连接的指针数
注释:在引导过程中,可设置硬件状态字节来指明哪一设备已附加给计算机。
例如,位6和7代表已附加进系统的软盘驱动器号。引导了系统之后,状态字
节就不再改变。
对于那些必须让程序适应现存设备的程序员们来说,该功能极其有用。通
过检查串行端口、磁盘驱动器、打印机以及其它设备,程序就能简化它与用户
程序之间的交互作用。对那些必须询问系统特征的程序来说,运行的难易依赖
于用户对PC的理解程度以及对这些问题所作的答复。程序提出的问题越少,
用户就越容易使用它。
从表15.12中我们可以看出,根据不同的计算机类型,不同位的含义也相
应地发生了改变。要确定你所使用的是什么类型的机器,可检查地址FFFF:
FFFE处的计算机标记。
系统
Int 12h
获取内存大小
调用寄存器:无
返回寄存器: AX 1K内存块的数目
注释:在开始系统内存的检查过程中,该中断程序返回所找到的具有连续1K
内存的块数。需要注意的是,此处的中断所写的有关内容,对于标准PC或兼
容计算机的母板开关设置的信息没有关系(此功能得不到这些开关信息)。
由于是通过Power-on SelfTest(POST),开电自检来确定内存的,因此,若
因故障导致内存检查失败,那么返回的数字就是不正确的(发生这种情况时,
该中断在出错前返回找到的内存块数)。在检查过程中,POST假定所有已安
装的内存都能使用,并且从0至640K内存都是连续的。
用何种方法来确定可用的内存由系统来决定,但无论哪种方法都采用了
尝试操作的手段,即先写入内存块,并接着从内存块中读取内存。只要这种写
和读循环之一失败,该中断就假定已达到了内存的终点。
408页
当存在640K以上的内存时,必须调用Int 15h的功能88h,以确定扩展内
存的大小。
在PS/2系统上,该中断最多只能返回640K的内存,减去了单独为扩充
BIOS数据区(EBDA)而设置的内存数量。EBDA可以小到只有1K(更多的信
息可参见Int 15h的功能C1h)。
磁盘:
Int 13h 功能 00h
重新设置磁盘系统
重新设置磁盘驱动器的控制器。
调用寄存器: AH 00h
DL 驱动器号(以零为基准)
位720代表软盘;,1代表硬盘
返回寄存器:进位标志清除表示成功
进位标志置位表示出错
AH返回代码(参见表15.13)
注释:为作好磁盘I/O操作的准备工作,该功能重新设置磁盘控制器(对于处
理关键的磁盘访问出错来说,重新设置磁盘系统很有必要)。强迫驱动器把磁
头压入磁道0,并从磁道0中开始下一个I/O操作,该功能就能重新校准磁
盘。
请求重置操作不会引起磁盘系统立即作出反应。相反,在磁盘控制器中设
置重置标志以重新校准下一次它们将要使用的驱动器。在磁盘出错之后,有时
可能会听到因重新较准磁盘而导致的难听的响声。
一旦设置了DL中的驱动器号的高位,那么就会重新设置软盘系统,并接
着重新设置硬盘(固定磁盘)。错误返回就是指硬盘的重置。可以在BIOS数据
区的0040:0041h处找到软盘状态。
在试图使用软盘系统时若返回了错误,那么此时就是使用该功能的最佳
时机。当问题产生时,必须调用重置功能,并且该功能必须重试。根据所用程
序的不同,有时可能要求多次重试。在重试过程中,若获得了一连串的失败,这
时就应提醒用户中止重试循环。
磁盘
Int 13h 功能 01h
获取磁盘系统状态
返回磁盘状态字节。
调用寄存器: AH 01h
DL 驱动器代码(仅用于PS/2和扩展的BIOS)
409页
返回寄存器:状态字节(参见表15.13)
表15.13
位
含 义
76543210
. . . . . . . 1 对驱动程序不合法的命令
. . . . . . 1. 未定位地址标记(坏的扇区)
. . . . . . 11 磁盘写保护
. . . . . 1. . 未找到所请求的扇区
. . . . . 11. 活动的磁盘改变线路
. . . . 1. . . DMA超限
. . . . 1. . 1 0MA试图越过64K界限
. . . . 11. . 无效的介质
. . . 1. . . . 磁盘读的CRC出错
. . 1. . . . . 控制器出错
.1. . . . . . 查找失败
1. . . . . . . 磁盘超时(不能应答,驱动器未准备好)
注释:控制器的状态是在每个磁盘操作完成之后才设置的。通过该功能,程序
就能获取到目前为止最近的磁盘操作时的磁盘状态。例如,可用该功能通过检
查位1来检测驱动器中的某个已设置了写保护的磁盘。
磁盘
Int 13h 功能 02h
读取磁盘扇区
获取指定数目的磁盘扇区。
调用寄存器: AH 02h
AL 要传送的扇区号
ES:BX 指向用户磁盘缓冲区的指针
CH 磁道号(参见注释)
CL 扇区号
DH 磁头号
DL 驱动器号(位7置位表示为硬盘)
返回寄存器:进位标志清除表示成功
AH 0
AL 所传送的扇区个数
进位标志置位表示出错
AH 状态字节(参见表15.13)
410页
注释:该功能把磁盘中的1个或多个扇区传送给内存。读磁盘是一种很标准
的操作,但在磁盘驱动器号超出时,该操作中却没有包括出错检查,这确实让
人感到意外。因此,在调用此服务之前,必须仔细地检查所有的输入参数,因为
一旦传送了非法值,往往导致产生难以预料的结果。
若把此功能用于硬盘,磁道数就是10位,而不是一般情况下的8位。通过
cL寄存器中的两个高位,可以把其中的两个高位传送给该功能。
注意:使用该功能时,系统的特征在于:一旦DMA操作越过了一个以三
个0为终止的内存偏移值地址,错误代码AH=9(DMA边界出错)就会出现。
在磁盘读操作中,内存边界对应于某个扇区边界。
若使用某些DOS版本中的FORMAT.COM程序,DMA边界问题就会
变得极其麻烦;它往往会产生这样一种信息;即磁道0是坏的,并且磁盘是不
可用的。一旦出现这种信息,那么校正的办法只能从CONFIG.SYS中删除或
增加BUFFERS= 或FILES= 值,并重新引导系统,以改变在FORMAT.COM中所使用
的磁盘缓冲区的内存中该程序所在的位置。
磁盘
Int 13h 功能 03h
写入磁盘扇区
将指定的内存区域写入设定的磁盘扇区中。
调用寄存器: AH 03h
AL 要传送的扇区数
ES:BX 指向用户磁盘缓冲区的指针
CH 磁道号(参见注释)
CL 扇区号
DH 磁头号
DL 驱动器号(位7置位表示硬盘)
返回寄存器:进位标志清除表示成功
AH 0
AL 已传送的扇区数
进位标志置位表示出错
AH 状态字节(参见表15.13)
注释:该功能把一个或多个扇区内容从内存中写给磁盘。除了磁盘驱动器号
以外,其余传送给该功能的值都不进行有效性检查。有效性检查是程序员的职
责。写磁盘是一种很标准的操作,在这种操作中却没有出错检查,确实让人感
到不可思议。
在发出请求服务的调用之前,必须仔细地检查所有的输入参数。因为一旦
传入了非法值,其结果是难以预料的。
411页
若把该功能用于硬盘,磁道号就为10,而不是8。可通过AL寄存器中的
两个高位来把磁道号的两个高位传送给该功能。
IBM公布的文档表明,在PC XT 286上使用该功能时,不要求保存在AL
中的扇区数。这种时候设置AL与否无关大局,因为此时不检查传送值的有效
性。
注意:在使用该功能时,系统的特征在于:一旦DMA操作越过了一个以
三个0为终止的内存偏移值地址,就会出现错误代码AH=9(DMA边界出
错)。在磁盘写操作中,这种内存边界必须与扇区边界相对应。
磁盘
Int 13h 功能 04h
验证磁盘扇区
检验指定的磁盘扇区的CRC值是否准确
调用寄存器: AH 04h
AL 要验证的扇区号
CH 磁道号(参见注释)
CL 扇区号
DH 磁头号
DL 驱动器号(位7置位表示硬盘)
返回寄存器:进位标志清除表示成功
AH 0
进位标志置位表示出错
AH 状态字节(参见表15.13)
注释:可用该功能来验证指定磁盘扇区的地址域。在此操作过程中,没有从磁
盘中传出或向其传入任何数据。若把该功能用于硬盘,磁道号就是10位,而不
是8位。可通过cL寄存器中的两个高位来把磁道数的两个高位传送给该功
能。
发生在磁盘上的磁盘验证操作,不涉及将磁盘上的数据与内存中的数据
之间进行对比验证(因为有些人相信是一致的)。该功能不读或写磁盘;相反,
它导致系统去读取一个或多个指定扇区中的数据,并以保存在磁盘上的数据
为对照,对其计数结果进行循环冗余检查(CRC)。
一旦把扇区写给磁盘,就会进行CRC计算,并把计算的结果作为扇区头
信息的一部分而保存在磁盘上。由于验证操作检查这种值,因而其出现的概率
很高,但是不能肯定磁盘扇区中的这种数据是否有效。
由于使用的磁盘功能种类很多,唯一要求进行出错检查的输入数据是磁
盘驱动器号。输入过程中的错误往往会导致难以预料的结果。
可用该功能来检查用于当前可读磁盘的磁盘驱动器。若驱动器中不含已
412页
正确地格式过的磁盘,该功能就会返回一个相应的错误。
磁盘
Int 13h 功能 05h
格式化磁盘磁道
格式化单个磁盘磁道
调用寄存器: AH 05h
ES:BX 指向磁道地址字段列表的指针
CH 磁道号
DH 磁头号
DL 驱动器号
返回寄存器: AH 返回代码(参照表15.13)
注释:该功能通过初始化磁盘地址字段和数据扇区来格式化磁盘的磁道(更
多的信息可参见第8章对“磁盘”的介绍)。应十分细心地使用该功能;因为一
不小心就会丢失机器上的一部分或全部磁盘存储内容。可在一个下拉式的
(stripped-down)系统上(仅用于软盘)检验该功能,直到完全肯定其正确性。
格式化磁道只是格式化磁盘操作的一部分。要格式化整个磁盘,必须先正
确地格式化每个磁道,但是,如果把磁盘用于DOS,就必须还要把基本的DOS
磁盘结构写给该磁盘(包括引导扇区、初始FAT表和该磁盘的根目录)。
磁盘格式化操作由磁道地址字段列表(ES:BX指的列表)控制。该表的
格式为一连串的4个字节项,每一项代表着磁道上的一个扇区。每个4字节项
的结构如下:
字节偏移值 含义
00h 磁道号
01h 磁头号
02h 扇区号
03h 大小代码
表15.14磁道地址字段大小代码
大小代码 每扇区字节数
0 128
1 256
9 512
3 1024
如果把该功能用于硬盘,磁道号就是10位而不是8位。可通过扇区号的
两个高位来把磁道号的高两位传送给该功能。
表15.14显示了可允许的大小代码;各项的排列对应于扇区出现在磁盘
上的先后次序。不必遵循这一顺序;可以交错使用这些扇区以促进磁盘访问的
实现(参见第8章“磁盘”)。
413页
磁盘
Int 13h 功能 06h
格式化柱面并设置坏的扇区标志
调用寄存器: AH 06h
AL 交叉因子
CH 要格式化的柱面
CL 扇区号
DH 磁头号
DL 驱动器号(以零为基准)
位7=0代表软盘;1代表硬盘
返回寄存器:进位标志清除表示成功
进位标志置位表示出错
AH 出错状态(参见表15.13)
注释:该功能只能用于BIOS日期为1/10/86或以后的PC XT、Personal
Computer AT或PS/2系列的机器上,它仅重新格式化驱动器的指定柱面。重
新格式化过的区域中所有的数据都会丢失。因而使用该功能时要格外小心。
磁盘
Int 13h 功能 07h
从指定的柱面着手来格式化驱动器
只格式化指定的柱面,并设置在此处理过程中找到的坏扇区。
调用寄存器: AH 08h
AL 交叉因子
CH 要格式化的柱面
CL 扇区号
DH 磁头号
DL 驱动器号(以零为基准)位7=0代表软盘;
1代表硬盘
返回寄存器:进位标志清除表示成功
进位标志置位表示出错
AH 出错状态(参见表 15.13)
注释:该功能只用于BIOS发行日期为1/10/86或以后的PC XT、Personal
Computer AT以及PS/2系列的机器上,它重新格式化驱动器的指定柱面及
其所有具有较高序号的柱面。重新格式化过的区域中所有的日期都会丢失。因
而使用该功能时要格外谨慎。
414页
磁盘
Int 13h 功能 08h
返回磁盘驱动器参数
返回指定磁盘驱动器的有关信息。
调用寄存器: AH 08h
DL 驱动器号(以零为基准)位7代表软盘;
1代表硬盘
返回寄存器:进位标志清除表示成功
CH 每面的磁道数
CL 每磁道的扇区数
DH 面数
ES:DI 指向11个字节的软盘参数表的指针
BL CMOS中的有效驱动器字节值
01h 51/4英寸、360K、40个磁道
02h 51/4英寸、1.2M、80个磁道
03h 31/2英寸、720K、80个磁道
04h 31/2英寸、1.44M、80个磁道
进位标志置位表示出错
AH 出错状态(参见表15.13)
注释:可用该功能(只能用于Personal Computer AT以及PS/2系列上)来获
取磁盘的物理参数。
设置DL寄存器的位7来调用该功能,以便访问硬盘。
该功能允许在指定的驱动器中检查磁盘的特征。其结果是:ES:DI所指
的表具有如表15.15所示的格式。
表15.15磁盘介质特征表
偏移值 含 义
00h 第一个指定的字节
01h 第二个指定的字节
02h 在关闭驱动器电机之前计时器记录要等待的时间计数
03h 每扇区的字节数
00h= 128
01h=256
02h=512
03h= 1024
04h 每磁道的扇区数
05h 间隙长度
415页
偏移值 含 义
06h 数据长度
07h 格式化的间隙长度
08h 格式化的填充字节
09h 按毫秒计的磁头稳定时间
0Ah 按1/8秒计算的电机启动时间
磁盘
Int 13h 功能 09h
初始化硬盘表
把指定硬盘表中的值设置为各自的缺省值。
调用寄存器: AH 09h
DL 硬盘驱动器号
返回寄存器:进位标志清除表示成功
AH 0
进位标志置位表示出错
AH 状态字节(参见表15.13)
注释:该功能只能用于Personal Computer AT和PS/2系列上,并且只能在
固定(硬)磁盘上工作。可用该功能来设置硬盘驱动器的物理参数。所使用的
驱动器号不是标准的BIOS驱动器号;相反,它们采用的是一系列特殊的号
码,这些号码仅用于固定磁盘(80h对应于第一个磁盘;81h对应于第二个磁
盘,如此等等)。若使用超出范围的驱动号,其结果往往是难以预料的。
驱动器的初始化信息出自于硬盘参数表。中断向量41h指向硬盘1参数
表;向量46h指向磁盘2的参数表。若访问其它的磁盘,该功能就会通过AH
返回“Invalid command”状态字节。
AT
Int 13h 功能 0Ah
读取长扇区
(磁盘) 从硬盘中读取指定数目的长扇区。
调用寄存器: AH 0Ah
AL 扇区数
ES:BX 指向数据缓冲器的指针
CH 磁道(参见注释)
416页
CL 扇区
DH 磁头号
DL 硬盘驱动器号
返回寄存器:进位标志清除表示成功
AH 0
进位标志置位表示出错
AH 状态字节(参见表15.13)
注释:该功能只能用于Personal Computer AT,并且只能在固定(硬)磁盘上
工作。在上述范围内,可用该功能来把长扇区从硬盘中读进内存。长扇区都是
标准扇区,除了具有常规数据以外,它还保存有错误改正代码的四个字节。
同其它的读/写功能一样,该功能对DMA边界错误(AH=9)十分敏感,
当DMA访问跨越末尾为三个零的内存偏移值时就可能会出现这种错误。由
于该功能未配备参数的出错检查,因而参数值出错往往导致难以预料的结果。
所使用的驱动器号不是标准的BIOS驱动器号;相反,它们都取自于一个
仅用于硬盘的特殊系列号(80h对应于第一个磁盘;81h对应于第二个磁盘,
如此等等)。若使用超出范围的硬盘驱动器号就会导致难以预料的结果。
表15.16列出了可以传送给该功能的所有参数的有效范围。尤其要注意
的是磁道号(CH和CL寄存器),它是一个10位的数值号,其中两个高位字节
被保存在寄存器CL的位6和7中,并且将其余的8个低位字节保存在寄存
器CH中。扇区地址(寄存器CL)是一个6位的号,这6个位分别被保存在位0
-5中(磁道号不使用这些位)。
表15.16有效的参数范围
寄存器 参数 有效范围
AL 扇区数 1-121
CH/CL 磁道 0-1023
CL 扇区 0-17
DH 磁头 0-15
DL 驱动器 80h,81h等
图15.1显示了该功能对CH和CL中的位的解释方式。
AT
Int 13h 功能 0Bh
写入长扇区
(磁盘)把指定数目的长扇区写入磁盘中。
调用寄存器: AH 0Bh
417页
AL 扇区数
ES:BX 指向数据缓冲区的指针
CH 磁道(参见注释)
CL 扇区
DH 磁头号
DL 硬盘驱动器号
返回寄存器:进位标志清除表示成功
AH 0
进位标志置位表示出错
AH 状态字节(参见表15.13)
表15.1 Int 13h的功能0Ah解释CH和CL中各位的方式
注释:本功能只能用于Personal Computer AT上,并且只能在固定(硬)磁盘
上工作。长扇区都是标准扇区,除含有常规的数据外,还含有错误改正代码的
四个字节。同其它的读/写功能一样,该功能对DMA边界出错(AH=9)非常
敏感,当DMA访问跨越其末尾为三个零的内存偏移值时,往往会产生这种错
误。由于不存在参数的出错检查,因而,参数值出错就会产生难以预料的结果。
所使用的驱动器号不是标准的BIOS驱动器号;相反,它们所采用的是只
能用于硬盘的特殊系列号(80h对应于第一个磁盘,81h对应于第二个磁盘,
如此等等)。使用超出范围的驱动器号会产生难以预料的结果。
磁道号共有10个位而不是8个。通过扇区号的两个高位可把磁道号中的
418页
高两位传送给该功能。
磁盘
Int 13h 功能 0Ch
查找柱面(寻道)
把读/写磁头移动到某一个指定的柱面上
调用寄存器: AH 0Ch
CH 磁道号的低位
CL 磁道号的高位
DH 磁头号
DL 硬盘驱动器号
返回寄存器:进位标志清除表示成功
AH 0
进位标志置位表示出错
AH 状态字节(参见表15.13)
注释:本功能只能用于Personal Computer AT上,并且只能在固定(硬)磁盘
上工作,其作用是把读/写磁头移动到指定的柱面。该功能所使用的驱动器号
不是标准的BIOS驱动器号;相反,它们采用的是只能用于硬盘的一特殊系列
驱动器号(80h对应于第一个磁盘;81h对应于第二个磁盘,如此等等)。使用
超出范围的磁盘驱动器号会导致难以预料的结果。在调用该功能时,非法的参
数设置也能产生难以预料的结果。
磁盘
Int 13h 功能 0Dh
可选的磁盘重置
重新设置硬盘控制卡。
调用寄存器: AH 0Dh
DL 硬盘驱动器号
返回寄存器:进位标志清除表示成功
AH 0
进位标志置位表示出错
AH 状态字节(参见表15.13)
注释:本功能只能用于Personal Computer AT上,并且只能在固定(硬)磁盘
上工作,它所使用的驱动器号不是标准的BIOS驱动器号;相反,它们采用的
是只能用于硬盘的一特殊系列驱动器号(80h对应于第一个磁盘;81h对应于
419页
第二个磁盘,如此等等)。使用不符合要求的磁盘驱动器号会导致难以预料的
结果。
除了在较新的BIOS版本中本功能不重新设置软盘控制器以外,该功能
与Int 13h,功能00h的作用是相同的。两者都可由关键出错处理程序用于强
行进行重新校准操作(在下一个I/O操作开始之前将磁盘的磁头重定位到磁
道0上)。在较旧的BIOS版本中,可编码关键出错处理程序以便到达同Int
13h,功能00h一样的例程地址。
磁盘
Int 13h 功能 0Eh
读扇区缓冲区
读扇区缓冲区。
调用寄存器: AH 0Eh
ES:BX 指向RAM缓冲区
返回寄存器:进位标志清除表示成功
进位标志置位表示出错
AX 出错码
注释:本功能仅用于最初有10M硬盘控制器的XT机器。没有定义它可用于
BIOS的其它版本,最好避免使用它。
该功能是IBM S/360用法的继续。从保存在ES:BX中的地址处开始,
10M磁盘控制器把数据的512个字节(一个扇区)从一个内部扇区缓冲区(在
此控制器上)直接传送给RAM。本功能已经过时,程序员必须杜绝使用这一
功能。
磁盘
Int 13h 功能 0Fh
写扇区缓冲区
写扇区缓冲区
调用寄存器: AH 0Fh
ES:BX 指向RAM缓冲区
返回寄存器:进位标志清除表示成功
进位标志置位表示出错
AX 出错码
注释:本功能只能用于那些最初有10M硬盘控制器的XT机器上。没有将该
功能定义为可用于BIOS版本,如果可能的话,最好不要使用它。
该功能是IBM S/360用法的继续。从保存在ES:BX中的地址开始,10M
420页
磁盘控制器把数据的512个字节(一个扇区)从RAM直接传送给某个内部扇
区缓冲器(在此控制器上)。在格式化10M XT驱动器时,必须在使用功能05h
之前用该功能来初始化控制器的缓冲区。本功能已经过时,程序员必须杜绝使
用这种功能。
磁盘
Int 13h 功能 10h
检查硬盘系统的状态
返回磁盘状态字节(仅适用于硬盘)。
调用寄存器: AH 10h
DL 硬盘驱动器号
返回寄存器:进位标志清除表示成功
AH 状态字节(参见表15.13)
进位标志置位表示出错
AX 出错码
注释:本功能的作用与功能01是一样的,但它只能在固定(硬)盘上工作。如
果没有出现错误,该功能返回的磁盘状态号为00h。
所使用的驱动器号不是标准的BIOS驱动器号,相反,这些驱动器号采用
的是一系列只能用于硬盘的特殊号码(80h对应于第一个磁盘;81h对应于第
二个磁盘,等等)。使用超出范围的磁盘驱动器号会导致产生难以预料的结果。
磁盘
Int 13h 功能 11h
重新校准硬盘驱动器
把硬盘的磁头返回到柱面00,并报告驱动器的状态。
调用寄存器: AH 11h
DL 硬盘驱动器号
返回寄存器:进位标志清除表示成功
AH 状态字节(参见表15. 13)
进位标志置位表示出错
AX 出错码
注释:本功能只能在固定(硬)磁盘上工作。如果没有出现错误,该功能以00h
来返回磁盘状态。
所使用的驱动器号不是标准的BIOS驱动器号;相反,它们采用的是一系
列只能用于硬盘的特殊号(80h对应于第一个磁盘;81h对应于第二个磁盘,
421页
等等)。使用此系列以外的驱动器号会产生难以预测的结果。
磁盘
Int 13h 功能 12h
诊断控制器RAM
仅仅在XT机器中,对硬盘控制器的扇区缓冲区RAM实现内在的诊断检验。
调用寄存器: AH 12h
返回寄存器:进位标志清除表示成功
进位标志置位表示出错
AX 出错码
注释:本功能仅仅只能用在那些最初有10M硬盘控制器的XT机器上。没有
将它定义为可用于BIOS的其它版本,在可能的情况下尽量不要使用这一功
能。
磁盘
Int 13h 功能 13h
诊断驱动器
仅仅在XT型号中实现对硬盘的诊断检验。
调用寄存器: AH 13h
返回寄存器:进位标志清除表示成功
进位标志置位表示出错
AX 出错码
注释:该功能只能用于那些最初有10M硬盘控制器XT型号。没有将此功能
定义为可用于其它的BIOS版本,在可能的情况下尽量避免使用这一功能。
磁盘
Int 13h 功能 14h
诊断控制卡
只在XT型号中实现对硬盘控制卡的内存诊断检验。
调用寄存器: AH 14h
返回寄存器:进位标志清除表示成功
进位标志置位表示出错
AX 出错码
注释:该功能只能用于那些最初有10M硬盘控制器XT型号。没有将它定义
为可用于其它的BIOS版本,如果可能,尽量避免使用这一功能。
422页
磁盘
Int 13h 功能 15h
返回DASD类型
获取驱动器的DASD(直接访问存储设备)类型以及扇区的数目。
调用寄存器: AH 15h
DL 驱动器号
返回寄存器:进位标志清除表示成功
AH 驱动器的DASD类型
CX 硬盘扇区数(高位字)
DX 硬盘扇区数(低位字)
进位标志置位表示出错
AH 状态字节(参见表15.13)
注释:该功能可用于PC XT(标明BIOS的日期为1/10/86或更近)、PC XT
286、Personal Computer AT或PS/2系列,它可以使用标准系列的BIOS驱动
器号(0=驱动器A;1=驱动器B,如此等等),或者使用硬盘号(80h=第1个
驱动器;81h=第2个驱动器,如此等等)。
可用该功能来确定能否用功能16h来检查驱动器,以便弄清楚自上次访
问以来该驱动器中的软盘是否发生了改变。表15.17列出了该功能的有效返
回代码,这些代码指明了能否说明驱动器中磁盘状态的详细情况。
表15.17 DASD类型
代码 DASD类型
0 所请求的驱动器不可用
1 驱动器存在,不能检测出磁盘的改变
2 驱动器存在,能检测磁盘的改变
3 硬盘
只有当AH返回的DASD类型为3时,CX:DX返回的值才是有效的。
磁盘
Int 13h 功能 16h
读取磁盘改变线路状态
调用寄存器: AH 016h
DL 驱动器号
返回寄存器:进位标志清除表示成功
AH 00h,磁盘未改变
423页
进位标志置位表示出错
AH 06h,磁盘已改变
AH 00h,出错
注释:本功能只能于Pc XT(标明的BIOS日期为1/10/86或更近)、PC XT
286、Personal Computer AT或PS/2系列,其作用是能确定是否已改变或移走
了某个驱动器中的磁盘。该功能要么使用标准系列的BIOS驱动器号(0=驱
动器A;1=驱动器B,等等)或者使用只限于硬盘的驱动器号(80h=第1个驱
动器;81h=第2个驱动器,等等)。
使用这种功能时,应注意它在处理进位标志时易于造成的与其它功能的
混淆;它处理进位标志的方式与其它中断是不一致的。本中断中进位标志的设
置并不意味着已经出错。相反,它表明了下述两种可能的情形:要么已经出错
或者已移走了磁盘。其它所有的功能都使用进位标志来表示已经出错。
磁盘
Int 13h 功能 17h
设置磁盘格式的DASD类型
指定供BIOS磁盘格式化功能所使用的DASD(直接访问存储设备)类型。
调用寄存器: AH 17h
AL DASD格式类型
DL 驱动器号(以零为基准)
返回寄存器:无
注释:本功能只能用于PC XT(标明的BIOS日期为1/10/86或更近)、pc
XT 286、Personal Computer AT或PS/2系列上,只能在格式化磁盘之前调用
该功能。它的作用在于通知格式化功能:用于格式化操作的DASD类型是什
么。
表15.18列出了在Personal Computer AT系统能进行格式化的有效磁盘
类型。
表15.18 DASD格式化类型
类型 含 义
1 在320/360K驱动器中格式化320/360K软盘
2 在1.2M驱动器中格式化320/360K软盘
3 在1.2M驱动器中格式化1.2M软盘
4 在720K驱动器中格式化720K软盘
软盘状态被保存在BIOS数据区中的地址0004:0041处。
424页
磁盘
Int 13h 功能 18h
设置格式化时的介质类型
指定BIOS用于磁盘格式化功能的介质类型。
调用寄存器: AH 18h
CH 磁道数(以零为基准)
CL 每磁道的扇区数
DL 驱动器号(以零为基准)
位7=0代表软盘1;1代表硬盘
返回寄存器:进位标志清除表示成功
ES:DL 指向11个字节的参数表的指针(参见
表15.15)
进位标志置位表示出错
AH 返回代码
注释:本功能只能用于Personal Computer(注明的BIOS日期晚于11/15/
86)、PC XT(标明的BIOS日期晚于1/10/86)、PC XT Model 286、以及PS/2
系列。最好在用Int 13h,功能05h格式化磁道之前使用这一功能。该功能为
BIOS指定它希望能在磁盘驱动器中找出的介质类型。
在使用本功能之前,必须记住要用CH和CL寄存器来指定磁道和扇区
信息。磁道可以是10位的值;并且同前面一样。它要求CL中的两个高位(参
见图15.1,该图显示出了如何将信息保存在寄存器CH和CL中)。
磁盘
Int 13h 功能 19h
停放磁头
把磁盘驱动器的读/写磁头移动到该磁盘驱动器上的某个“安全”位置。
调用寄存器: AH 19h
DL 驱动器号(以零为基准,仅用于PS/2系列)
位7=0表示软盘;1代表硬盘
返回寄存器:进位标志清除表示成功
AH 状态字节(参见表15.13)
进位标志置位表示出错
AX 出错码
注释:本功能只能干Personal Computer(注明的BIOS日期晚于11/15/ 86)、
PC XT(标明的BIOS日期晚于1/10/86)、PC XT Model 286、以及PS/2系列。
其使用是把磁头移动到生产厂商指定的停放区域。最好在断开系统电源或移
425页
动系统之前使用这一功能,以防毁坏数据。
磁盘
Int 13h 功能 1Ah
格式化ESDI单元
格式化与PS/2系统相连接的且与ESDI兼容的磁盘驱动器。
调用寄存器: AH 1Ah
AL 0,没有使用缺陷表
<>0,使用缺陷表
ES:BX 指向缺陷表的指针
CL 修改位(参见注释)
DL 驱动器号(以零为基准)
位7=0表示软盘;1代表硬盘
返回寄存器:无
注释:本功能只能用于PS/2系列型号50、60和80,其作用是格式化ESDI磁
盘。使用该功能时往往导致丢失了磁盘上所有数据,因此必须十分谨慎地使用
这一功能。若用此功能来格式化软盘,其结果就难预知。
当调用本功能时,CL寄存器便保存了具有下述含义的修改位:
位
含 义
76543210
. . . . . . . 1 忽略主缺陷映象图
. . . . . . 1. 忽视次缺陷映象图
. . . . . 1. . 更新次缺陷映象图
. . . . 1. . . 完成扩展的表面分析
. . . 1. . . . 周期性的中断ON
x x x . . . . . 保留
通信
Int 14h 功能 00h
初始化通信端口
设置串行端口参数。
调用寄存器: AH 00h
AL 初始化参数
DX 端口号(0=COM1,1=COM2,在Personal
Computer AT上,2=COM3,3=COM4)
返回寄存器: AH 端口状态
AL 调制解调器状态
426页
注释:可使用本功能来初始化DX中指定的通信端口。可用该功能来初始化
COM端口1和2(DX=0-1);在Personal Computer AT系统上,允许COM端
口为1-4。
在AL中,可指定如何初始化通信端口。可用表15.19中的参数来指定被
特率、奇偶性、字长和停止位。
表15.19串行端口初始化参数
7,6,5 4,3 2 1,0
波特率 奇偶性 停止位 字长
000=110波特 x0无 0=1位 10=7位
001= 150波特 01奇 122位 11=8位
010=300波特 10无
011=600波特 11偶
100=1200波特
101=2400波特
110=4800波特
111=9600波特
该中断返回端口(参见表15.20)和调制解调器(参见表15.21)的状态。
BIOS加上端口状态位(超时)中的位7来指出用于等待应答的超出时间。在其
它情况下,返回的状态就是可直接从硬件中获取的状态。
表15.20端口状态位
位
含 义
76543210
.. . . . . . 1 数据准备就绪
. . . . . . 1. 超限错误
. . . . . 1. . 奇偶性出错
. . . . 1. . . 成帧时出错
. . . 1. . . . 检测出了中断
. . 1. . . . . 传送保持寄存器(THR)空
.1. . . . . . 传送移位寄存器(THR)空
1. . . . . . . 超时
表15.21调制解调器状态位
位
含 义
76543210
. . . . . . . 1 清除发送(CTS)状态下的改变
. . . . . . 1. 数据集就绪(DSR)状态下的改变
. . . . . 1. . 后沿环形指示符
427页
位
含 义
76543210
. . . . 1. . . 接收线信号的改变
. . . 1. . . . 清除发送(Clear to send:CTS)
. . 1. . . . . 数据集就绪(Datato set Ready:DSR)
.1. . . . . . 环形指示符(R1)
1. . . . . . . 检测到的接收线信号
通信
Int 14h 功能 01h
把字符写给通信端口
把字符输出给串行端口。
调用寄存器 AH 01h
AL 要输出的字符
DX 端口号(0=COM1,1=COM2)(在Personal
Computer AT上,2=COM3,3=COM4)
返回寄存器: AH 位7 0(功能成功)
AH 位7 1(功能失败)
位0-6显示失败的原因(参见表
15.20)
注释:该功能把字符写给指定的通信端口并返回该通信端口的状态。一般情
况下,把字符写给串行端口并不是一种时间紧要(time-critical)任务。无论字符
何时准备就绪都能实现这一任务。该功能可写给串行端口1和2(COM1和
COM2)。在调用此功能之前,一定要用Int 14h,功能00h来初始化其输出端
口。(在Personal Computer AT上,可以访问端口(COM1至COM4)
尽管依赖于BIOS读功能的通信程序很少超出1200波特的操作范围,但
对于写功能来说,这一范围不管用。当刚刚发送出前一个字符时,唯一影响到
能否支持下一个输出字符的因素是系统有效的吞吐量问题。在此过程中没有
丢失任何数据。
表15.20显示了在该功能返回的(如果该功能失败)AH寄存器位0-6
的含义。
428页
通信
Int 14h 功能 02h
从通信端口中读取字符
从串行端口中输入字符。
调用寄存器: AH 02h
DX 端口号(0=COM1,1=COM2)(在Personal
computer AT上,2=COM3,3=COM4)
返回寄存器: AH 位7 0(功能成功)
AL 字符
AH 位7 1(功能失败)
位0-6显示失败的原因(参见表
15.20)
注释:本功能从指定的通信端口中读取字符,并返回该端口的状态,它能从串
行端口1和2(COM1和COM2)中读取字符。(在Personal Computer AT上,
可以访问端口COM1至COM4)。在调用此功能之前,一定要先初始化对应的
输入端口。
在任何通信应用程序中,接收字符都是一个极端的时间紧要操作。当外部
设备在未受控制的区间里输入字符时,计算机必须立即做好应答的准备。虽然
由计算机控制输出(但也公开地试图在通信程序中进行输入),而输入必须与
外部系统相对应。若在新的字符到达时,计算机尚未作好相应的准备,那么就
会丢失该字符。
依赖于该功能的通信程序在进行连续操作时很少超过300波特率。在大
多数情况下,1200波特率一次只能传送几个字符,而且每当显示填满一行并
必须上卷一行时,就会丢失几个字符。
在大多数用于通信的应用程序中,该功能不起作用,因为大多数情况下都
要求直接访问I/O端口以达到连续操作所必需的速度。独立于人为干预之外
的程序可以使用该功能。在使用相对慢些的速度来控制和监视应用程序时,通
过该功能来读串行设备通常很实用,也很有用。
表15.20显示了在该功能返回(如果该功能失败)的AH寄存器中位0-6
的含义。
通信
Int 14h 功能 03h
请求通信端口状态
返回串行端口的状态信息。
429页
调用寄存器: AH 03h
DX 端口号(0=COM1,1=COM2)(在Personal
Computer AT上,2=COM3,3=COM4)
返回寄存器: AH 端口状态(参见表15.20)
AL 调制解调器状态(参见表15.21)
注释:该功能返回指定通信端口的当前状态,它仅请求状态而不进行任何I/
O操作或以任何其它的方式来影响对应的串行端口。此功能可访问通信端口
1和2(DX=0-1)。(在Personal Computer AT上,该功能可访问端口COM1
至COM4)。
表15.17和表15.18显示了该调用返回的寄存器AH和AL中状态位的含
义。表15.17指定其中的位用于串行端口,而表15.18中给出的位用于与串行
端口相连接的调制解调器。
通信
Int 14h 功能 04h
扩展的初始化
初始化串行端口参数。
调用寄存器: AH 04h
AL 中断设置
BH 奇偶性
BL 停止位
CH 数据长度
CL 传送速率(bps:位/秒)
DX 端口号(0=COM1,1=COM2)(在Personal
Computer AT上,2=COM3,3=COM4)
返回寄存器: AH 端口状态(参见表15.17)
AL 调制解调器状态(参见表15.21)
注释:该功能(注:只能用于PS/2系列)为RS232端口(以一种比功能00h所
使用的方法更为简单的方式)提供直接在BIOS层进行初始化的方法。表
15.22显示了能用于该功能的所有寄存器设置。
表15. 22可能的寄存器设置
寄存器 含义 设置 含 义
AL 中断 00h 无中断
01h 中断
BH 奇偶性 00h 无奇偶性校验
01h 奇校验
430页
寄存器 含义 设置 含 义
02h 偶校验
03h 坚持为奇校验
04h 坚持为偶校验
BL 停止位 00h 一个停止位
01h 两个停止位(如果CH中数据长度设置为
00h则为11/2个停止位)
CH 数据长度 00h 5位字长
01h 6位字长
02h 7位字长
03h 8位字长
CL BPS速率 00h 110波特
01h 150波特
02h 300波特
03h 600波特
04h 1200波特
05h 2400波特
06h 4800波特
07h 9600波特
08h 19200波特
该功能通过AH和AL寄存器返回端口当前状态。表15.17和表15.18
给出了这两个寄存器中每一个位的含义。
通信
Int 14h 功能 05h
扩展的通信端口控制
允许对调制解调器控制寄存器的扩展控制。
调用寄存器: AH 05h
AL 00h,读取调制解调器控制寄存器
DX 通信端口(0=COM1;1=COM2;2=COM3;3=
COM4)
AL 01h,写调制解调器控制寄存器
BL 调制解调器控制寄存器(如果AL=01h,参见
表15.23)
DX 端口号(0=COM1,1=COM2)(在Personal
Computer AT上,2=COM3,3=COM4)
返回寄存器: AH 端口状态(参见表15.20)
AL 调制解调器状态(参见表15.21)
431页
BL 调制解调器控制寄存器(参见表15.23)
注释:该功能(只能用于PS/2系列)允许读/写与所期望的RS-232端口相关
的调制解调器控制寄存器。因此可以从BIOS层直接对端口的调制解调器控
制线路进行访问。在读操作中,可以获取这些线路的状态;在写操作中则可设
置这些状态。表15.23中定义了BL寄存器中的每个位。
表15.23调制解调器控制寄存器的位
位
含义
76543210
.. . . . . . 1 数据终端就绪(DTR)
. . . . . . 1. 请求发送(RTS)
. . . . . 1. . 输出1
. . . . 1. . . 输出2
. . . 1. . . . 回送检验
111. . . . . 保留
在调用该功能时,它也会通过寄存器AH和AL来返回串行端口和调制
解调器的状态。表15.17和表15.18分别给出了从该调用中返回的对应位的
含义。
磁带
Int 15h 功能 00h
接通磁带电机
接通盒式磁带机器的电机。
调用寄存器: AH 00h
返回寄存器:进位标志清除表示成功
进位标志置位表示出错
AH 返回代码(参见表15.24)
注释:由于该功能只能在较旧的PC型号上工作,因而在PC XT、Personal
Computer AT或PS/2系统上使用该功能,就会导致设置进位标志,并返回
AH=86(参见表15.24)。
表15.24磁带服务的返回代码
代码 含 义
00h 非法命令
01h CRC出错
02h 数据转换丢失
03h 磁带上没有定位数据
432页
代码 含 义
04h 未找到数据(仅用于PCjr)
86h 没有可用的磁带端口
有些用户使用具有磁带延迟的旧系统,他们往往重新接通用于其它控制
功能的延迟。使用这一步时必须格外小心,应事先完全弄懂设备的装载以及其
它的电源要求等情况。
磁带
Int 15h 功能 01h
关闭磁带电机
关闭盒式磁带机器的电机。
调用寄存器: AH 01h
返回寄存器:进位标志清除表示成功
进位标志置位表示出错
AH 返回代码(参见表15.24)
注释:由于该功能只在较旧的PC型号上运行,因而在PC XT、Personal Com-
puter AT或PS/2系统上使用这一功能,就会导致设置进位标志并返回AH=
86h(参见表15.24)。
有些用户使用具有磁带延迟功能的旧系统,他们常常要重新接通用于其
它控制功能的延迟。在做这一步之前,事先必须完全弄懂设备的装载情况以及
其它方面的电源要求。
磁带
Int 15h 功能 02h
从磁带驱动器中读取数据块
从磁带中读取指定数据目的字节。
调用寄存器: AH 02h
ES:BX 指向数据缓冲区的指针
CX 要读取的字节数
返回寄存器:进位标志清除表示成功
DX 要读取的字节数
ES:BX 指向跟在所读的最后一个字节之后的那个字节
的指针
进位标志置位表示出错
AH 返回代码(参见表15.24)
433页
注释:由于该功能只能运行较旧的PC型号上,因而在PC XT、Personal
Computer AT或PS/2系统上使用这一功能时,就会导致进位标志被设置,并
返回AH=86h(参见表15.24)。
如果正在使用一个带有磁带端口的系统,此功能在从磁带中读入数据时,
以256字节的块为单位进行,但只有用户在CX中指定的字节个数才会被送
到用户的读缓冲区中。
有些用户使用具有磁带延迟功能的旧系统,他们往往要重新接通用于其
它控制功能的延迟。经过这一步时必须小心,应事先弄懂设备的装载情况及其
它方面的电力要求。
磁带
Int 15h 功能 03h
把数据块写给磁带驱动器
把指定数目的字节写给磁带。
调用寄存器: AH 03h
ES:BX 指向数据缓冲区的指针
CX 要写给的字节数
返回寄存器:进位标志清除表示成功
ES:BX 指向紧跟在所写的最后一个字节之后的那个字
节的指针
进位标志置位表示出错
AH 返回代码(参见表15.24)
注释:由于该功能只能正常地运行于较旧的PC模型上,因而在PC XT、Per-
sonal Computer AT或PS/2系统上使用该功能就会导致设置了进位标志并返
回AH=86h(参见表15.24)。
对磁带的所有传送都以256字节为一块来进行,但是,只有在CX寄存器
中所指定数量的字节数才会从数据缓冲区中传送出去。传送期间给出的错误
指的是命令使用错误,而不是传送错误。如果写一个使用磁带的应用程序,该
程序就应该提供一种方式,在破坏掉内存中的数据之前,对写入磁带中的内容
进行校验。
有些用户使用具有磁带延迟功能旧系统,这样他们就常常要接通用于其
它控制功能的延迟。在采用这一步骤时应小心从事,且事先必须弄清设备的装
载情况以及其它方面的电力要求。
磁盘
Int 15h 功能 0Fh
ESDI单元格式化的周期性中断
434页
(PS/2)在格式化每一柱面的末尾,由格式化例程调用此功能。
调用寄存器: AH 0Fh
AL 相位代码
00h保留
01h表面分析
02h格式化
返回寄存器:进位标志置位,终止格式化或扫描
进位标志清除,继续格式化或扫描
注释:在格式化或扫描每个磁盘柱面之后,程序员们可用该功能(注:只能用
于PS/2机器)来获取对系统的控制权。在这种时候,格式化例程就会调用该
中断。
如果从非PS/2系列的机器中调用该功能,系统就会设置进位标志并返
回AH=80h(对PC和PCjr)或AH=86h(对其它所有的机器)。
PS/2
Int 15h 功能 21h
通电自我检测(POST)出错记录
更新或读取POST出错记录。
调用寄存器: AH 21h
AL 00h,读POST出错记录
01h,把出错代码写给POST出错记录
BX 如果AL=01h则为POST出错码
BH 设备代码
BL 设备出错
返回寄存器:如果读取POST出错记录(AL=0)
进位标志清除表示成功
AH 00h
BX 保存的POST出错码数值
ES:DI 指向POST出错记录的指针
进位标志置位表示出错
AH 80h(针对PCjr和PC)
AH 86h(针对其它所有的机器)
如果写POST出错记录(AL=1)
进位标志清除表示成功
AH=00h
进位标志置位表示出错
AH= 01h,POST出错记录已满
435页
AH 80h(针对PCjr和PC)
AH 86h(针对其它所有的机器)
注释: POST主要是使用该功能来把信息写入内部出错记录或通过诊断例程
来获取POST操作期间检测出的错误代码的信息。返回什么样的值取决于你
是传送还是读取该记录。本书的其它章节介绍了POST出错使用细节。
该功能只能用于PS/2机器上(Model 30除外)。如果从非PS/2的机器中
调用此功能,就会导致设置进位标志并返回AH=80h(对PC和PCjr)或AH
=86h(其它的机器,包括PS/2 Model 30)。
键盘
Int 15h 功能 4Fh
键盘截取
在I/O处理期间由键盘例程调用。
调用寄存器: AH 4Fh
AL 键盘扫描码
进位标志置位
返回寄存器: PC,PCjr
进位标志置位,AH=80h
PC XT BIOS 11/08/82,Personal Computer AT
BIOS1/10/84:
进位标志置位,AH=86h
其它所有的机器:
进位标志置位
AL 新的键盘扫描码
进位标志清除
AL 初始的键盘扫描码
注释:该功能只能用于Personal Computer AT(要求BIOS的发行日期晚于
1/10/84)、PC XT(要求BIOS的发行日期晚于11/8/82)、PC XT Model 286
及ps/2系列的计算机上。可用Int 15h功能C0h来确定该功能是否可用。若
该功能可用,那么每当按上一个键,Int 09h就会在处理这一键击之前,首先调
用该功能。在进位标志置位时,该功能通常经过AL寄存器返回扫描代码。通
过用其它功能来替代该功能,程序员们就能用扫描代码来处理字符转换(正如
可用一个备用的键盘布局来处理一样)。
若该功能返回的信息为进位标志已清除,Int 09h就会忽略对应的字符。
除了进行字符转换外,替换功能还可用功能4Fh来导致系统忽略某个键击。
436页
系统:
Int 15h 功能 80h
设备打开
打开用于某一特定进程的设备。
调用寄存器: AH 80h
BX 设备ID号
CX 进程ID号
返回寄存器:进位标志清除表示成功
进位标志置位表示出错
AH 80h(针对PC、PCjr)
AH 86h(针对BIOS日期为11/8/82的PC XT)
注释:该功能只能用于Personal Computer AT、PC XT(BIOS的发行日期晚
于11/8/82)、PC XT Model 286以及PS/2系列计算机。最好将它用于基本的
多任务操作中。具体细节可参见本书的其它章节。
系统
Int 15h 功能 81h
设备关闭
关闭与某个特定进程有关的设备。
调用寄存器: AH 81h
BX 设备ID号
CX 进程ID号
返回寄存器:进位标志清除表示成功
进位标志置位表示出错
AH 80h(针对PC、PCjr)
AH 86h(针对BIOS日期为11/8/82的PC XT)
注释:该功能只能用于Personal Computer AT、PC XT(BIOS的发行日期晚
于11/8/82)、PC XT Model 286以及PS/2系列计算机。该功能预计用于基本
的多任务操作中。这方面的内容超出了本书的范围。
系统
Int 15h 功能 82h
程序终止
用于终止某个进程,
调用寄存器: AH 82h
437页
BX 进程ID号
返回寄存器:进位标志清除表示成功
进位标志置位表示出错
AH 80h(针对PC、PCjr)
AH 86h(针对BIOS发行日期为11/8/82的PC
XT)
注释:该功能只能用于Personal Computer AT、PC XT(要求BIOS的发行日
期晚于11/8/82)、PC XT Model 286以及PS/2系列计算机。它预计用于基本
的多任务操作中。这方面的内容超出了本书的范围。
系统
Int 15h 功能 83h
事件等待
等待某个进程事件的发生。
调用寄存器: AH 83h
AL 00h,设置间隔
CX:DX 发送前的微秒数
ES:BX 指向间隔终止后,尽可能快地设置了高顺序位
的字节的指针
AL 01h,取消设置间隔(仅适用于PS/2)
返回寄存器:进位标志清除表示成功
进位标志置位表示出错
AH 80h(针对PC)
AH 86h(PC XT,要求BIOS的发行日期晚于1/10/
84的Personal Computer AT)
注释:该功能只能用于Personal Computer AT(要求BIOS的发行日期晚于
1/10/84)以及除Model 30外的PS/2系列计算机上。它预计用于最基本的多
任务操作中。这方面的内容超出了本书的范围。
游戏
Int 15h 功能 84h
操纵杆支持
返回操纵杆的坐标位置和状态。
调用寄存器: AH 84h
DX 00h,读取转换设置
01h,读取操纵杆位置
返回寄存器: PC,PCjr:
438页
进位标志置位
AH 80h
PC XT BIOS11/08/82:
进位标志置位
AH 86h
其它:
如果读取转换设置(DX=0)
AL 转换(位4-7)
进位标志置位表示出错
如果读取操纵杆位置(DX=1)
AX A(X)值
BX A(Y)值
CX B(X)值
DX B(Y)值
注释:除了PC、PCjr和早期的PC XT(BIOS的发行日期为11/08/82)以外,
可将该功能用于其余所有的IBM计算机上(包括PS/2系列),以控制操纵杆
的操作。在PC、PCjr和早期的PC XT上,该功能返回进位标志置位以示出错。
通过AH返回的出错码。要么为80h或者86h(面向PC XT)。
DX的值用于指示想从操纵杆中获取的信息类型。若DX为0,则该功能
通过AL中四个具有特殊意义的位来返回转换设置。若DX为1,该功能通过
四个一般用途的寄存器-AX、BX、CX、和DX来返回操纵杆的位置。若计算
机上没有附带操纵杆,则返回进位标志置位。
键盘
Int 15h 功能 85h
按下请求键
无论何时按下SysRq(系统请求)键都会调用此功能
调用寄存器: AH 85h
返回寄存器: PC,PCjr
进位标志置位
AH 80h
PC XT BIOS11/08/82:
进位标志置位
AH 86h
其它:
AL 00h,已按键
01h,已松开键
439页
注释:无论何时按下或松开系统请求键(Alt-print Screen),BIOS都会调用此
功能。只有较近的BIOS版本才支持这一功能,并且只能从带有System Re-
quest(系统请求)键的键盘访问该功能。
若计算机的BIOS不支持该功能,那么计算机就会设置进位标志,并返回
AH=80h或AH=86h(用于早期的PC XT)。
通常情况下,System Request键返回标志和寄存器集。这些都是没有价值
的信息,程序能截获此功能以有效地使用该键。要使System Request键按程
序运行,可简单地重设置向量(revector)Int 15h,并保存旧的地址。此时,程序
会检查AH中的值。若AH中不含85h,就必须把控制传送给初始化的Int 15h
处理程序。若AH中含有85h,则表明已按下或松开了System Request键。AL
反映出了该键的状态:若AL为00h,表明刚刚按下该键,若AL为01h则表明
刚刚松开此键。
系统
Int 15h 功能 86h
延迟
在返回前暂停一定的时间。
调用寄存器: AH 86h
CX, DX 返回之前按微秒计算的时间(精确到976微秒
以内)
返回寄存器: PC,PCjr:
进位标志置位
AH 80h
PX XT:
进位标志置位
AH 86h
其它:
进位标志置位(进程中的等待)
进位标志清除(等待成功)
注释:此功能只能用于Personal Computer AT和PS/2系列,其作用是(在操
作系统软件的范围内)设置系统等待。该功能不能用于应用程序。
系统
Int 15h 功能 87h
移动块
在80286和80386机器上传送一个指定的内存块。
440页
调用寄存器: AH 87h
CX 要移动的存储器的字计数
ES:SI 指向全局描述符表的指针
返回寄存器: PC,PCjr:
进位标志置位
AH 80h
PC XT PS/2 Model 30:
进位标志置位
AH 86h
其它:
进位标志清除,零标志置位
操作成功
AH 00h
进位标志置位,零标志清除
操作失败
AH 01h,RAM奇偶校验出错
02h,已发生其它异常情况
03h, Gate地址线20h失败
注释:通过这种功能,基于80286或80386微处理器的IBM计算机就能把数
据块传入和传出内存(必须有1M以上的内存)。计算机可从处理器的实模式
切换到保护模式。在这种传送操作期间不允许出现任何中断(若移动是大型数
据块,则可能丢失中断)。
表15.25介绍的是ES:SI所指向的全局描述符表。
表15.25全局描述符表
偏移值 描 述
00h 为空;应置为零。
08h GDT数据段地址;应置为零
10h 源GDT。指向用于源内存块的GDT。
18h 目标GDT。指向用于目标内存块的GDT。
20h 指向BIOS代码段的指针;应初始化为零。
BIOS用这一区域来创建保护模式代码段。
28h 指向BIOS堆栈段的指针;应初始化为零。
BIOS利用这一区域来创建保护模式堆栈段。
441页
源/目标GDT布局
偏移值 描 述
00h 段界限
02h 24位的段物理地址
05h 数据访问权限(置为39h)
06h 保留字(必须为零)
由于装入CX中的字计数有一个为8000h的上限,因而程序不能传送大
于64K字节的数据块。
系统
Int 15h 功能 88h
确定扩展内存的大小
返回在扩展内存中可获得连续为1K的内存块的数目。
调用寄存器: AH 88h
返回寄存器: PC,PCjr:
进位标志置位
AH 80h
PC XT PS/2Model 30:
进位标志置位
AH 86h
其它:
AX 从100000h处开始连续为1K内存块数目
注释:返回已确定的内存数量,这一结果是由POST从地址100000h处开始
向上检查而得出的。该功能只能用于那些使用80286或者80386微处理器的
计算机。
系统
Int 15h 功能 89h
把处理器切换到保护模式
把处理器切换到保护模式,以便它能访问扩展内存并利用保护模式指令。
调用寄存器: AH 89h
BL IRQ0中断向量偏移值
BH IRQ8中断向量偏移值
ES: SI 指向全局描述符表(GDT)的指针
CX 保护模式中CS要跳转到的偏移值
返回寄存器:进位标志清除表示成功
进位标志置位表示出错
442页
注释:那些想通过扩展内存来访问系统的程序员们对把处理器切换到保护模
式的功能往往具有浓厚的兴趣。虽然保护模式能允许访问附加的内存和指令,
但为此付出的代价是与许多现有的系统不兼容。只有那些采用286或386处
理器的机器才具备这一功能(并且它们也不需要额外的内存)。更进一步讲,
DOS自己并不使用保护模式。因此,若不自己写出用于这种情况下的全部处
理的程序,那么任何细微的错误都可能会导致系统崩溃。
要使用这一功能,首先必须为该调用设置全局描述符表(GDT)。(GDT结
构的具体情况可参见表15.24)
用户一旦使用了功能89h就不用使用一般的BIOS功能。在保护模式运
行的程序必须创建出它们自己的I/O命令。更进一步地讲,必须移动标准中断
向量以适应80386中断定义,该定义普遍地用于为系统的实模式指定的中断
向量。同时,还必须定义用于硬件中断的中断处理程序。
若在保护模式下使用这一功能,那么中断处理就是要考虑的主要部分。本
书的其它章节更详细地介绍了80286/80386中断的情况(但若要了解保护模
式中断的操作以及如何为它们指派处理程序的具体细节,则必须查阅一本专
门介绍80286和80386处理器的参考手册。
系统
Int 15h 功能 90h
设备等待
BIOS用此功能来指明一种等待状态。
调用寄存器: AH 90h
AL 设备类型代码
ES:BX 等待网络时指向网络控制块的指针
返回寄存器: PC,PCjr:
进位标志置位
AH 80h
PC XT BIOS11/08/82:
进位标志置位
AH 86h
其它方面:
进位标志置位(已满足最小的等待要求)
进位标志清除(等待未满足)
注释:可用该功能来通知操作系统:程序正在等待设备。该功能是专门为开发
多任务软件而设计的;这就意味着它不是供开发应用程序的程序员们使用的。
无论BIOS何时进入忙碌循环(当它必须等待设备时),它都会调用该功能。表
15.26列出了可通过AL传送给某个例程的类型代码。
443页
表15.26通过AL传送的类型代码
AL 类型代码
00h 磁盘超时
01h 软盘超时
02h 键盘(未超时)
03h 指向设备(超时)
80h 网络(未超时)
FCh 硬盘复位(仅适用于PS/2)
FDh 软盘驱动器电机启动(超时)
FEh 打印机(超时)
该功能(在中断开始时调用)的作用与Int 15h,功能91h(在中断完成时调
用)正好相反。若想在计算机正处于忙碌状态处理其它事情,则可连接上Int
15h向量,该向量会把所有的功能(90h和91h除外)传送给初始化的处理程
序。保存了机器的状态之后,就可以自由地进行另一项任务的工作。
系统
Int 15h 功能 91h
中断完成
BIOS将该功能用来指明等待状态的结束。
调用寄存器: AH 91h
返回寄存器: PC,PCjr:
进位标志置位
AH 80h
PC XT BIOS11/08/82:
进位标志置位
AH 86h
其它:
AL 类型代码
注释: BIOS使用该功能来报告设备中断已完成,报告的结果通过表15.27中
给出的类型代码来反映。该功能不能由开发应用程序的程序员调用;从根本上
讲,只能将它用于操作系统或用来开发多任务操作系统。设备中断功能用Int
91h来指明它们已完成的操作系统(参见对Int 90h的注释)。
表15.27功能91h返回的类型代码
AL 类型代码
00h 磁盘超时
01h 软盘超时
444页
AL 类型代码
02h 键盘(未超时)
03h 指向设备(超时)
80h 网络(未超时)
FCh 硬盘复位(仅适用于PS/2)
FDh 软盘驱动器电机启动(超时)
FEh 打印机(超时)
该功能(在中断完成时调用)的作用与Int 15h,功能90h(在中断开始时调
用)相反。
系统
Int 15h 功能 C0h
返回系统配置参数
返回一个指向系统描述符信息的指针。
调用寄存器:AH C0h
返回寄存器: PC, PCjr:
进位标志置位
AH 80h
PC XT BIOS(11/08/82),Personal Computer AT
BIOS(1/10/84):
进位标志置位
AH 86h
其它:
ES:BX 在ROM中指向系统描述符的指针
注释: ROM系统描述符表包含有该系统的有用信息。表15.28显示了各表项
的含义。
表15.28系统描述符表
偏移值 含义
00h 所允许数据的字节计数(最小为8)
02h 型号字节
03h 子型号字节
04h BIOS版本(00=第一个版本)
05h 功能信息(其含义参见表15.29)
06-09h 保留
功能信息字节的具体解释如表15. 29所示。
445页
表15.29功能信息字节
位
含 义
76543210
. . . . . . . x 保留
. . . . . . 0. PC总线I/O通道
. . . . . . 1. MicroChannel(微通道)结构
. . . . . 1. . 已分配的扩展BIOS数据区(EBDA)
. . . . 1. . . 支持对外部事件的等待
. . . 1. . . . 由Int 09h调用的键盘截获(Int 15h,Function 4Fh)
. . 1. . . . . 实时时针存在
.1. . . . . . 第二个中断芯片存在
1. . . . . . . 硬盘BIOS使用的DMA通道3
系统描述符表中偏移值02h处所保存的型号字节必须与系统ID字节(保
存于F000:FFFE处)相同。子模式字节(偏移值03h)可用于其它系统的标
识。从表15.30所显示的信息中,我们可以确定所使用的是哪种类型的IBM
计算机(BIOS数据可用来指明同类计算机的表中不同项之间的差别)。
表15.30系统号标识
型号字节 子型号字节 BIOS修订本
计算机类型 BIOS日期
(偏移值02h) (偏移值03h) (偏移值04h)
PC FFh
PCXT FEh
PCXT FBh 00h 01h1/10/86
PCXT FBh 00h 02h5/09/86
PCjr FDh
AT FCh
AT FCh 00h 01h6/10/85
AT,COMPAQ 286 FCh 01h 00h11/15/85
PCXT286 FCh 02h 00h
PC Convertible F9h 00h 00h 09/13/85
PS/1 FCh 0Bh 05 12/1/89
PS/2Model 30 FAh 00h 00h 9/2/86
PS/2 Model 50 FCh 04h 00h
PS/2 Model60 FCh 05h 00h
PS/2 model80 F8h 00h 00h
系统
Int 15h 功能 C1h
返回扩展BIOS数据区(EBDA)的段地址
446页
<PS/2> 返回EBDA的段地址。
调用寄存器: AH C1h
返回寄存器: PC,PCjr:
进位标志置位
AH 80h
PCXT,Personal Computer AT:
进位标志置位
AH 86h
PS/2:
进位标志清除表成功
ES 扩展BIOS数据区段地址
进位标志置位表示出错
注释:该功能可用来确定扩展BIOS数据区(EBDA)的段地址。值得注意的是
这一区域仅由PS/2系列使用(到目前为止)。通过Int 15h,功能C0h(参照功
能信息字节中的位2),可确定系统是否支持这种数据区。
在Personal System/2系列上, EBDA由BIOS内在地使用。 EBDA由
POST例程进行分配,并且它常驻在用户内存区域的顶部(通常为640K主内
存区中最后1K的内存)。POST还可调整允许用于EBDA的自由内存。要确
定可用的自由内存总量,可参照Int 12h的信息。
系统
Int 15h 功能 C2h
指向设备BIOS接口
<PS/2> 用于辅助指向设备的接口功能。
调用寄存器: AH C2h
AL 00h,允许/禁止指向设备
BH 00h,允许
01h,禁止
AL 01h,重新设置指向设备
AL 02h,设置抽样频率
AL 03h,设置分辨率
AL 04h,读取设备类型
AL 05h,指向设备接口初始化
AL 06h,扩展命令
AL 07h,指向设备远调用初始化
返回寄存器: PC,PCjr:
进位标志置位
447页
AH 80h
PCXT,Personal Computer AT:
进位标志置位
AH 86h
PS/2:
进位标志清除表示成功
其它寄存器依据子功能的不同而改变(参见注释)
进位标志置位表示出错
AH 01h,非法的功能调用
02h,无效输入
03h,接口出错
04h,重新发送
05h,没有安装远程调用
注释:该功能(只能用于PS/2系列)是专为DOS的接口指向设备(如鼠标、数
字化仪、轫迹球等)而设计的。由于大多数鼠标软件是通过Int 33h设备驱动程
序而进行接口连接的,因而有关鼠标的信息可在对该中断的介绍中找到(Mi-
crosoft已推出了Int 33h设备驱动程序的更新版本,该版本在可能的条件下,
使用这种BIOS中断来实现它自身的功能,但是,在大多数情况下,程序都是
在使用Int 33h接口,因而这一接口已形成了一种标准)。
虽然本书的其它章节详细地介绍了该功能的使用方法,但在此只是粗略
地提一下每个子功能的参数。在调用子功能之前,必须将指向设备中断处理程
序的有关信息,通知给BIOS(把AL置为7并且让ES:BX指向该中断处理
程序的远地址)。接着,把AL和BH置为0并调用该功能,即可启用指向设
备。
启用了指向设备之后,通过将AL置为1并调用此功能,使其复位。当该
操作获得成功之后,把BH设置为指向设备的设备ID号,便可重新设置该设
备的参数。
注意:这里是用类似的子功能(AL=5)来初始化指向设备的接口。通过把
BH设置1-8范围中的任何一个数字,便可调用对应的子功能,其中,数字1
至8代表数据包含所占用的字节数。
要允许设置指向设备的抽样频率,可把AL置为2。装载在BH中所期望
的抽样率是通过代码来表示的,具体见下表。
代码 抽样速率
00h 每秒10次报告
01h 每秒20次报告
02h 每秒40次报告
03h 每秒60次报告
04h 每秒80次报告
05h 每秒100次报告
06h 每秒200次报告
448页
要设置指向设备的分辨率,可把AL置为3,并把BH设置为所期望的分
辨率(0=每毫秒计数1次(cpm;1=2cpm;2=4cpm;3=8cpm)。
把AL置为4,便可读取设备ID号(通过BH返回)。这一返回值与重新设
置该设备(参见AL=5)时所返回的值是一样的。
系统
Int 15h 功能 C3h
允许/禁止监视器超时
<PS/2> 为PS/2监视器计时器提供控制。
调用寄存器: AH C3h
AL 00h,禁止监视器超时
01h,允许监视器超时
BX 监视器的计时器计数(1-255)
返回寄存器: PC,PCjr:
进位标志置位
AH 80h
PC XT, Personal Computer AT, PS/2 Model30:
进位标志置位
AH 86h
PS/2:
进位标志清除表示成功
进位标志置位表示出错
注释:该功能只能用于使用80286或80386微处理器的PS/2系列计算机上,
其作用是禁止/允许监示器计时器计时。在非PS/2的计算机上,该功能返回
进位标志置位状态并在AH中返回出错码。
监视器计时器使用计时器通道3,并且接通了IRQ0线。每当IRQ0活动
的时间超过通道0计时器(主系统计时器)的一次循环时间,监视器计时器的
计数也就相应地减少1次。当监视器的计时器计数减少到0时,便产生一次不
可屏蔽的中断(NMI)。该功能(以及监视器计时器)的主要用途是帮助检测错
误,并从错误中恢复正常。
系统
Int 15h 功能 C4h
可编程的选项选择
<PS/2> 通过选项板提供对PS/2系统可编程寄存器的访问。
调用寄存器: AH C4h
AL 00h,返回基本的POS接口卡寄存器地址
449页
01h,允许用于装置的插槽
02h,接口卡允许
返回寄存器: PC,PCjr:
进位标志置位
AH 80h
PCXT,Personal ComputerAT,PS/2 Mode 30:
进位标志置位
AH 86h
PS/2:
进位标志清除表示成功
DL 基本的POS接口卡寄存器地址(功能0
BL 插槽号(功能1)
进位标志置位表示出错
注释: Programmable Option Select(可编程的选项选择:POS)可用于那些使
用80286或80386微处理器的PS/2计算机上,其作用是消除对系统板和接口
切换的需求。切换功能由可编程的寄存器替换,而可编程的寄存器则可通过该
功能进行访问。
在非PS/2系统上,该功能返回错误。此时,进位标志置位,并且AH中包
含的也是出错码。
从根本上讲,该功能主要用于系统配置软件,而不能由应用程序使用。如
果打算使用该功能,则应小心;不正确地使用POS会导致系统失去其完整性,
并可能毁坏一些接口卡板,关于PS/2的配置和建立过程的讨论超出了本书
的范围。
系统
Int 15h 功能 D8h 子功能00h
读取EISA插槽信息
在EISA系统上,返回指定插槽中某个EISA设备的有关信息。
调用寄存器: AH D8h
AL 读取插槽信息
CL 插槽号(0-63)
返回寄存器:进位标志清除表示成功
AH 00h,成功
AL 销售厂商信息字节
BH 主再版号
BL 次再版号
CX 配置文件的检查和
450页
DH 设备功能号
DL 综合功能信息
SI:DI 4字节的销售厂商ID号
进位标志置位表示出错
AH 80h,无效插槽号
82h,扩展CMOS被破坏
83h,插槽为空
86h,非法的BIOS调用
87h,非法的系统配置
注释: EISA总线计算机是在ISA总线计算机基础上的扩展,也可用它来替
代几年前由IBM推出的MCA总线的计算机。该功能供EISA配置例程使用。
它允许读取指定扩展插槽中某个设备的信息。若使用这一例程的程序在32位
的模式(CS为32位)中运行,那么在调用该功能时,必须把AH的值置为
80h。
该功能主要是供系统配置软件使用的,而不是供应用程序使用。关于
EISA系统配置和建立过程的讨论超出了本书的范围。
系统
Int 15h 功能 D8h 子功能01h
读取EISA功能信息
在EISA系统上,返回指定插槽中某个设备专用的EISA功能的信息。
调用寄存器: AH D8h
AL 01h,读取功能信息
CH 功能号
BL 插槽号(0-63)
DS:SI 320个字节的缓冲区地址
返回寄存器:进位标志清除表示成功
AH 00h,成功
进位标志置位表示出错
AH 80h,无效插槽号
81h,无效功能号
82h,已产生讹误的扩展CMOS RAM
83h,插槽为空
86h,非法的BIOS调用
87h,非法的系统配置
注释: EISA总线计算机是在ISA总线计算机基础上的扩展,也是几年前由
IBM推出的MCA总线的计算机的替代品。该功能供EISA配置例程使用。它
451页
允许读取指定扩展插槽中某个设备的信息。该信息通过由DS:SI所指向的
320个字节的数据块返回。如果使用此例程的程序在32位模式(CS为32位)
下运行,那么在调用此功能时,应该把AH的值置为81h,并且DS:ESI必须
指向数据缓冲区。
该功能主要是为系统配置软件而设计的,因而应用程序无法使用它。有关
EISA系统配置及建立过程的讨论超出了本书的范围。
系统
Int 15h 功能 D8h 子功能02h
清除EISA COMS
在EISA系统上初始化CMOS RAM。
调用寄存器: AH D8h
AL 02h,清除COMS
BH 主版本号
BL 次版本号
返回寄存器:进位标志清除表示成功
AH 00h,成功
进位标志置位表示出错
AH 84h,写入CMOS时出错
86h,非法的BIOS调用
88h,不支持配置实用程序
注释: EISA总线计算机是在ISA总线计算机基础上的扩展,并且可用替代
几年前由IBM推出的MCA总线的计算机。该功能供EISA配置例程使用。它
允许清除扩展的COMS区域,但前提是系统必须支持由保存在BX中的版本
号,指定的配置实用程序。如果使用配置实用程序的主程序在32位模式(CS
为32位)中运行,那么在调用此功能时,应该把AH的值置为82h。
该功能主要是供系统配置程序而设计的,应用程序不能使用它。关于
EISA系统配置及建立过程的讨论超出了本书的范围。
系统
Int 15h 功能 D8h 子功能03h
写EISACOMS
在EISA系统上,把信息块写入COMS RAM。
调用寄存器: AH D8h
AL 03h,写给CMOS
CX 数据长度
DS:SI 数据缓冲区的地址
452页
返回寄存器:进位标志清除表示成功
AH 00h,成功
进位标志置位表示出错
AH 84h,写给CMOS时出错
85h,CMOS区域已满
86h,非法的BIOS调用
注释: EISA总线计算机是在ISA总线计算机基础上的扩展,也可用它来替
代几年前由IBM推出的MCA总线的计算机。该功能供EISA配置例程使用。
它允许把配置信息块写给扩展CMOS区域。若使用实用程序的主程序在32
位模式(CS为32位)下运行,那么在调用此功能时,应该把AH的值置为
83h,并且必须让DS:ESI指向数据区。
该功能主要用于系统配置软件,应用程序不能使用它。EISA系统配置以
及建立过程的讨论超出了本书的范围。
键盘
Int 16h 功能 00h
读取键盘字符
从键盘缓冲区中返回ASCII值和扫描码。
调用寄存器: AH 00h
返回寄存器: AH 键盘扫描代码
AL ASCII字符代码
注释:该功能可从键盘缓冲区中读取单个字符并返回该字符及其扫描码,在
编写一种需要用热键来激发其操作的TSR时,往往用到这一功能。只须监视
对该中断的请求就能捕获热键信息并可立即作出相应的应答。键盘缓冲区通
常位于0040:001Ah处。
在按键并接着返回键盘扫描码和该键击的ASCII代码之前,该功能一直
处于等待状态。若按下的键没有特定的ASCII代码,则返回值0。(例如箭头键
和功能键就没有特定的ASCII代码。)
虽然Ctrl、Alt和Shift键自身并不返回代码,但它们能修改其它按键以产
生独一无二的代码(如何确定这些键的状态,可参见Int 16h,功能02h)。
下面这两种特殊的按键- CtrL-Alt-Del(同时按下并按住Ctrl、Alt和
Del键)和PrtSc(同时按下并按住Shift键和PrtSc键)没有任何返回信息。
BIOS能识别这两种特殊的键击,并立即把控制权传送给其它的中断例程。
当在数字小键盘上敲入ASCII代码时,若按住Alt键,该功能便允许键入
任意字符。例如,在敲入156的同时按住Alt键,便可返回扫描码156。若敲入
的数字大于256,则所返回的代码为模256的余数(用所键入的数除以256;返
453页
回的代码为余数)。
键盘
Int 16h 功能 01h
读取键盘状态
检查是否能得到一个按键,如果能得到,则返回相应的ASCII代码和扫描码。
调用寄存器: AH 01h
返回寄存器:零标志清除(键等待)
AH 扫描码
AL ASCII字符代码
注释:与Int 16h,功能00h不一样,该功能只是粗略地检查一下键盘并立即
返回。若按键已经准备就绪,该功能就会清除零标志并返回该按键的ASCII
代码和按键扫描码。如果没有要处理的按键,该功能就设置零标志。如果某个
按键无特定的ASCII代码,则以返回值0来表示(例如,箭头键和功能键没有
特定的ASCII代码)。
虽然,CtrL、ALt以及Shift键并不返回相应的代码(如何确定这些键的状
态,可参见功能02h)。特殊的CtrL-ALt-Del和PrtSc按键没有返回信息,但它们
可导致立即产生其它中断。
如果在敲入相应的3位数代码号时按住Alt键,便可键入任意的ASCII
代码。例如,在敲入156时按住ALt,便会返回扫描码156。如果敲入大于256
的数字时,所返回的是模256的余数(用键入的数字除以256,返回的代码就
是剩下的余数)。
像其它的中断处理程序一样,Int 16的功能01h也不是以IRET指令来
结束的,相反,该功能使用的是RET指令,外加一个能从堆栈中清除剩余字节
的功能选项。通过这种返回方式,该功能就可用零标志作为返回标志。说不清
楚程序员们为什么要这样做,但这选择是正确的。或许这样做的用意是为了模
仿旧的CP/M键盘状态功能,这一功能的操作方式与该功能很相似。
键盘
Int 16h 功能 02h
返回键盘标志
返回指示Shift等键状态的状态字节。
调用寄存器: AH 02h
返回寄存器: AL ROM BIOS的键盘标志字节
注释:该功能从BIOS状态寄存器(保存在内存中0000:0417h位置)中返回
键盘触发器和Shift键的状态。
454页
特殊的键组合能成为特定操作的理想触发器。在旧的程序中,常常用Es-
cape键(Esc)来摆脱应用程序的控制。对那些不能取消的操作来说,Esc并不
是一种安全的选择,但是,在实际操作中太容易按下该键了。为了防止意外地
碰动了这个键,应该在程序发现按下了Esc键时,必须马上询问这么一个问题
“Are you sure?”(你肯定要这样吗?)”。当然也可以选定一个不易碰下的组合
键,如Ctrl-左Shift-右Shift。只是应十分小心不要使用双指一齐按的键或其它
不常用到的特性。
表15.31显示了从此功能所返回的AL寄存器中各个位的含义。
表15.31 BIOS键盘状态标志
位
含 义
76543210
. . . . . . . 1 已按下右Shift键
. . . . . . 1. 已按下左Shift键
. . . . . 1. . 已按下Ctrl键
. . . . 1. . . 已按下Alt键
. . . 1. . . . 已启用ScrollLock
. . 1. . . . . 已启用Num Lock
.1. . . . . . 已启用Caps LOck
1. . . . . . . 已转换Insert键
键盘
Int 16h 功能 03h
调整键盘重复速率
设置键盘重复速率和重复时的延迟。
调用寄存器: AH 03h
AL 子功能:
00h,恢复缺省重复速率和重复延迟(仅适用于
PCjr)
01h,增加初始的延迟时间(仅适用于PCjr)
02h,重复速率减半(仅适用于PCjr)
03h,增加初始延迟时间并将重复速率减半(仅
适用于PCjr)
04h,关掉键盘重复(仅适用于PCjr
05h,设置重复速率和重复延时(仅适于Personal
Computer AT)
BH 重复延时(仅适用于AT及PS/2)(03*250毫
秒)
455页
BL 重复速率(仅适用于AT和PS/2)(00h-1Fh,值
越低,速率越高)
返回寄存器:无
注释:该功能不能用于PC或PC/XT。其具体的使用方法可在实际操作中探
索或参阅这一方面的专著。
键盘
Int 16h 功能 04h
键击声音的开/关
打开或关掉键击声音(在击键时发出的)。
调用寄存器: AH 04h
AL 00h,键击声音关
01h,键击声音开
返回寄存器:无
注释:该功能只能用于PCjr不能用于PC、PC/XT、Personal Computer AT或
PS/2。
键盘
Int 16h 功能 05h
写入键盘缓冲区
写入增强的键盘缓冲区。
调用寄存器: AH 05h
CH 扫描码
CL 字符
返回寄存器: AL 若键盘缓冲区已满,则为1
注释:该功能只能用于采用增强键盘的PS/2和Personal Computer AT上。
要确定系统是否拥有增强键盘,可按下述步骤进行检验:
1.用功能05h来把FFFFh写入键盘的缓冲区。
2.用功能10h来从键盘中读出信息。
若获取的返回信息为FFFF,超出了16次的操作(tries)(键盘缓冲区的大
小),那么就表明系统无增强键盘。
键盘
Int 16h 功能 10h
获取按键
从增强键盘中获取按键。
456页
调用寄存器: AH 10h
返回寄存器: AH 扫描码
AL 字符
注释:该功能只能用于那些采用增强键盘的Personal Computer AT和PS/2,
其作用是对名称相似的键加上键盘识别处理。例如,键盘上有两个Alt键(左
和右);该功能则加上左与右Alt键之间的识别处理(对其它可用键标识表的
有关信息,可参见Int16h,功能12h)。从对Int 16h功能05h的介绍中,我们已
知道如何确定是否存在增强键盘。
键盘
Int 16h 功能 11h
检查键盘
返回增强键盘上Shift等键的状态。
调用寄存器: AH 11h
返回寄存器:零标志清除表示键盘可用
AH 扫描码
AL 字符
零标志置位表示无可用的增强键盘
注释:该功能只能用于那些具有增强键盘的PS/2和Personal Computer AT。
同其它键盘输入例程一样,在用字符的时候该功能返回字符和扫描码,并且在
无可用字符的时候返回零标志置位。可用该功能来实现输入例程程序,该例程
能有规则地轮询键盘,只是在等待输入时会处理其它方面的工作。
键盘
Int 16h 功能 12h
获取键盘状态标志
返回增强键盘上Shift键的状态。
调用寄存器: AH 12h
返回寄存器: AL 状态标志1
AH 状态标志2
注释:该功能只能用于那些有增强键盘的Personal Computer AT和PS/2
上,其用途和操作方式都与Int 16h,功能02h近似,不同之处在于它所返回的
是扩展信息。表15.29和表15.30已显示了该功能的状态标志的含义。但这
里应注意的是,表15.32提供的信息(通过AL返回)与Int 16h的功能02h返
回的内容(见表15.33)是一样的。
457页
表15.32BIOS 键盘状态标志
位
含 义
76543210
. . . . . . . 1 已按下右Shift键
. . . . . . 1. 已按下左shift键
. . . . . 1. . 已按下两个Ctrl键之一
. . . . 1. . . 已按下两个Alt键之一
. . . 1. . . . 已启用scroll Lock
. . 1. . . . . 已启用Num Lock
. 1. . . . . . 已启用Caps Lock
1. . . . . . . 已转换Insert键
表15.33BIOS键盘状态标志
位
含 义
76543210
. . . . . . . 1 已按下左Ctrl键
. . . . . . 1. 已按下左ALt键
. . . . . 1. . 已按下右Ctrl键
. . . . 1. . . 已按下右ALt键
. . . 1. . . . 已按下Scroll Lock
. . 1. . . . . 已按下Num Lock
.1. . . . . . 已按下Caps Lock
1. . . . . . . 已按下SysReq键
打印
Int 17h 功能 00h
把字符输出给打印机
把字符输出到并行打印机端口。
调用寄存器: AH 00h
AL 字符
DX 打印机号(0-2)
返回寄存器: AH 打印机状态(参见表15.34)
注释:该功能把指定的字符写给打印机端口并返回如表15.34所示的打印机
当前状态。
并非所有打印机都返回指定的状态信息项。这是由于打印机生产厂家之
间缺少统一的标准,因此,除了使用通用的IBM打印机,对其它打印机最好不
要使用状态信息。在个别情况下,如果没有接通任何打印机,BIOS信息常常会
(但不总是)报告出一种状态来表明打印机已准备就绪,并且已成功地传送了
458页
数据;如果已接通了打印机,但该打印机已关闭电源或已脱机,那么通常情况
下不会显示出“准备就绪”的信息。
表15.34打印机状态位
位
含 义
76543210
. . . . . . . 1 超时
. . . . . X X . 未使用
. . . . 1. . . I/O出错
. . . 1. . . . 已选择打印机
. . 1. . . . . 缺纸
.1. . . . . . 已确定
1. . . . . . . 打印机不忙碌
打印
Int 17h 功能 01h
初始化打印机端口
把一组复位控制序列发送给并行打印机端口。
调用寄存器: AH 01h
DX 打印机号(0-2)
返回寄存器: AH 打印机状态(参见表15.34)
注释:该功能初始化并行打印机端口,并返回该端口的状态(参见表15.34)。
它输出字节序列08h 0Ch给打印机端口(注意,这一序列是控制信号,不是数
据字符)。Epson和IBM打印机通过实现复位来响应这一序列码。但是,其他
打印机则有可能不作出正确的响应,并且,若它们与Epson和IBM不兼容时,
甚至产生干扰效果。
打印
Int 17h 功能 02h
请求打印机端口状态
返回并行打印机端口的状态。
调用寄存器: AH 02h
DX 打印机号(0-2)
返回寄存器: AH 打印机状态(参见表15.34)
注释:该功能返回指定并行打印机端口的当前状态(参见表15.34)。
注意,若在使用personal Computer AT、PC XT 286或Personal System/2
459页
机器,并且BIOS确定了打印机处于忙碌状态(参见表15.34中的位7),那么
BIOS就会执行Int 15h的功能90h(其它信息可参见对该功能的描述)。
系统
Int 18h
执行ROM BASIC
从ROM中启动BASIC。
调用寄存器:无
返回寄存器:无
注释:在IBM系统上,仍然将ROM BASIC解释程序包括在所有的BIOS
ROM集中。在引导进程期间,如果未找到软盘并且不存在硬盘,此时就会激
活该中断以执行ROM BASIC(一种磁带BISIC解释程序)。很少直接使用该
中断,并且为用户编写的软件没有激活该中断的触发器。
但是,至今仍然要用ROM BASIC,因为在IBM发布的软件磁盘上BASI-
CA解释程序用ROM BASIC以满足它们自己的许多例程。同时,由于ROM
BASIC不具备兼容能力,因而不能在兼容机上使用IBM BASIC。
在PS/2系统上,目前仍然将ROM BASIC包括在BIOS范围内。
PS/2
INT 19h
系统热引导
<PS/2> 初始化引导序列。
调用寄存器:无
返回寄存器:无
注释:该功能的作用与Ctrl-Alt-Del有点类似,即在不丢失当前内存状态的
前提下实现计算机的热引导(Ctrl-Alt-Del能实现热引导并且能将机器状态和
内存位置复位)。
与一些参考手册所介绍的情况相反,上述两种方法都与断电重启动方法
不一样,因为这一方法能导致实现完整的系统复位以及通电检查(包括内存检
查)。
在执行该中断时,它会从磁盘中把磁道0,扇区1(引导代码)读进内存,这
一过程从地址0000:7C00处开始。把DL寄存器置为产生引导的驱动器号,
然后就可执行地址0000:7C00h处的引导代码。如果硬件代码(BIOS不能定
位那些本来可以定位的引导扇区),则执行Int 18h。
460页
时钟
Int 1Ah 功能00h
获取时钟计数器
返回系统时钟计数器的值。
调用寄存器: AH 00h
返回寄存器: AL 零点(Midnight)标志
CX 高顺序字时钟计数
DX 低顺序字时钟计数
注释:该中断获取系统时钟计数器,该计数器从零点开始,每秒计数18.2065
次。从零点(midnight)开始的一整天共需计86400秒,这段时间内的计数次数
(时钟计数1573040次,经过的时间为86399.9129秒)。经过零点时,RAM中
的标志字节就被置为1。注意,如果在调用此功能之前零点已经过了两次,那
么第二次发生的事件就会被忽略。
通过执行此功能便可把AL恢复为0。但是,在复位之前应留心其它程序
是否需要经过零点的信息。
时钟
Int 1Ah 功能01h
设置时钟计数器
设置系统时钟计数器的值。
调用寄存器: AH 01h
CX 高位字时钟计数
DX 低位字时钟计数
返回寄存器:无
注释:该中断设置系统时钟计数器。要把时钟设置为某个特定时间,必须计算
出想要表现出的计数次数(从零点开始)。完成这一操作后,该数字便成了时钟
的新设置。
要确定计数次数,先应计算出从所期望的时间设置的零点以来经过的秒
数并将该数字乘以18.2065(每秒的计数次数)。但是要注意的是BIOS不能担
保不会出现非法值。如果规定的某个值超出了正常情况下一天的范围(24小
时,或1800Bh计数),BIOS也会接受它。
时钟
Int 1Ah 功能02h
读取实时时钟
461页
返回由实时时钟记录的时间。
调用寄存器: AH 02h
返回寄存器:进位标志清除表示成功
CH 小时数(BCD码)
CL 分钟数(BCD码)
DH 秒数(BCD码)
DL 夏时制时间标记
(不是所有的BIOS版本都支持)
进位标志置位表示出错
注释:该功能只能用于PC XT 286、Personal Computer AT或PS/2系列,其
作用是返回BCD码表示的(二进制编码的十进值)时钟值。如果Personal
Computer AT BIOS的注明日期为6/10/85以前,则DL中的用于指明存在夏
时制时间的选项不起作用,因而也不会返回。
BCD码的意思是字节(8位)中的每4位解释为一个十进制位,并将忽略
A至F之间的十六进制数值。表15.35显示了各十进制值所对应的十六进制
数值的范围,其中每个十六进制值代表一个相应的十进制值,要占4个二进制
位。
表15.35 BCD对应表
十六进制值 十进制值
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
A 未定义
B 未定义
C 未定义
D 未定义
E 未定义
F 未定义
要使用表15.35,可先确定哪一数字同某个已编码成BCD的字节相对
应,然后再查看每一个四字节的值。例如,一个值为34h的字节代表着采用
BCD的十进制值34。在BCD编码中,字节A3h是未定义的,因为第一个四位
字节(A)超出了所允许的BCD码的表示范围。
如果进位标志置位,则表明时钟未起作用,此时应忽略返回值。
462页
时钟
Int 1Ah 功能03h
设置实时钟
设置由实时时钟所保持的时间。
调用寄存器: AH 03h
CH 小时数(BCD码)
CL 分钟数(BCD码)
DH 秒数(BCD码)
DL 夏时制时间(不为所有的BIOS版本支持)
返回寄存器:无
注释:该功能只能用PC XT 286、Personal Computer AT或PS/2系列。必须
按BCD(二进制编码的十进制)来设置时钟值。每一个4位字节就是一个十进
制数;同时忽略了十六进制数字中的A至F。表15.35显示了与十六进制的值
相对应的十制值,表中的十六进制值都采用代表BCD数字的四位字节来表
示。
可把寄存器AL编码成保存标准时间的时钟(DL=0)或保存为夏时制时
间的时钟(DL=1)。如果Personal Computer AT BIOS的发行日期早于6/10/
85,那么DL的值(表明夏时制选项是否存在)不起作用,也不必设置该值。
时钟
Int 1Ah 功能04h
从实时时钟内读取日期
返回由实时时钟保持的日期值。
调用寄存器: AH 04h
返回寄存器:进位标志清除表示成功
CH 世纪(BCD)
CL 年(BCD)
DH 月(BCD)
DL 日(BCD)
进位标志置位表示出错
注释:该功能只能用于PC XT 286、Personal Computer AT和ps/2系列上,
它能返回采用BCD(二进制编码的十进制)的时钟值。每一个四位字节就是一
个十进制数字;同时还忽略了十六进制数字中的A至F值。表15.35显示了
463页
与十六进制值相对应的十进制的值都采用代表BCD数字的4位字节来表示。
如果进位标志已置位,则表明时钟未起作用,此时应忽略返回值。
时钟
Int 1Ah 功能05h
设置实时时钟的日期
设置由实时时钟维护的日期。
调用寄存器: AH 05h
CH 世纪(BCD) (19或20世纪)
CL 年(BCD)
DH 月(BCD)
DL 日(BCD)
返回寄存器:无
注释:该功能只能用于PC XT 286、Personal Computer AT或PS/2系列。在
使用该功能时,应采用BCD(二进制编码的十进制)方式来设置时钟值。其中
每一个四位字节代表一个十进制数时,同时还忽略了十六进制数字的A至F
位。表15.35显示了与十六进制值相对应的十进制值,在该表中,十六进制的
值都采用代表BCD数字的四位字节来表示。
必须赋给BIOS以正确的值,因为在使用该功能时对BIOS的值不进行范
围检查。不正确的BIOS值会导致难以预料的时钟设置。
时钟
Int 1Ah 功能06h
设置系统闹钟时间
设置系统闹钟计时器,以便在将来某个时间产生中断。
调用寄存器: AH 06h
CH 小时数(BCD)
CL 分钟数(BCD)
DH 秒数(BCD)
返回寄存器:进位标志清除表示成功
进位标志置位表示出错
注释:该功能只能用于PC XT 286、Personal Computer AT或PS/2系列。在
此过程中,闹钟设置必须采用BCD(二进制的十进制)方式。其中,每个四位字
节就是一个十进制位数字,并且忽略了十六进制数字中的A至F位。表15.35
给出了与十六制值(采用代码BCD数字的四位字节)相对应的十进制值。
闹钟设置是当前时间的偏移时间。当时间用完时,系统就会激活Int 04h
(运算溢出)。设置闹钟信号的程序必须检查所赋给值的有效性,因为BIOS不
464页
进行有效性检查。在复位闹钟信号之前,必须用功能07h来禁止它,并设置中
断处理程序来处理闹钟信号。
在返回信息中,已置位的进位标志表明已经出错。要么是在未来得及禁止
之前已设置了闹钟信号,或者是时钟未起作用。
时钟
Int 1Ah 功能07h
禁止实时时钟闹钟
关闭系统闹钟计时器。
调用寄存器: AH 07h
返回寄存器:无
注释:该功能只能用于PC XT、Personal Computer AT或PS/2系列,其作用
是禁止实时闹钟时钟。若已设置了时钟闹钟,那么在对其进行复位之前,必须
调用该功能。
时钟:
Int 1Ah 功能09h
读取实时时钟闹钟信息
返回系统闹钟计时器的状态。
调用寄存器: AH 09h
返回寄存器: CH BCD小时数
CL BCD分钟数
DH BCD秒数
DL 闹钟状态
0,未得到允许
1,已允许,但未启动
2,已允许,准备启动系统(仅用于Convertible)
注释:该功能只能用于PC Convertible和PS/2 Model 30,其作用是报告实时
闹钟时钟的设置和状态。
时钟
Int 1Ah 功能0Ah
获取日计数(天数)
返回自1980年1月1日起的天数。
调用寄存器: AH 0Ah
返回寄存器: CX 自1980年1月1日以来的总共天数
465页
注释:该功能只能用于PS/2系列以及那些BIOS发行日期为01/10/86或更
晚的PCXT上,其作用是通过寄存器CX返回自1980年1月1日以来的总天
数。
时钟
Int 1Ah 功能0Bh
设置日计数(天数)
设置自1980年1月1日以来的天数。
调用寄存器: AH 0Bh
CX 自1980年1月1日以来的天数
返回寄存器:无
注释:该功能只能用PS/2系列或那些BIOS发行日期为01/10/86以及更晚
的PCXT上,其作用是通过CX寄存器把自1980年1月1日以来的天数传送
给BIOS。这个值被内在地保存,以维持系统日历;其作用是改变日历设置。
时钟
Int 1Ah 功能80h
设置声音源
选择供系统使用的音源。
调用寄存器: AH 80h
AL 音源
00h,8253芯片,通道2
01h,磁带输入
02h,I/O通道线路中的音频
03h,声音生成器芯片
返回寄存器:无
注释:该功能只能用PCjr,其作用是从四种音源中为内部声音系统选择合适
的音源。PC系列中的其它计算机不具备这种声音功能。
系统
Int 1Bh
Ctrl-Break地址
Ctrl-Break中断处理程序的地址。
调用寄存器:无
返回寄存器:无
466页
注释:中断向量1Bh保存着Ctrl-Break中断处理程序的地址。当Ctrl-Break
键顺序终止某个程序时,就会把控制权传送到这一地址。在键盘输入期间,当
ROM BIOS发现Ctrl-Break字符时,BIOS就会立即调用该中断处理程序。由
于这一过程是在位于BIOS水平上的键盘扫描期间发生的,因而不能保证对
DOS的安全(有关中断处理的安全性信息可参见第11章对“中断处理程序”的
讨论)。
在初始化期间,ROM BIOS中断向量1Bh设置为指向IRET指令。 DOS
将此中断向量重新设置为指向DOS内的处理程序,此时该处理程序就会迫使
Ctrl-C字符进入由DOS维护的键盘缓冲区(从BIOS就会发现下一次它将要
检查的Ctrl-C字符。
该功能使得Ctrl-C和Ctrl-Break所对应的两种中断处理程序的作用相
等,不同之处在于,它将延缓Ctrl-Break键击发生作用,直到能安全地进行操
作为止。 Ctrl-C中断(Int 23h)是一种位于DOS水平上的行为,并且直到DOS
处于“安全”状态时才执行这一中断。而CtrL-Break是在ROM BIOS水平上执
行的,因而它不可能知道DOS是否处于安全状态。
在程序的运行过程中,是最简单的Ctrl-Break(或Ctrl-C)处理程序可把中
断指向另一个IRET指令,以便忽略Ctrl-Break(或Ctrl-C)字符。这样一旦字
符进入了输入流,程序就能立刻处理它们。
时钟
Int 1Ch
计时器计时中断
在每一个时钟计时过程中由系统计时器中断调用。
调用寄存器:无
返回寄存器:无
注释:把向量1Ch——由Int 08h(系统节拍器)调用的计时器计时中断初始
化为指向IRET指令。每当时钟计时时,都需要激活的TSR能把该中断向量
复位为指向定制的中断处理程序。
由于是从Int 08h代码内调用Int 1Ch,因而该功能在执行过程中,在具有
最大优先权的操作完成之前,可共享最大优先权以防止系统应答任何其它硬
件中断请求,包括串行设备或磁盘单元发出的中断请求。这样,当时间灵敏型
的应用程序在运行时必须保证对用于该功能的处理程序花费绝对少的时间,
否则就会丢失数据。
对TSR来讲最好的方法就是只从该功能中设置一种标志,然后符合另一
道已挂接Int 28h(DOS OK)链的处理程序中检验这一标志,因为Int 28h链有
一种样品时间,可在不封锁硬件中断的前提下留心任何必需的处理。
467页
显示
Int 1Dh
视频初始化参数表
指向视频控制卡初始化参数表的指针。
调用寄存器:无
返回寄存器:无
注释: Int 1Dh(不是一种真正的中断)指向用于视频控制卡的初始化参数。由
于Int 1Dh不是可执行的代码,因此该中断必须由程序调用。在该中断上,任
何执行代码的尝试都会导致不可预料的结果,就好像是加上了一种系统锁。
磁盘
Int 1Eh
磁盘初始化参数表
指向用于磁盘控制卡初始化的磁盘库表的指针。
调用寄存器:无
返回寄存器:无
注释: Int 1Eh(不是一种真正的中断)指向磁盘库表--一种用于磁盘控制
卡的初始化参数表。由于Int 1Eh不是可执行的代码,因此必须通过程序来调
用此中断。在该中断上,任何想执行代码的尝试都会导致难以预料的结果,就
好像是加上了一道系统锁。
虽然可以修改此表以便优化磁盘访问并调谐系统,但在进行任何修改时
都要极其小心,因为这一过程能毁坏任何内容,包括已保存在磁盘上的每一内
容。
显示
Int 1Fh
图形显示字符位图表
指向用于视频字符生成的位图表的指针。
调用寄存器:无
返回寄存器:无
注释: Int 1Fh(不是一种真正的中断)指向用于代表128至255的ASCII字
符的图形模式字符位图。由于Int 1Fh是不可执行的代码,因此必须通过程序
来调用这一中断。在该中断上,任何执行代码的尝试都会导致难以预料的结
果,就好像是存在一种系统锁。
位图表中共有128个字符(总计为1K的内存区域),它采用了一种最为
468页
简单的结构。其中,每一项为8个字节长,并且代表看一个8乘8字符。每一
字节对应着这种字符中的一个扫描行。
下面给出一个代表大写字母“I”的实例字符,其编码组成如下:顶部和底
部各有一个空白扫描行,顶部和底部横条各占一个扫描行,中部的垂直条占据
四个扫描行:
12345678
100000000
201111110
300011000
400011000
500011000
600011000
701111110
800000000
字节串:00h,7eh,14h,14h,14h,14h,7eh,00h
通过将该指针复位,就能创建出可用于CGA图形模式的字符。
系统
Int 4Ah
实时时钟闹钟中断
在出现实时时钟闹钟时调用该中断。
调用寄存器:无
返回寄存器:无
注释:该功能只能用于Personal Computer AT、PC XT 286和PS/2产品系
列。一旦设置了实时时钟闹钟(参见Int 1Ah,功能06h)并且遇到了特定的时
间,此时就会产生闹钟信息并调用该中断。通过截获该中断就能找到供该闹钟
信息执行的例程。
如果使用了这一中断,那么在返回到DOS之前必须确保将它复位到它的
初始化向量上。
时钟
Int 70h
实时时钟中断
每秒调用1024次,以产生周期性的控制和发挥闹钟功能。
469页
调用寄存器:无
返回寄存器:无
注释:该功能只能用于Personal Computer AT、PC XT 286和PS/2产品系列
上(在PS/2 Model 30中不存在这种周期性的功能)。
在每秒钟的时间内调用实时时钟中断的次数大约为1024次。无论何时调
用该中断,双字计数都会减少976微秒(1/1024秒)。该计数的初始值是通过
调用Int 15h,功能83h(事件等待)或功能86h延时)来设置的。当该计数小于
或等于零时,指定等待标志中的位7就会被设置。对于功能83h,等待标志是
通过ES:BX寄存器指针来指定的,而对于功能86h,该标志位于BIOS数据
区位置0040:00A0h处(拖延活动的标志)。
如果通过调用Int 1Ah功能06h把实时时钟作为闹钟功能而激活的话,
那么当时间用完时,Int 70h就会调用Int 4Ah以激活闹钟处理程序(必须在
发出对Int 1Ah的调用之前设置闹钟处理程序)。
第16章DOS参考手册
本章主要介绍DOS提供的各种服务。这些服务都是20-2F范围内的各种中断,其中
包括许多对程序的正确执行具有重要意义的功能。除了专门介绍DOS扩充程序、扩充内
存管理以及DOS任务切换之外,还专门有一部参考手册介绍如何使用鼠标功能的Int
33h和用于扩展内存管理的Int 67h。
在正式进入各种特定的DOS服务之前,应先了解一些基本概念,以便于更进一步地
了解如何利用这些服务。
16.1怎样调用DOS服务
调用DOS服务的方法与调用BIOS服务的方法十分近似,也是通过使用软件中断来
调用的。如何直接执行中断取决于所使用的编程语言,并且在大多数情况下,取决于编程
语言方言化程度和实现方式。例如,该书从头至尾采用了不同的语言,诸如汇编语言、BA-
SIC语言、C语言和PASCAL语言。
如果要将DOS中断用于多种不同的功能,那么,应在调用DOS中断之前将所期望的
功能号装入AH寄存器。如果将同一功能号用于几种不同的子功能,这一过程就有可能予
以修改。在这种情况下,就应在调用DOS中断之前把所期望的子功能号装入AL寄存器。
除了要求特殊的中断、功能和子功能之外,每一个DOS服务器通常还要求特定的参
数。这些参数常常通过使用CPU寄存器来提供。根据所要求的DOS服务的不同甚至所使
用的DOS版本的不同,这些参数都会相应地有所不同。
为了能成功地使用DOS服务,必须遵循如下步骤:
1.为DOS服务装载所需要的寄存器并正确地设置各项参数。
2.如果要把一个DOS中断用于多种功能,则把正确的功能号赋给AH。
3.如果把一个DOS功能用于多个子功能,就把正确的子功能号装入AL。
4.调用DOS中断。
5.检查所有返回值的有效性及用途。
16.2可重入性
由于DOS设计成了单一用户的单任务系统,因而DOS服务是不可重入的。这就意味
着不能从其它DOS服务中调用DOS服务,这样也就免去把事情弄得一团糟的风险。例
471页
如,若已开发出了一种靠中断驱动的Whiz-bang系统,并把它作为终止驻留(TSR)实用程
序而安装在计算机上,那么当软件在处理某个中断时,就有可能出现具有同样特性的另一
个中断。面对这种情况该怎么办呢?如果DOS是可重入的,则很简单,出现一个中断就处
理一个中断。但是,这对DOS来说是不可能的,因为DOS是不可重入的。图16.1说明了
这类操作的可能顺序。
注意:在步骤D上,一旦DOS命令已发挥作用,就可从新的中断上得知处理程序进
程重复了一次。通过执行步骤I便可完成该中断的处理,并且可把控制权返回到在DOS
命令第一次重复时(步骤J)的初始化位点。但是,也正是在这一位点上,步骤F和G改变
了步骤C期间曾使用过的所有DOS变量和堆栈位置。其结果是可以预料的,即:程序失去
对系统的控制,因为系统在试图返回到最初调用DOS(步骤B) 的位点上时被锁定,它实际
上返回到了第2个调用位点(步骤E)。
图16.1DOS内不可重入的效果
16.3保留的功能
表16.1中列出的功能都是IBM和Microsoft保留的功能。按照Tim Pater son(MS-
DOS嫡系祖先- 86-DOS的创作者),表中前四项功能曾应用在86-DOS中,专门服务
于与旧CP/M操作系统的兼容但是IBM却没有在初始的DOS版本中公开这些功能。至
今仍沿用这些功能以提供与版本1的兼容。稍后,在DOS服务参考手册列表中没有使用
通过Int 21h来调用的那些功能。至于为什么存在功能61h至今仍是个迷,不过有一点是
可以肯定的,即它所使用的两种指令代码系列与前四种功能所使用的代码系列相同。
472页
表16.1保留功能
中断 功能
21h 18h
1Dh
1Eh
20h
61h
2Bh
2Ch
2Dh
16.4未公开的功能
以下的各种功能,IBM或Microsoft均未公开,但程序员们早已公开了部分功能的含
义和用途,这些功能列在表16.2中。许多时候,通过单调乏味的试错法和仔细阅读代码列
表还能不断地发现新的含义和用途。此处所列出的功能以及稍后在DOS服务参考手册列
表中列出的功能仅供读者参考,在这点上必须保持警惕,因为这些功能都未正式公开,
IBM、Microsoft或其它DOS生产厂商随时都会改变这些功能,而且事先不会有任何揭示。
必须在自己的系统上检验这些功能的操作情况,并且证实到其结果与特定的应用程序所
返回的结果相同时,才能采用这一功能。同时,还可参见附录D“保留的DOS功能”,这一
部分介绍了未公开的和保留的功能。
表16.2未公开的中断和功能
中断 功能 用 途
21h 37h 获取/设置开关字符
52h 获取磁盘列表
53h 转换BPB
55h 创建PSP
5Dh 获取关键出错标志地址
60h 扩展为完整路径名
29h 快速输出字符(putchar)
2Eh 执行命令
<STOP> 稍后,读者们会看到与每一个保留功能一样,该功能的旁边会出现一个“stop”
微标。这一微标意味着在使用半公开的保留功能时,必须保持高度的小心。对保留功能而
言,不会出现其它报警信息。
16.5DOS服务
如果读者对本章中每一功能的表现形式尚有疑问的话,可回过头去看看本书前面“参
473页
考手册概述”一章内容。
系统
Int 20h 版本1
终止程序
终止程序的操作并把控制返回给装入该程序的进程,通常情况下为COM-
MAND.COM
调用寄存器:无
返回寄存器:无
注释: 旧DOS方面的高手能识别这一功能,因为在版本1上它是一种终
止程序的标准方法。该功能可执行基本的操作,其功效与功能00h相同。随着
DOS功能4Ch和31h的应用,这种功能在终止程序方面也就变得不那么备受
推崇,除非在必须与DOS版本1系统保持兼容的情况下才非用它不可。较新
的功能允许从高层程序或批处理文件中返回出口代码。新的DOS版本通过把
AX设置为4C00h来把Int 20h转换成发出Int 21h的调用,从而达到处理Int
20h行为的目的。因此,在这些系统上,该中断能产生一个为00h的出口代码。
Microsoft已不再建议使用这一功能,除非要用它来维护旧的软件。面向
该功能的支持可以随时终止。必须用功能4Ch来替代。
除了终止程序并释放由该程序占用的内存空间外,该中断还能执行如下
功能:
·从程序段前缀(偏移值0Ah)中恢复终止处理程序向量。
. 在版本2或更高的版本中,通过程序段前缀(偏移值12h)来恢复关键
出错处理程序。
. 将DOS自身使用的文件缓冲区(而不是任何程序的文件缓冲区)清空
并将其写入磁盘。
·终止并释放程序占用的全部内存
在版本2之前的DOS版本不执行第3项,在完成这些功能之后,该中断
就会把系统控制传送给终止处理程序地址,就像第1项中所恢复过来的一样。
表面上看起来该过程至此似乎完成了,但如果使用文件控制块(FCB)文
件处理功能,这一过程实际上尚未圆满完成,若使用FCB功能,那么使用这一
命令就不能关闭文件。即使把DOS为自身保存的缓冲区内的信息写入磁盘
(这些缓冲区将被清空),但既未把目录信息更新为反映出文件的改变,也无任
何保证可肯定已清空某个应用程序内的文件缓冲区。只有用于FCB的文件关
闭功能(功能10h)才能正确地关闭文件、更新目录以及释放出其他程序所使
用的缓冲区空间。作为一种结论,并且为了形成良好的编程方式,建议在使用
这种程序终止功能之前,必须明确地关闭已打开的任何文件。
474页
EXE程序在调用此功能时必须保持高度小心,因为CS寄存器必须指向
程序段前缀(PSP)所在的段。一般情况下往往具有COM程序,但却不一定会
是EXE程序。大多数时候这种现象并不会出现问题,并且没有明确地设置CS
寄存器的调用也能正常地运转。
当程序终止功能已实现之后,系统就会把系统控制返回给已调用最近通
过EXEC功能(DOS功能4Bh)而终止的子程序的父程序。一般来讲,这种父
程序为COMMAND.COM,但也可以是其他任何程序。如果把控制返回给
DOS,DOS就会把控制传送给COMMAND.COM的常驻部分,同时,在此处
还会进行内存检测,以确定有无必要重新装载暂驻部分。如果检查和测试失
败,就会重新装入暂驻部分。最终,倘若批处理文件尚在处理中,那么就能获取
并执行该批处理文件的下一行。
系统
Int 21h 功能00h 版本1
终止程序
终止程序并把控制返回给装入该程序的进程。
调用寄存器: AH 00h
CS PSP段地址
返回寄存器:无
注释:在实际应用中,该功能与Int 20h等效。关于Int 20h的详细介绍请参见
Int 20h后面的注释部分。
I/O
Int 21h 功能01h 版本1
带反馈的键盘输入
从键盘中读取字符(STDIN从DOS版本2开始)并把该字符反馈给视频显示
(STDOUT从DOS版本2开始)
调用寄存器: AH 01h
返回寄存器: AL 8位的数据
注释:这是一种最简单的键盘输入方法,也是程序员乐于使用的输入方法。该
功能简单地等待用户键入字符,然后把字符反馈给视频显示,并将其返回给程
序。
在DOS版本1中,情况很简单:该功能仅仅从键中获取字符,并且只在视
频显示上显示出它们。但是,从DOS版本2开始,由于重定向功能的应用,情
况变得复杂化了。目前,该功能从标准输入设备(STDIN)中获取字符,并且在
标准输出设备(STDOUT)上显示它们。一般情况下,STDIN就是键盘,并且
475页
STDOUT就是视频显示,但是用户可按实际需要将它们进行重定向。
如果在STDIN上没有可用的字符,该功能就会一直等到有可用字符的出
现。如果已把STDIN重定向为键盘以外的设备,那么当输入的字符可用时或
为零散状态时,这种规定便会导致混乱。但是,在用键盘进行输入时,使用这种
方法便会顺理成章,并常常是效果甚佳的方法。
一旦字符可用并且已显示出该字符,此时便会返回它的ASCII值。如果
输入字符为扩展的ASCII字符,则返回零值,并且要求另一个发向该功能的
调用返回被击键的扫描码。扩展的ASCII代码在附录A“ASCII字符集”中作
了详细介绍。
重定向了STDIN和STDOUT之后,若使用此功能便会引起如下两个问
题:
. 如果输入的是文件,则有可能返回与扩展键盘代码不相称的零字节
·在版本4之前的DOS版本中,该功能不能检测出文件的结尾。到了版
本4,当重定向输入时,该功能在文件的末尾报告出一个关键错误
(Out of Data)。
一旦重定向了STDIN并从文件中获取输入内容时,上述情况可导致重大
问题,有鉴于此,许多人想使用不同的DOS输入功能:06h、07h、08h或3Fh
(在使用句柄为0的STDIN时)。
在使用这一功能时,按下Ctrl-C或Ctrl-Break便可以在该功能返回之前
调用Int 23h。
与所有执行Ctrl-C检查的DOS键盘输入功能一样,Alt与某个链构成的
输入组合也能误导这一功能(DOS会错误地解释这些功能的返回扫描代码,
当输入给合分别为Ctrl-Q、Ctrl-S或Ctrl-P;它们所对应的键分别为Alt-W、
Alt-R或Alt-Q)。
Microsoft建议用户不要再使用这一功能,除非在需要用它来维持旧软件
时才使用它。面向该功能的支持可随时终止。应使用功能3Fh来代替该功能。
I/O
Int 21h 功能02h
显示输出
把字符输出给视频显示(自DOS2.0版本开始输出给STDOUT)。
调用寄存器: AH 02h
DL 8位字符数据
返回寄存器:无
注释:与其他许多通过Int 21h来访问的、具有低序号的I/O功能一样,该功
能的使用方式取决于所使用的DOS版本。在DOS版本1中,该功能仅仅直接
476页
输出给视频显示。自DOS版本2开始,该功能直接输出给标准输出设备
(STDOUT)——缺省的视频显示。
在屏幕上,系统恰当地把退格字符作为无损(nondestructive)退格来处理。
在操作期间,如果检测到Ctrl-C或CtrL-Break,则它们也会得到处理。
如果用户重定向了输入,使用该功能就会出现问题。若把输出送给文件,
磁盘出错就会“挂起”系统,因为在版本4之前,该功能没有办法检测或处理磁
盘出错。(版本4的出现大大地改进了错误处理功能,它能强制实现的关键出
错终止。)注意,该功能没有返回值,因此,一些用户可能想通过使用预先定义
的句柄1(STDOUT)来使用不同的DOS输出功能,如功能40h。
Microsoft建议不要再使用这种功能,除非要用它来维持旧软件不可。对
该功能的支持可随时终止。应使用功能40h来代替该功能。
I/O
Int 21h 功能03h 版本1
辅助输入
从第一个串行端口中读取字符(自DOS版本2开始从STDAUX中读取)。
调用寄存器: AH 03h
返回寄存器: AL 来自STDAUX的8位输入数据
注释:与键盘不一样,串行设备不具备缓冲能力,这就意味着当字符输入时,
串行设备一次只处理一个字符。如果输入字符的速度大于软件处理速度,字符
就会丢失。该功能从串行端口中获取字符。如果无可用的字符,该功能一直等
到出现有可用字符时才返回。
DOS版本2开始,该功能从标准的辅助设备(STDAUX)中获取字符,
STDAUX通常缺省处理为COM1。在IBM的DOS版本中,COM1有一个缺
省初始化状态,此时有2400个bps、8个数据位、无奇偶性以及有1个停止位。
可用DOS MODE命令来重向STDAUX,并且可通过BIOS功能(参见第7章
“串行设备”以及BIOS参考手册)或直接在硬件层上改变数据格式设置,对后
一种方法本书也作了介绍。
遗憾的是,不能通过这种DOS功能来访问串行设备的状态信息。既不知
道字符是在等待或已丢失,也不知道如何为该端口设置参数。这是在使用串行
设备方面的主要不足之处。若要通过串行端口来处理较为重要的信息,则必须
至少要到达BIOS层,并且通常在硬件层上通过定制的中断处理软件来运行
串行端口。
使用该功能时,允许使用Ctrl-C和CtrL-Break这两种处理方法。如果检测
到Ctrl-C或Ctrl-Break, Int 23h就会立即得到执行。
除了这种功能之外,也可预先定义句柄3(STDAUX)来使用功能3Fh,以
便从串行端口中读取信息。
477页
Microsoft建议用户不要再使用这种功能,除非得用它来维持旧软件。可
随时终止对该功能的支持。应使用功能3Fh来代替。
I/O
Int 21h 功能04h 版本1
辅助输出
把字符输出到第一个串行端口(STDAUX从DOS版本2起开始使用)。
调用寄存器: AH 04h
DL 要输出给STDAUX的8位数据
返回寄存器:无
注释:该功能的使用是把字符传送出串行端口。自DOS版本2开始,该功能
直接输出到标准辅助设备(STDAUX)上,STDAUX通常缺省处理为第一个
串行端口。 IBM的DOS版本往往把COM1初始化为缺省的STDAUX,此时
所处的状态为具有2400bps、8个数据位,无奇偶性以及有1个停止位。虽然其
他DOS版本在格式上可以不同于缺省数据格式,但都必须缺省处理为COM1
作为标准辅助设备。
在进行输出时,如果STDAUX设备没空,那么该功能会一直等到它有
空。因此,若在STDAUX没空时调用该功能,就容易导致“挂起”计算机。更为
有用的功能则有可能返回串行端口的状态信息。就目前情况而言,较谨慎的程
序员们很少使用这种功能。若要通过串行端口来处理一些较重要的信息,则至
少必须要在BIOS层上,并且通常情况下往往在硬件层上用定制的中断处理
软件来运行串端口。
幸好,在调用期间允许启用Ctrl-C或Ctrl-Break处理。只要检测到Ctrl-C
或ctrl-Break处理程序,就有可能恢复因等待可能永远不能用的串行端口而
"挂起"的计算机。但是,这一过程不好处理,并且十分繁琐。对于编程而言,最
好用其它的方法来控制串行端口,实际上,大多数用户更乐于用别的方法。
如果使用其它的DOS设备控制功能,那么通过预先定义句柄3
(STDAUX),就能用DOS功能40h来把字符输出给STDAUX。
Microsoft建议用户不再使用这种功能,除非得用它来维持旧软件。可随
时终止对该功能的支持。应用功能40h来代替此功能。
打印
Int 21h 功能05h 版本1
打印机输出
输出字符给打印机(DOS版本2开始采用STDPRN)
调用寄存器: AH 05h
478页
DL 要打印给STDPRN的8位数据
返回寄存器:无
注释:该功能一直等打印就绪才发送字节。由于不返回打印状态信息,因而在
等待没有挂上系统或未就绪的打印机时,计算机有可能会自动"挂起"。若使用
BIOS打印机功能(Int 17h)或通过预先定义句柄04h来使用DOS功能40h,
就能获得更令人满意的结果。
在该功能的运行期间,只要检测到有Ctrl-C或Ctrl-Break,就会导致执行
Int 23h。
Microsoft建议用户不要再使用这种功能,除非要用它来维持旧软件。可
随时终止对该功能的支持。应使用功能40h来代替。
I/O
Int 21h 功能06h 版本1
直接的控制台I/O
不经过DOS的处理而直接读和写控制台。
调用寄存器: AH 06h
DL 所请求的功能
00h至0FEh,要输出的字符
0FFh,输入字符请求
返回寄存器:若输出字符则无返回
若输入字符:
零标志置位(2F=1)表示无可用字符
零标志清除(2F=0)表示字符可用
AL 8位数据
注释:该功能只能进行输入或输出,而不能既输入又输出,采取何种操作取决
于DL寄存器的设置。把DL寄存器设置为FFh表明“输入”,此时很明显不能
用该功能来输出FFh字符,虽然这不是一种主要的限制因素,但在某些情况
下却很有意义。
退一步讲,即使应用程序不能输出所有可能的ASCII代码,那么还可通
过预先定义句柄1(STDIN)和2(STDOUT)来使用DOS功能3Fh和40h,以
便完成同一类型的输入和输出。
有时候该功能可用作原始的I/O功能,即读取字符而无反馈、并忽略
Ctrl-C或Ctrl-Break字符,然后将字符传送给程序而不是给某个中断处理程
序。编辑、字处理和其他某些程序需要完整的键盘控制,因为它们必须解释在
通常情况下使用该功能的各种键击。(与原始I/O正好相反的是经过加工的即
"cooked"I/O;这些术语都来自于UNIX终端处理程序世界,在那儿它们各有
其特定的含义。关于原始的和已加工的I/O,以及与面向字符设备驱动程序之
479页
间的关系问题可参见第12章“设备驱动程序”)。
随着功能01h的使用,键盘中返回的代码统统为ASCII代码,除非所按
下的键设置有相应的ASCII代码。如果该功能返回的AL值为零,则再一次调
用该功能就会返回与该按下的键相对应的扫描代码。关于扩展ASCII代码的
信息可参见附录A“ASCII字符集”。这种DOS功能是唯一一种能正确地读出
Alt与某个键组成的输入组合的功能(但返回的扫描码位图会被DOS错误地
解释,即按下Ctrl-Q、Ctrl-S或Ctrl-P,对应的键Alt-R和Alt-Q)。
I/O
Int 21h 功能07h 版本1
直接的STDIN输入
不经过Ctrl-C截取,而直接从标准输入设备(STDIN)中读取字符。
调用寄存器:AH 07h
返回寄存器: AL 8位输入数据
注释:该功能处理输入,在这点它类似于功能01h,所不同的是它不把字符反
馈给视频显示,并且不支持Ctrl-C或Ctrl-Break处理。在DOS版本1系统上,
只能从键盘中读取字符。若字符尚未就绪,该功能会一直等到有字符变成可用
字符。在DOS版本2和更高的版本上,该功能从标准输入设备(STDIN)中读
取字符,因而支持重定向。
一旦某个字符准备就绪,就会返回它的ASCII值。如果该字符为扩展的
ASCII字符,那么就会返回零值,并且要求再次调用该功能以返回所按下的键
的扫描代码。附录A“ASCII字符集”中详细介绍了扩展ASCII码的情况。
该功能并不反馈字符给显示屏幕,这样便允许程序在必要的时候对该功
能实行控制。而使用直接的I/O功能(功能06h),该功能便可忽略Ctrl-C或
Ctrl-Break字符。若要求用Ctrl-C或Ctrl-Break来应付紧急情况,可使用功能
08h。
I/O
Int 21h 功能08h
STDIN输入
从标准输入设备(STDIN)中读取字符。
调用寄存器: AH 08h
返回寄存器: AL 8位的输入数据
注释:像许多其他的DOS输入功能一样,该功能处理输入。与该功能最接近
的是功能07h,不同的是该功能支持Ctrl-C或Ctrl-Break截获。
在DOS版本1的系统上该功能只能从键盘中读取字符,如果字符尚未准
备好,该功能会一直等到出现准备就绪的字符。在DOS版本2以及更高的版
480页
本上,该功能从标准输入设备(STDIN)中读取字符,并因此支持重定向。
一旦某个字符可用,系统就会返回该字符的ASCII值。如果该字符为扩
展的ASCII字符,则返回零值,并要求再次调用该功能以返回被按键的扫描
码。附录“ASCII字符集”中详细介绍了扩展ASCII代码的情况。
该功能不向显示屏幕反馈字符,这样便允许程序在必要时对该功能实行
控制。一旦检测出Ctrl-C或Ctrl-Break,Int 23h就会立即得到执行。
与所有实现Ctrl-C检查的DOS键盘输入功能一样,该功能也会因某个
Alt-键的输入组合而出现误导情况(即有些扫描码位图会被DOS错误地解
释,按Ctrl-Q、Ctrl-S或Ctrl-P时,会对应地解释为Alt-w、Alt-R和Alt-Q)。
I/O
Int 21h 功能09h
显示字符串
把字符串输出给标准输出设备(STDOUT)。
调用寄存器: AH 09h
DS:DX 指向由美元标志($,ASCII码24h)终止的字
符串的指针
返回寄存器:无
注释:在屏幕上显示字符串是一种非常普通的操作,如果一种功能不能用于
这一目的反倒令人感到奇怪。功能09h允许按照功能02h显示单个字符的方
式来进行连续字符输出的输出操作。所有从指定地址开始的字符都是要输出
的对象,直到遇上美元标志($,ASCII码24h)为止。
该功能处理的字符串与高级语言处理的字符串不一样;它们都必须以美
元标志作为终止字符。C函数用NUL字符来终止字符串,并且Pascal和BA-
SIC字符串用一长度字节(或字)来终止字符串。由于要采用CP/M时期沿用
下来的方式——即选择字符串的终止符,因而不能用该功能来输出美元符号。
这样便严重地约束了该功能在应用程序上的使用。要得到更理想的结果,通常
可使用一种其他的DOS输出功能来编写一道与高级语言要求相匹配的高效
字符串输出例程。
Microsoft建议用户不要再使用这种功能,除非需要用它来维护旧软件。
可随时终止对该功能的支持。应使用功能40h来代替该功能。
I/O
Int 21h 功能0Ah 版本1
带缓冲的STDIN输入
从标准输入设备(STDIN)中读取字符,并将它们置入用户指定的缓冲区中。
481页
调用寄存器: AH 0Ah
DS:DX 指向输入缓冲区的指针
字节 0 缓冲区能保存的字节数
字节1 读取的字节数
字节2- ? 返回的字节数
返回寄存器:无
注释:带缓冲区的STDIN输入是一种有用的且常常使用的功能,它能让你在
键盘处理方面最大限度地获取常规输入功能的功效。输入字符来自于STD-
IN,它缺省时即为键盘,并且往往将它安置在用户定义的缓冲区中。必须从调
用程序中指定的键输入缓冲区可设置如下:
字节偏移值 内容
0 要读取的最大字节数
1 读取的字节数
2- ? 键盘中实际输入的字节数
要使用这种功能,只需把允许输入的字节数据存在DS:DX指向的缓冲
区的第一个字节中。由于缓冲区的大小必须能留有终止回车(ASCII 0Dh)的
空间,因而最小的缓冲区大小不能小于1。
而在实际应用中,该功能可能不允许有任何虚拟键盘输入,因为单独为缓
冲区设置的1个字节要用于终止回车符,因而设置为1不是很有用。实际上,
最小的缓冲区大小应为2个字节(1个输入字节加上回车)。最大的缓冲区大
小为255个字节,这是一种逻辑上的大小,因为缓冲区长度标识符仅为一个单
字节。
该功能从键盘中读进字符,并将它们放置在缓冲区中,放置的起始位置为
缓冲区中的第3个字节。每一个ASCII字符都要求占用1个字节的缓冲空间。
当实际读进的字符数达到离缓冲区大小只差一个新键入的字符,并且在随后
的每次键击时都会发出报警声。当最后按下Enter键时,所获得并保存好的字
节数就被放置在该缓冲区的第2个字节中,并且将控制权返回给调用程序。
这种输入本身允许超前打印,并且所有键盘编辑命令都是活动的。 Ctrl-C
或Ctrl-Break功能也是活动的,其结果是导致Int 23h的执行。
这里要注意的是,字符串的大小通过长度字节中返回的值来确定。这一长
度中不包括终止回车符。
与所有实现ctrl-C检查的DOS键输入功能一样,某个Alt-键的输入组合
也能误导该功能(这些Alt-键返回的扫描代码,是由于DOS错误翻译造成的,
当用户按了ctrl-QCtrl-S或Ctrl-P时,所对应的键分别是Alt-W、Alt-R和
Alt-Q)。
Microsoft建议用户不要再使用这一功能,除非得用该功能来维持旧软
482页
件。可随时终止对该功能的支持。应使用功能3Fh来代替。
I/O
Int 21h 功能0Bh
检测STDIN状态
检测是否可从标准输入设备(STDIN)中获得字符。
调用寄存器: AH 0Bh
返回寄存器: AL FFh,可从STDIN中获取字符
00h,不能从STDIN中获取字符(版本4之前的
版本)
<>FFh,不能从STDIN中获取字符(版本4)
注释:该功能检测能否从STDIN中获得字符。由于常常把STDIN设置为键
盘输入,因而通常用该功能来确定一个按键是否正在键盘缓冲区中等待。
调用该功能时字符是否正在等待着被读取。如果字符可用,AL中包含的
值为FFh。注意,该功能并不返回实际字符,它仅仅只是指明该字符的可用性。
在调用成功时,该功能继续返回同样的状态,直到用一种DOS输入功能(01h、
06h、07h、08h或0Ah)来读出该字符。
I/O
Int 21h 功能0Ch
清除缓冲区和输入
清除标准输入设备(STDIN)缓冲区并接着执行指定的输入功能调用。
调用寄存器: AH 0Ch
AL 清除缓冲区要执行的功能号
01h,等待键盘输入
06h,直接控制台I/O操作
DL=FFh,直接控制台输入
DL<>FFh,要写给STDOUT的字符
07h,无回显的直接控制台输入
08h,无回显的控制台输入
返回寄存器:由该功能定义的返回:
01h,等待键盘输入
AL 来自STDIN中的字符
06h,直接控制台I/O操作
ZF 1 ,STDIN中无可用字符
ZF 0,AL=STDIN中的字符
483页
07h,无回显的直接控制台输入
AL STDIN中的字符
08h,无回显的控制台输入
AL STDIN中的字符
注释:程序员可用该功能来防止出现输入超前的错误,这类错误常常发生在
程序操作过程中。该功能可防止用户从偶然性的敲入过程扩展到关键程序输
入点。在这方面的吁个很好的例子就是格式化磁盘的程序。该程序要询问用
户,确认是否真的想格式磁盘,因为这种操作一旦开始就意味着破坏了磁盘。
通过使用这种功能,就能防止因偶然的敲入超前而导致的问题。
Microsoft目前已把子功能0AH列为保留功能,并且声称该功能不能使
用。
磁盘
Int 21h 功能0Dh
重置(reset)磁盘
将所有的磁盘缓冲区内容(如果已修改),写入相应的磁盘文件中
调用寄存器: AH 0Dh
返回寄存器:无
注释:该功能把磁盘缓冲区的内容写给各自对应的磁盘文件(清空磁盘缓冲
区)。该功能不更新磁盘目录,并且不能用它来代替文件关闭操作。该功能不
影响其它任何磁盘操作,也不清除其它任何磁盘参数。
在3Com网络上,一旦关闭了所有文件,该功能强制性地把网络卷文件分
配表(FAT)装入内存。
I/O
Int 21h 功能0Eh
选择磁盘
改变缺省的磁盘驱动器
调用寄存器: AH 0Eh
DL 驱动器号(A=0一直到Z=25)
返回寄存器: AL 逻辑驱动器号
注释:除了选择缺省驱动器,该功能还可用来确定与系统有关的逻辑驱动器
号。逻辑驱动器是一种块方式的设备,可以为RAM磁盘、硬盘、磁盘仿真器,
等等,它们统统都安装在系统上。
该功能总是返回最小为2的值,指示着当前存在有两个逻辑驱动器(DOS
一直把一个物理的软盘驱动器看作两个逻辑驱动器A和B)。如果想确定附
484页
加在系统上的物理软盘驱动器号,可使用BIOS功能11h。
从DOS版本3开始,该功能就返回上一次最后的驱动器值,这个值与逻
辑驱动器号或CONFIG.SYS文件中的LASTDRIVE值两者中较大的一个值
相等。如果只有三个逻辑驱动器,且CONFIG.SYS没有指定LASTDRIVE
值,那么该功能就会返回缺省的LASTDRIVE值,这个值等于5。
没有必要把返回值映射为驱动器字母。例如,返回值为5并不是表明就有
A、B、C、D和E这5个驱动器。
驱动器标志符的最大值依DOS版本的不同而不同,如下表所示:
DOS版本 可用的标志符
1 16(00-0Fh)
2 63(00-3Fh)
3 26(00-19h)
一旦要求与所有的DOS版本兼容,就必须限定应用程序中最多只能有
16个驱动器(这是DOS版本1允许的,最大数字)。那些需要与版本2和更高
版本相兼容的应用程序,应把驱动器的最大数目限定为26。在大多数情况下,
真正使用的驱动器数目要少得多。
注意该功能具有与众不同的特殊性;通过AL返回的值以1为基数,代表
附加在系统上的磁盘驱动器数目,但是,用于调用该功能的值却以零为基数。
并且代表着所期望的缺省磁盘驱动器。因此,若想把缺省驱动器设置为最后一
个逻辑驱动器,必须完成如下步骤:
1.确定当前缺省驱动器(用功能19h)
2.调用此功能把寄存器DL设置为步骤1中得到的当前缺省驱动器
3.把步骤2返回的值减去1(使其以0为基准)
4. 用步骤3得到的值来调用该功能。
磁盘
Int 21h 功能0Fh
打开文件(FCB)
搜索命名文件的当前目录;如果找到了命名文件,就会将其打开,并将文件控
制块(FCB)填充好
调用寄存器: AH 0Fh
DS:DX 指向未打开的FCB的指针
返回寄存器: AL 00h,已成功地打开了文件
FFh,未打开文件
注释:该功能用于打开当前正使用FCB的文件。该功能并不创建文件,创建
485页
文件操作由功能16h完成。第9章“目录和文件”中更为详细地介绍了各种文
件以及FCB。在填入驱动器、文件名以及FCB的扩展字段之后才能调用该功
能。
应留心正确的驱动器标志:0代表缺省驱动器、1代表A、2代表B,如此
等等。如果通过把驱动器字段设置为缺省驱动器(0)来调用该功能,那么系统
会自动地把该字段值变成正确的驱动器号,以便在随后对该文件的调用中,即
使改变缺省驱动器,驱动器号仍然保持正确。此外,该功能还把FCB块字段设
置成0;把记录大小设置为80h(128个字符的记录长度);并且在所要求文件
的目录表项中设置该文件的大小、日期和时间。如果文件操作要求使用不同的
块数或记录大小,那么必须在该功能完成之后,但在其他任何FCB文件操作
之前改变这些值。
对于在网络环境下进行应用程序操作而言,重要的是要记住该功能会在
兼容模式中自动地打开文件。如果要求不同时模式,就必须使用句柄操作。如
果在不同的模式中创建出了某个文件,并随即在兼容模式中将其打开(也是使
用同一功能),那么就会产生一种DOS关键错误,并导致系统执行Int 24h。
如果出现其他的FCB文件操作,系统就会通过AL寄存器返回状态代码
以指明出错。如果AL为0,表示未检测到错误;若AL为FFh,则表明在此操
作期间出现了错误。
Microsoft建议用户不要再使用这种功能,除非得用它来维持旧软件。可
随意中止对该功能的调用。应使用功能3Dh来代替。
磁盘
Int 21h 功能10h 版本1
关闭文件(FCB)
关闭以前打开的且使用文件控制块(FCB)的文件
调用寄存器: AH 10h
DS:DX 指向已打开的FCB的指针
返回寄存器: AL 00h,已成功地关闭文件
FFh,未关闭文件
注释:该功能用于关闭以前打开的,且使用FCB的磁盘文件。在FCB文件
中,关闭功能对于正确的操作来说是必需的,因为不存在其他的方法可强迫
DOS更新文件的目录项。如果不能恰到好处地关闭文件,就会丢失数据。第9
章,“目录和文件”中介绍了文件,并详细说明了FCB。
为了使用该功能,必须在适当的FCB字段中给出文件名、扩展名以及驱
动器标志符。从DOS版本2开始,就在文件名标志中把问号(?)作为通配符来
支持。只在DOS版本3和更高的版本中,才允许把星号(*)也作为通配符来
支持。
486页
要想用指定的属性来搜索文件,则必须使用扩展的FCB(参见第9章)。有
效的属性是从各种各样的属性位设置中演变而来的,现归纳如下:
值 相匹配的文件类型
00h 普通文件
02h 普通文件和隐藏文件
04h 普通文件和系统文件
06h 普通、隐藏以及系统文件
08h 卷标
16h 目录
当该功能成功地实现时,磁盘传送区(DTA)会为已找到的文件保存一个
未打开的FCB。如果调用搜索功能以搜索扩展的FCB,则DTA就会有一个扩
展的FCB,否则它只拥有常规的FCB。有关DTA的更详细情况可参见第9章
和功能1Ah。
一旦出现其他的FCB文件操作,AL寄存器所返回的状态值就会指出一
个错误。如果AL的值为0,表明未检测到错误,如果AL值为FFh,表明该操
作期间出现了错误。版本3和更高的版本中,可用Get Extended Error(功能
59h)来确定具体报告出来的是什么错误。
如果用通配符来搜索文件,并且该功能没有返回错误,则此时就可用功能
12h来继续搜索下一个匹配文件。
Microsoft建议用户不要再使用这种功能,除非得用它来维持旧软件。可
随时终止对该功能的支持。应使用功能4Eh来代替该功能。
磁盘
Int 21h 功能12h 版本1
搜索下一项
在当前目录中搜索下一个匹配项
调用寄存器: AH 12h
DS:DX 指向由功能11h或12h返回的FCB的指针
返回寄存器: AL 00h,找到匹配项
FFh,未找到匹配项
注释:该功能(接着功能11h继续搜索)可根据实际需要调用若干次,以便在
目录中定位给定的文件标志;但是,它只搜索下一个匹配项,而不搜索第1匹
配。更多的信息可参见功能11h。
可以清楚地看出,仅仅当被搜索的目录项使用通配符时,该功能才能以值
的形式出现。DS:DX所指向的文件控制块(FCB)应与调用功能11h时它所
487页
指的FCB是相同的。更多的信息依然可在功能11h中找到。
当该功能成功地完成时,磁盘传送区(DTA)会为找到的文件保存一个打
开的FCB。如果搜索最初是从扩展FCB开始的,DTA就会拥有扩展FCB;否
则,它只拥有常规的FCB。关于DTA的详细情况可参见第9章“目录和文件”
以及功能1Ah。
一旦出现其它的FCB文件操作寄存器,AL中返回的状态代码便会指示
出错误。如果AL为0,表明该操作期间未曾出错;如果AL为FFh,表明该操
作期间出现了错误。在版本3以及更高的版本中,可用Get Extended Error(功
能59h)来确定所报告出的具体是哪一种错误。
如果用通配符来搜索文件,且该功能未返回任何错误,那么此时就可以继
续使用该功能来搜索下一个匹配文件。
Microsoft建议用户不要再使用这种功能,除非得用它来维持旧软件。可
随时终止对该功能的调用。应使用功能4Fh来代替该功能。
磁盘
Int 21h 功能13h
删除文件(FCB)
删除所有允许与所提供的文件标志匹配的目录项
调用寄存器: AH 13h
DS:DX 指向未打开的FCB的指针
返回寄存器: AL 00h,文件已删除
FFh,文件未删除
注释:该功能可通过文件控制块(FCB)删除文件。第9章“目录和文件”中更
详细地介绍了文件和解释了FCB的情况。只能删除常规文件。使用该功能不
能够删除只读文件、系统文件、隐藏文件、卷标和目录。
要想使用该功能,必须在合适的FCB字段中给出文件名、扩展名以及驱
动器标志符。从DOS版本2.1开始,在文件名标志中把问号(?)作为通配符而
进行支持。只在DOS版本3以及更高的版本中,才允许把星号(*)也作为通
配符。
通过该功能删除的文件并未从磁盘中得到清除。可修改目录项以指明文
件已被删除,并且该目录项仍然可用。以前由该文件使用的数据簇现在也变得
可供其他文件使用。保存在原文件中的数据依然原封未动,并且还可以用特殊
的文件恢复程序,如Norton Utilities、Mace Utilities或PC Tools将其复原。
一旦出现其他FCB文件操作,AL寄存器中返回的状态代码便会指示出
错误。若AL为0,说明未检测出错误;若AL为FFh,则表明在该操作期间产
生了某种错误。出错的原因可能有如下两种:即试图删除,一种不合法的文件或
者未找到指定的文件名。在版本3以及更高的版本中,可用Get Extended Er-
488页
ror(获取扩展错误,功能59h)来确定所报告的究竟是什么错误。
不可删除已打开的文件。这样做的结果是在试图关闭文件或在程序终止
过程中当DOS试图清除该删除文件的磁盘缓冲区时,往往导致出错。在删除
文件之前必须关闭要删除的文件。
在网络环境中,必须拥有对删除文件的创建权。
Microsoft建议用户不要再使用这种功能,除非得用它来维持旧软件。可
随时终止对该功能的支持。应使用功能41h来代替该功能。
磁盘
Int 21h 功能14h 版本1
读取顺序文件(FCB)
从文件指针的当前位置开始,读出下一个数据块并更新该文件指针
调用寄存器: AH 14h
DS:DX 指向一个打开的FCB的指针
返回寄存器: AL 00h,读操作成功
01h,无读操作发生,已经到达EOF
02h,已取消读操作,DTA边界出错
03h,部分读,当前正位于EOF
注释:该功能可顺利地从使用文件控制块(FCB)的磁盘文件中顺序地读出信
息。也可以只从先前已打开(通过功能0Fh)的文件中读取信息,第9章“目录
和文件”中详细地介绍了文件和FCB的情况。
要想使用该功能,必须确保DS:DX指向成功地打开文件参数控制。读
取的长度在记录大小字段中给出。同时位置由当前块数和当前记录数共同指
定。在调用该功能之前,可把FCB字段的值改变成对应用程序合适的值。
当读操作完成时,从磁盘中读出的信息会被自动地保存在磁盘传送区
(DTA)中,并自动地在FCB中加上记录地址。关于DTA的更详细情况参见
第9章和功能1Ah。
由于从磁盘中读出的信息被保存在DTA中,因此要确保DTA有足够的
空间可接收这些信息。否则,从磁盘中读出的信息就有可能覆盖其它数据。
一旦出现其他的FCB文件操作,通过AL寄存器返回的状态代码便会指
出某种错误。 AL若为0,表明检测的结果未发现任何错误;任何其他的值都表
明在此操作期间出现了某种错误。如果该功能读取的数据量导致超出了DTA
中内存段的边界(以000为结尾的内存地址),这种错误用AL=2来表示。也
可读出部分记录(AL=3),并以0来填补余下部分。在版本3以及更高的版本
中,可用Get Extended Error(获取扩展错误,功能59h)来确定所报告的究竟
是什么错误。
在网络环境中,必须拥有读出权以便能使用此功能。
489页
Microsoft建议用户不要再使用这种功能,除非得用它来维持旧软件。可
随时终止对该功能的支持。应使用功能3Fh来代替。
磁盘
Int 21h 功能15h 版本1
写顺序文件(FCB)
把记录写给当前块并从文件控制块(FCB)中写出记录位置。
调用寄存器: AH 15h
DS:DX 指向一个打开的FCB的指针
返回寄存器: AL 00h,写操作成功
01h,未进行写操作,磁盘已满或为只读文件
02h,已取消写操作,DTA边界出错
注释:该功能能够按顺序地把数据写给使用FCB的磁盘文件。可以只把数据
写给先前打开(功能0Fh)的文件或创建(功能16h)的文件。第9章,“目录和
文件”,详细地介绍了文件和FCB的情况。
要想使用该功能,必须确保DS:DX指向在成功地打开或创建了文件之
后所创建的FCB。设置FCB中的参数控制着顺序写。写出的长度通过记录大
小的字段指定。并且,位置由当前块数和当前记录数共同设定。在调用该功能
之前,可把FCB字段的值变为对应用程序合适的值。
由于写给磁盘的信息来自于磁盘传送区(DTA),因此要留心所写的记录
大小应与想要的数据量相等。否则,一不留心就会把其它数据(无用的垃圾)写
入磁盘文件。关于DTA的更详细情况可参见第9章和功能1Ah。
如果所写的数据总量不能填满整个DOS磁盘缓冲区(在DOS内部),那
就只把该数据加进已经存在于磁盘缓冲区内的数据,并且不能确定是否有必
要将数据写入磁盘。当DOS成功地完成了该功能时,系统就会自动地更新
FCB中的记录地址。
一旦出现其他FCB文件操作,通过AL寄存器中返回的状态代码便会指
示出某种错误。若AL为0,表明未出错;若AL为其它所有的值都表明在该过
程中发生了某种错误。若磁盘已满或想写入一个只读文件,AL的值就为1。在
写操作期间,如果超过了在DTA的内存段边界(以000为结尾的内存地址),
那么该功能失败并返回AL=2。
在网络环境中,要使用该功能就必须拥有写出权限。
Microsoft建议用户不要再使用这种功能,除非得用它来维持旧软件。可
随时终止对该功能的支持。应使用功能40h来代替该功能。
磁盘
Int 21h 功能16h 版本1
创建文件(FCB)
490页
在文件控制块中,根据提供的信息创建出磁盘文件
调用寄存器: AH 16h
DS:DX 指向一个未打开的FCB的指针
返回寄存器: AL 00h,已创建文件
FFh,未创建文件
注释:该功能可用作打开文件(功能0Fh)的工具。它可创建出指定的文件,并
让该文件处于打开状态以供FCB随后使用。第9章“目录和文件”详细地介绍
了文件和FCB的情况。
为什么不自始至终地使用该功能呢?因为文件创建操作也有可能截短已
经存在的文件,而且不发出警告!首先,该功能搜索当前目录以寻找指定的文
件。如果找到指定文件,该功能就会将其截断并更新FCB;文件是打开的,就
好像是新创建的文件。如果指定的文件不存在,该功能就会创建出这种文件,
并且设置FCB以访问这一新文件。
要使用这种功能,必须提供保存着FCB的驱动器、文件名和扩展名的字
段。在使用扩展FCB的同时,还可指定一种属性以创建隐藏文件或卷标。有关
文件属性的信息可参见第9章。
一旦出现其他FCB文件操作,通过AL寄存器中返回的状态代码便会指
示出错误。若AL为0,表明未检测出错误;若AL为FFh,则表明在该操作期
间产生了某种错误。在版本3以及更高的版本中,可用Get Extended Error(获
取扩展错误,功能59h)来确定所报告的究竟是什么错误。
在网络环境中,必须拥有读出权以便能使用此功能。
Microsoft建议用户不要再使用这种功能,除非得用它来维持旧软件。对
该功能的支持可能会随时终止。应使用功能3Ch来代替该功能。
磁盘
Int 21h 功能17h 版本1
重新命令名文件(FCB)
重新命名现有的文件
调用寄存器: AH 17h
DS:DX 指向修改的FCB的指针
返回寄存器: AL 00h,已重新命名文件
FFh,未重新命名文件
注释:该功能允许用户通过使用修改的文件控制块(FCB)来改变现有磁盘文
件的名称。只能为常规文件重新命名;因而,通过这种功能不能够改变只读文
491页
件、系统文件、隐藏文件、卷标或目录的名称。
该功能采用如下格式来使用已修改的FCB:
偏移值 含 义
00h 驱动器标志
01h 初始文件名
09h 初始文件扩展名
11h 新的文件名
19h 新的文件扩展名
注意,在这里只有三条信息是必须要有的,即:驱动器标志符(所有重新命
名行为都必须发生在同一驱动器上)、新和旧两种文件名。从DOS版本2.1开
始,该功能把文件名标志中出现的问号(?)作为通配符来支持。仅仅在DOS版
本3和更高的版本中才允许把星号(*)作为通配符,把通配符置入初始文件
名将导致该功能试图为每一个与现有模式匹配的文件重新命名。而把通配符
放新文件则会令这些字符位置在新文件中保持不变。
由于在每个指定目录中文件名都必须是独一无二的,因此,当请求该功能
把某个文件重新命名为一个已经存在的名字,它就会停下来并返回一种错误。
通过有效地使用通配符匹配方法,就能够建成一种复杂的能对多个文件重命
名程序。假定现在有一系列文件,其名字分别为ABC01.DAT、ABC02.DAT、
ABC03.DAT等等。并且想将它们的扩展名重新命名为.OLD。此时,如果选择
初始化文件名为ABC??.DAT,并且新文件名为*. OLD的话,那么这一重命
名进程就会容易得多。
一旦出现其他FCB文件操作,通过AL寄存器返回的状态代码便会指示
出错误。若AL为0,表明未检测出任何错误;若AL为FFh,则表明在该操作
期间产生了错误。在版本3以及更高的版本中,可用Get Extended Error(获取
扩展错误,功能59h)来确定所报告的究竟是什么错误。
在网络环境中,必须拥有创建权以便能使用这种功能。
Microsoft建议用户不要再使用这种功能,除非得用它来维持旧软件。可
随时终止对该功能的支持。应使用功能56h来代替该功能。
磁盘
Int 21h 功能19h 版本1
获取缺省驱动器
返回当前缺省的驱动器号
调用寄存器: AH 19h
492页
返回寄存器: AL 当前驱动器号(A=0至Z=25)
注释:该功能用于确定DOS正当作缺省驱动器来使用的是哪一个磁盘驱动
器。若通过AL寄存器返回的驱动器号为A,则表明当前驱动器为缺省驱动
器。驱动器号以0为基准,其中0代表驱动器A,1代表驱动器B,以此类推。这
与其他功能略有不同,其他功能有可能用为来指定缺省驱动器。该功能与功能
0Eh有关,因为功能0Eh可用于设置缺省驱动器。
磁盘
Int 21h 功能1Ah 版本1
设置DTA地址
建立起DOS用作磁盘传送区(DTA)起始部分的地址
调用寄存器: AH 1Ah
DS:DX 指向新DTA的指针
返回寄存器:无
注释:可用该功能来指定供DOS用于磁盘操作的DTA。DTA可供许多DOS
功能使用,最为常见的是由文件控制块(FCB)文件功能来使用。用于搜索的句
柄功能(功能(4Eh和4Fh)以及Int25h和Int26h也经常使用DTA。启动程
序之后,该功能便把128个字节的缺省DTA搁置在程序段前缀(psp)中、偏
移值为80h处。与这种功能作用相反的是功能2Fh,其作用是获取当前DTA
地址。程序员的职责是负责监视用于磁盘操作的DTA能否足以承担起所负
担的任务。由于DOS只监视DTA的起始地址,因此在磁盘操作过程中,系统
无法知道它是否已到达DTA的终点。这样的话,如果传送的数据量超过了
DTA的承受能力,那么从磁盘中传送出的数据就会轻而易举地改写程序数据
和代码。
磁盘
Int 21h 功能 1Bh 版本1
获取分配表信息
获取在缺省驱动器条件下用于磁盘的磁盘分配信息
调用寄存器: AH 1Bh
返回寄存器: AL 每簇的扇区数
CX 每物理扇区的字节数
DX 每磁盘的簇数
DS:BX 指向媒体描述符字节的指针
493页
注释:该功能返回缺省驱动器中磁盘容量的有关信息。这种信息很少用到了
CX*AL*DX(代表按字节计算的磁盘总容量)那么大的容量。功能1Ch返回
的信息与用于指定驱动器中的磁盘的信息是相同的,并且可用功能36h来确
定磁盘上的自由空间量。
从DOS版本2开始,DS:BX指向保存在文件分配表(FAT)中的介质描
述符字节,但是,在DOS版本1上,DS:BX所指的是保存在内存中的FAT。
介质描述符(或FAT ID)字节可用来标识介质的格式化信息。详见下表:
值 含 义
F0h 不能标识的磁盘
F8h 固定磁盘
F9h 双面磁盘,每磁盘15个扇区(共1.2M)
F9h 双面、每磁道(720K)9个扇区
FCh 每磁道9个扇区
FDh 每磁道(360K)9个扇区
FEh 每磁道8个扇区
FFh 每磁道8个扇区
注意:F9h FAT ID字节仅仅只能说明磁盘是在大容量的磁盘驱动器中
进行格式化的,因此还必须检验该功能所返回的其他信息以确定磁盘的实际
容量。更进一步讲,并不是所有的DOS版本都采用统一的方式来支持FAT
ID。标准是由用于DOS的IBM版本的技术参考手册制订的,但是这一标准并
不一定适用于个别生产三家的DOS版本。
Microsoft建议用户不要再使用这种功能,除非得用它来维持旧软件。可
随时终止对该功能的支持。应使用功能36h来代替该功能。
磁盘
Int 21h 功能1Ch 版本1
获取指定驱动器的分配表信息
获取指定驱动器中磁盘分配有关的基本信息
调用寄存器: AH 1Ch
DL 驱动器号(当前驱动器=0,A=1至Z=26)
返回寄存器: AL 每簇的扇区数
CX 每物理扇区的字节数
DX 每磁盘的簇数
DS:BX 指向媒体描述符字节的指针
494页
注释:该功能返回指定驱动器中磁盘容量的有关信息。这种信息是与用于缺
省驱动器的功能1Bh所返回的信息相同。详细情况可参见对功能1Bh的注释
部分。
Microsoft建议用户不要再使用这种功能,除非得用它来维持旧软件。可
随时终止对该功能的支持。应使用功能36h来代替该功能。
磁盘
Int 21h 功能1Fh 版本1
获取缺省磁盘参数块
返回缺省驱动器的磁盘参数地址
调用寄存器: AH 1Fh
返回寄存器: AL 00h,未出错
FFh,已出错
DS:BX 驱动器参数块的地址
注释:该功能可通过DS:BX返回磁盘参数块(DPB)的地址,DOS就是用这
一磁盘参数块来确定缺省驱动器中关于磁盘的特定结构信息的。DPB的结构
如表16.3所示。
表16.3 DPB的结构
偏移值 字段长度 含 义
对所有的版本
00h Byte 驱动器号(0=A,1=B,等等)
01h Byte 设备驱动器单元号
02h Word 每扇区字节数
04h Byte 每簇的扇区数(以0为基数)
05h Byte 移位因子
06h Word 保存着FAT的第一个扇区
08h Byte FAT数目
09h Word 根目录项数
0Bh Word 第一个数据扇区号
0Dh Word 最大的簇号减去1
仅适用于版本2或版本3
0Fh Byte 每个FAT的扇区数(0-255)
10h Word 根目录的起始扇区号
12h Double Word 驱动器的设备驱动程序地址
16h Byte 描述符字节
495页
偏移值 字段长度 含 义
17h Byte 磁盘参数块访问标志(0FFh则表明
需要重新建立)
18h Double Word 下一个设备参数块的地址
仅适用于版本2
1Ch Word 当前目录的开始簇号
1Eh 64 bytes 当前目录路径的ASCIIZ串
仅适用于版本3
1Ch Word 从驱动器中分配下来的最后一个簇号
1Eh Word 用途未知;通常为FFFFh
版本4
0Fh Word 每个FAT的扇区数(0-65535)
11h Word 根目录的起始扇区号
13h Double word 驱动器的设备驱动程序地址
17h Byte 介质描述字节
18h Byte 磁盘参数块访问标志(0FFh表明需要重建)
19h Double word 下一个设备参数块的地址
1Dh Word 从驱动器中分配出来的最后一个簇号
1Fh Word 用途未知;通常为FFFFh
版本5
0Fh Word 每个FAT的扇区数(0-65535)
11h Word 根目录的起始扇区号
13h Double word 驱动器的设备驱动程序地址
17h Byte 介质描述符字节
18h Byte 磁盘参数块访问标志(0FFh表明需要重建)
19h Double word 下一个设备参数块的地址
1Dh Word 从驱动器中分配出来的最后一个簇号
1Fh Word 自由簇数
注意不同的DOS版本中DPB结构是各不相同的。表中每一项的用途都附
带有各自的说明,必须清楚地掌握自自不同的用途。
由于该功能通过DS寄存器给出返回值,因此,在调用这一功能之
前,必须保存DS的值。
磁盘
Int 21h 功能21h 版本1
随机读取文件(FCB)
从磁盘文件中读出FCB的当前块和当前记录字段指定的记录,并将信息保存
在磁盘传送区(DTA)中。
调用寄存器: AH 21h
496页
DS:DX 指向打开FCB的指针
返回寄存器: AL
00h,读操作成功
01h,无读操作发生,遇上了EOF
02h,已取消读操作,DTA边界出错
03h,读取部分记录,遇上了EOF
注释:该功能可通过文件控制块(FCB)从磁盘文件中随机地(不按顺序地)读
取信息。第9章“目录和文件”中详细地介绍了文件和FCB的有关信息。也可
以只从先前已打开(功能0Fh)的文件中读出信息。
要使用这种功能,必须确保让DS:DX指向成功地打开文件之后所创建
的FCB。随机读操作由设置在FCB中的参数控制。可通过设置随机记录字段
而在FCB中指定要读取的记录,并且可通过记录大小字段来控制数据量。在
调用该功能之前,可以把这些FCB字段的值换成对应用程序合适的值。DOS
利用这两种值便能计算出读操作开始的文件位置。
当完成这一功能时,从磁盘中读出的信息便被保存在DTA中。关于DTA
的更详细信息可参见第9章“目录和文件”以及功能1Ah。通过该功能不能更
新FCB的当前位置字段,因为它具有顺序功能。除非改变随机记录字段,否则
随后访问文件时会返回同样的结果。
由于从磁盘中读出的信息被保存在DTA中,因而必须保证DTA应有足
够大的容量以接收数据。否则,从磁盘读出的信息就有可能重写其数据。
一旦出现其他的FCB文件操作,通过AL寄存器返回的状态代码就会指
示出错。如果AL的值为0,表明未检测出任何错误;其他任何值都表明此操
作期间出现了某种错误。如果该功能读取的数据量导致超出了DTA中内存
段的边界(以000为结尾的内存地址),那么该功能就会失败并返回AL=2。
也可以读取部分记录(AL=3),并以0字符补齐余下的部分直到结尾。
在网络环境中,必须拥有读出权才能使用此功能。
Microsoft建议用户不要再使用这种功能,除非得用它来维持旧软件。可
能会随时终止对该功能的支持。应使用功能3Fh来代替该功能。
磁盘
Int 21h 功能22h 版本1
随机的文件写(FCB)
把FCB的当前块和当前记录字段指定的记录写给磁盘,并从磁盘传送区
(DTA)中把信息传送出来。
调用寄存器: AH 22h
DS:DX 指向打开FCB的指针
返回寄存器: AL
497页
00h,写操作成功
01h,未进行写操作,磁盘已满或为只读文件
02h,取消了写操作,DTA边界出错
注释:该功能可随机地(不按顺序)把信息写给使用文件控制块(FCB)的磁盘
文件。也可以只把信息写给先前已打开的(功能0Fh)或已创建的(功能16h)
文件。第9章“目录和文件”中详细地介绍了文件和FCB的有关情况。
要使用这种功能,就应保证DS:DX指向一个在成功地打开或创建了文件之
后而创建的FCB。可在FCB中设置参数来控制随机写。可通过设置随机记录
字段而在FCB中指定要写出的记录,同时,还可通过记录大小字段来控制数
据量。在调用该功能之前,可以把这些FCB字段的值换成对应用程序合适的
值。 DOS利用这些值来计算出写操作将开始进行的文件位置。
由于要写给磁盘的信息来自于DTA,因此,必须保证所定的记录大小要
与你想要的数据量相符合。否则,无意之中就会把其他数据(无用信息)写给磁
盘文件。关于DTA的详细介绍可参见第9章和功能1Ah。
如果所写给的数据不能填满整个DOS磁盘缓冲区(指DOS内部的),那
么,系统会把它与已经存在于该磁盘缓冲区中的数据加在一起,直到需要时将
其写入磁盘。
与顺序功能不一样,该功能不更新FCB的当前位置字段。因此,如果不改
变随机记录字段,那么随后发生对该文件的随机写操作会把信息传送给同一
文件记录。
一旦出现其他的FCB文件操作,通过AL寄存器返回的状态代码就会指
示出错。如果AL的值为0,表明未检测出任何错误;其他任何值都表明此操
作期间出现了某种错误。如果磁盘已满,或者想把信息写给只读文件,那么返
回的AL值等于1。而在写操作过程中,如果超出了DTA中的内存段边界(以
000为终点的内存地址),那么该功能会失败并返回AL=2。
在网络环境中,必须拥有读出权才能使用此功能。
Microsoft建议用户不要再使用这种功能,除非得用它来维持旧软件。可
能会随时终止对该功能的支持。应使用功能40h来代替该功能。
磁盘
Int 21h 功能23h 版本1
获取文件大小(FCB)
搜索目录以找出匹配的文件名;如果文件名找到了,就把大小信息填入指定的
文件控制块(FCB)。
调用寄存器: AH 23h
DS:DX 指向未打开的FCB的指针
返回寄存器: AL
498页
00h,已找到匹配文件
FFh,未找到匹配文件
注释:通过使用FCB,便可用该功能来确定某个指定文件中的记录数目。第9
章“目录和文件”中已详细地介绍了文件和FCB的详细情况,这里就不再复
述。但要注意,在使用该功能时,文件必须是未打开的。
可以在填入驱动器、文件名、扩展名和FCB的记录大小字段之后再使用
这一功能。合格的文件名必须是完整的、也是唯一的;其中不允许出现通配符。
要找出按字节计算的文件大小,只需把记录大小字段设置为1。
如果已确定某个文件与指定的文件名相匹配,那么DS:DX指向FCB的
随机记录字段就会被更新,以便指示出该文件中拥有的记录数。这一数字是通
过将文件大小(按字节计)除去记录大小来确定的,所得的结果即为记录数。如
果这一除法剩有余数,那么在计算记录数目时只入不舍。如果在调用该功能之
前忘记了设置记录大小字段,或者对文件而言,目录项的文件大小部分可能不
正确或被舍入以反映出完整的扇区,那么该功能返回的信息就有可能是一个
不可靠的值。
一旦出现其他FCB文件操作,通过AL寄存器中返回的状态代码便会指
示出错。若AL为0,说明未出错(未检测到错误);若AL为FFh,则表明在该
操作期间产生了某种错误。(通常情况下,这个值意味未找到指定的文件)。
Microsoft建议用户不要再使用这种功能,除非得用它来维持旧软件。可
随时终止对该功能的支持,应使用功能42h来代替该功能。
磁盘
Int 21h 功能24h 版本1
设置随机记录字段(FCB)
当从顺序文件I/O切换到随机文件I/O时,可在当前文件位置上设置文件控
制块(FCB)的随机记录字段。
调用寄存器: AH 24h
DS:DX 指向打开FCB的指针
返回寄存器:无
注释:该功能修改打开的FCB以做好供随机访问功能使用的准备。可在填入
FCB的记录大小、记录数和块数字段之后再使用该功能。该功能的作用是在
字段值的基础上修改随机记录字段。第9章“目录和文件”已详细地介绍了文
件和FCB的情况,这里就不再复述。
Microsoft建议用户不要再使用这种功能,除非得用它来维持旧软件。可
随时终止对该功能的支持。应使用功能42h来代替该功能。
499页
系统
Int 21h 功能25h 版本1
设置中断向量
安全地修改中断向量,以使其指向某个指向的中断处理程序。
调用寄存器: AH 25h
AL 中断号
DS:DX 指向中断处理程序的指针
返回寄存器:无
注释:该功能可以使在其他情况下可能延缓的操作得以快速进行,即改变中
断向量。由于中断向量被保存在低端内存中的一个表内(参见第11章“中断处
理程序”),因此,可以很容易地直接改变它们。但是,如果在改变过程中,尤其
是当只有部分中断地址被传送给这个表时出现了中断,那么这一过程是十分
危险的。
与写入自己的代码以安全地管理中断设备操作不一样,用户可以直接使
用这种功能,以安全地把中断向量表更改到用户提供的某个地址上。这是用于
改变中断向量方面唯一得到验证的方法。
改变中断向量也会导致一些特殊的问题。当程序按常规方式终止时,中断
22h、23h和24h会自动地复位为各自的初始值(参见Int 20h、Int 27h和功能
00h、31h和4Ch)。如果程序修改了其他任何中断向量,那么这些向量就会停
留在它们的改变值上,甚至在程序终止后亦不会复原。这样往往会引起一些问
题;例如在程序终止后出现了中断情况会导致中断跳转到一个不存在的中断
处理例程上。
为了防止出现这类情况,改变中断向量的程序应首先使用功能35h,以获
取初始向量值并将其保存起来。这样在程序终止后,初始向量值便用于改变中
断向量。把向量改变为除22h、23h或24h以外的中断的程序,还必须有能力捕
获可能终止程序的各种非常规途径,这些途径包括Ctrl-C或Ctrl-Break中断
服务,DOS关键出错服务以及各种有可能导致程序终止的潜在中断、如被零
除中断。
如果程序不能截取可能终止它的任何方法或所有方法,其结果是中断向
量仍然保持挂起。如果程序冲毁了且不能将中断向量复位,那么唯一安全的途
径是在进行别的操作之前将系统复位。
系统
Int 21h 功能26h 版本1
创建PSP
从当前正执行的程序中把程序段前缀(PSP)复制给指定的段地址,然后将其
500页
更新,以供新的程序使用
调用寄存器: AH 26h
DX 新PSP的段地址
返回寄存器:无
注释:该功能创建出PSP,并作好运行另一道程序的准备。在指定的内存段地
址处,当前程序的PSP被复制。有关PSP的情况已在第3章“动态的DOS”中
作了介绍。
从理论上讲,把COM文件复制到新PSP之后的内存空间里并执行程序,
这是有可能的,但这可能算不上是什么好办法,原因很简单,即该功能已经过
时,在版本2和以后的版本中,它已被更为复杂且更易于使用的EXEC功能
(功能4Bh)所取代。Microsoft和IBM公开地建议用户在创建程序时应使用
EXEC功能而不要使用功能26h。EXEC在处理程序的装载和执行方面具有更
优的性能,并且能防止程序在操作过程中出现潜在的错误。该功能不装载和执
行其它的程序;它只为一种程序准备PSP。调用某个程序的功能必须仍然装载
和执行同一程序。
如果程序改变了用于Int 22h、23h和24h的中断向量,那么新的向量就会
被复制到新创建的PSP中。此外,该功能还能适当地更新内存分配信息。
Microsoft建议用户不要再使用这种功能,除非得用它来维持旧软件。可
随时终止对该功能的支持。应使用功能4Bh, 子功能00h来代替该功能。
磁盘
Int 21h 功能27h 版本1
随机块读取(FCB)
从磁盘文件中把一个或多个连续随机记录读给磁盘传送区(DTA)。
调用寄存器: AH 27h
CX 要读取的记录数
DS:DX 指向已打开的FCB的指针
返回寄存器: AL
00h,成功地读完全部记录
01h,无读操作,遇到了EOF
02h,已取消读操作,DTA边界出错
03h,读取了部分记录,遇到了EOF
CX 读取的记录数
注释:该功能可用文件控制块(FCB)从磁盘文件中读取一组连续的随机记
录。也可以只从先前打开(功能0Fh)的文件中读取信息。第9章“目录和文
件”中已详细地介绍了文件以及FCB的情况。
501页
要使用这种功能,必须确保在CX中出现所希望的记录数,并且DS:DX
必须指向成功地打开文件后而创建的FCB。设置在此FCB中的参数可控制随
机读取。而要读取的起始记录通过在FCB中设置随机记录字段来指定,并且
每一个记录的大小可通过记录大小字段来控制。在调用该功能之前,可以改变
这些FCB字段值,以便这些值符合应用程序的要求。有了这些值,DOS便可
计算出读操作开始的文件位置。
当该功能完成其任务时,信息就从DTA中的磁盘内读了出来。(关于
DTA的详细情况可参见第9章和功能1Ah)。当成功地实现了该功能时,FCB
的随机记录、当前块和当前记录等字段就全部得到更新。
由于从磁盘中读出的信息被保存在DTA中,因此DTA必须有足够的容
量以容纳这些信息块。否则,这些信息就会覆盖其他的数据或程序。
一旦出现了其他操作,通过AL寄存器返回的状态代码便会指示出错。如
果AL的值为0,表明未出错;如果AL为任何其他值,则表明在此操作期间出
现过某种错误。如果该功能读出的数据量太大,以致超出了DTA的内存段边
界(以000为终点内存地址),那么该功能就会失败,并返回AL=2也可以只
读取部分记录(AL=3),并以0字符补齐余下部分。
在网络环境中,必须拥有读出权以便能使用此功能。
Microsoft建议用户不要再使用这种功能,除非得用它来维持旧软件。可
随时终止对该功能的支持。应使用功能3Fh来代替该功能。
磁盘
Int 21h 功能28h 版本1
随机块写(FCB)
从磁盘传送区(DTA)中把一个或多个连续随机记录写入磁盘
调用寄存器: AH 28h
CX 要写的记录数
DS:DX 指向已打开的FCB的指针
返回寄存器: AL
00h,成功地写完了全部记录
01h,没有进行写操作,磁盘已满或为只读文件
02h,取消了写操作,DTA边界出错
CX 已写入的记录数
注释:该功能可通过使用文件控制块把一组连续的随机记录写入磁盘文件。
也可以只把信息写给已先打开(功能0Fh)的或新创建(功能16h)的文件。第9
章“目录和文件”已详细地介绍了文件和FCB的情况,对此有疑问的读者可参
看第9章。
502页
要使用这种功能,必须确保CX中保存的是要写入的记录数,并且DS:
DX应指向成功地打开或创建文件之后才创建的FCB。可在FCB中设置参数
来控制随机写,可通过在FCB中设置随机字段来指定要写入的起始记录,并
且可通过记录大小字段来控制每个记录的大小。在调用该功能之前,可把这
些FCB字段的值改变成对应用程序合适的值。DOS可使用这些值计算开始读
操作的文件位置。
由于要写入磁盘的信息来自DTA,因此必须保证所写的记录大小和记录
数据目与希望的数据量相当。否则,一不留神就会把其他数据(无用的信息)写
给磁盘文件。关于DTA的详细情况可参见第9章“目录和文件”以及功能
1Ah。
如果所写入的数据量没有填满DOS磁盘缓冲区(指DOS内部的),那么
就应加上该磁盘缓冲区原有的数据,然后再确定是否有必要将其写给磁盘。
一旦成功地实现了该功能,FCB的随机记录、当前块以及当前记录等字
段就会得到更新。
在操作过程中,如果出现了其他FCB文件操作,那么通过AL寄存器中
返回的状态代码便会指示出错。若AL为0,说明没有出错;若AL为非0值,
则表明在该操作期间产生了某种错误。其中AL=1表示磁盘已满或要写入的
文件为只读文件;AL=2表明在写操作过程中,超出了DTA的内存段边界
(以000为终点的内存地址),并且该功能已失败。
在网络环境中,必须拥有写入权限才能使用该功能。
Microsoft建议用户不要再使用这种功能,除非得用它来维持旧软件。可
随时终止对该功能的支持。应使用功能40h和42h来代替该功能。
磁盘
Int 21h 功能29h 版本1
分析文件名
把文件名字符串分析成文件控制块(FCB)以便于使用
调用寄存器: AH 29h
AL 分析控制标志(参见表16.4)
DS:SI 指向下一个字符串的指针
ES:DI 指向FCB的指针
返回寄存器: AL
00h,未找到通配符
01h,已找到通配符
FFh,驱动器标识符无效
DS:SI 指向紧跟在被分析的文件名之后的
第一个字符的指针
(这张内容超多!继续未完待续)