DOS程序员手册(九)

时间:2021-06-19 21:39:29
第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     指向紧跟在被分析的文件名之后的

第一个字符的指针

(这张内容超多!继续未完待续)