现在的位置: 首页 > 综合 > 正文

DOS程序员参考手册[16A]

2013年09月17日 ⁄ 综合 ⁄ 共 24988字 ⁄ 字号 评论关闭

470页
第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个扇区
    

抱歉!评论已关闭.