DOS程序员手册(十一)

560页

        版本5中新增加的子功能05h支持程序截获MS-DOS EXEC调用,并实

    现自我装载。该子功能能实现内存的修补,如设置装载程序能接收的版本号

    (通过SETVER设置的版本号)以及实现对装载程序在装载时的修补。

        在把控制权传送给装载程序之前,功能05h应是系统发出的最后一个调

    用。尤其是,在该功能成功地返回和把控制传送给装载程序的这段时间内,应

    用程序既不能发出MS-DOS或BIOS调用,也不能发出任何软件中断调用。

        如果DOS是在HMA中运行,那么从对子功能05h的调用中返回时,地

    址线A20应是关闭的。

系统

Int 21h           功能4Ch                                   版本2

                  带返回代码并终止程序

退出程序,令其回到它的父任务中去

调用寄存器: AH              4Ch

                AL          返回代码

返回寄存器:无

注释:在退出程序时,DOS执行如下任务:

      ·从PSP:000Ah中恢复终止处理程序向量

      ·从PSP:000Eh中恢复Ctrl-Break处理程序向量

      ·从PSP:0012h中恢复关键出错处理程序向量(DOS版本3以及更高

        的版本)

      ·清空文件缓冲区(句柄文件)

      ·传送到终止处理程序地址

      目前,该方法是公认的终止程序方法。在DOS版本2以及更高版本中的

程序都一直在使用这一功能以引用Int 20h或Int 21h功能00h。同早期的终

止功能相比,这种功能具有两大优点:

      ·它允许返回出口代码,这种代码可作为ERRORLEVEL参数出现在批

        处理文件中,而且有了这种代码,父进程就能通过功能4Dh来确定返

        回信息。

      ·它不依赖任何寄存器设置就能进行正确的操作,例如指向PSP所在段

        的CS寄存器。

      由于这种功能自动地关闭文件句柄以及更新磁盘目录,因而它能保证在

文件处理过程中不会出错,但是,该功能对文件控制块(FCB)文件却无任何帮

助。

561页

系统

Int 21h           功能4Dh                                 版本2

                  获取返回代码

从成功的EXEC功能调用中获取返回代码

调用寄存器: AH            4Dh

返回寄存器: AH           系统出口代码

                          00,正常终止

                          01,通过Ctrl-C终止

                          02,通过关键设备出错终止

                          03,通过调用功能31h来终止

              AL          子进程出口代码

注释:调用该功能时,它就能返回(一次并且仅有一次)出口代码,不过,是由

子进程通过系统返回的。该功能的作用是把被返回的代码复位为0;如果有必

要把它传送给父进程,那么就必须把它保存起来,并作为自身进程的出口代码

而将其返回。系统出口代码表明了程序的终止方式。子进程出口代码返回了

程序需要返回的一切内容;而且,其解释与所运行的程序有关。

磁盘

Int 21h           功能4Eh                                 版本2

                  搜索第一匹配项

给定一个ASCIIZ字符串(其中可包括通配符),该功能就能定位第一个与之

匹配的文件名。

调用寄存器: AH              4Eh

              CX            在搜索过程中要使用的属性

              DS:DX      指向ASCIIZ文件说明的指针

返回寄存器:进位标志清除表示成功

              进位标志置位表示出错

              AX            出错代码

                            02h,文件未找到

                            03h,无效路径

                            12h,没有更多的文件

注释:只要给出一个含有目的文件的完整文件名(还有可能包括* 和?这两个

通配符)的ASCIIZ字符串,该功能就会把有关返回文件的信息填充到磁盘传

送区(DTA)中。搜索过接受提供给该功能的属性限制。仅仅只有那些与指定

的属性相匹配的文件才会被找到。用于文件的文件属性可以包含下列值:

 

562页

        值            所匹配的文件类型

    00h           普通文件

    02h           普通文件和隐藏文件

    04h           普通文件和系统文件

    06h           普通文件、隐藏文件和系统文件

    08h           卷标

    10h           目录

      由于属性是一个字节,因此,可通过把CL设置为所期望的值,把CH置

为0来设置CX。当该功能返回时,DTA的设置如下表所示:

偏移值字节      字段长度        内    容

    00h        21字节     留给DOS用于随后的搜索

    15h       字节        匹配文件的属性

    16h       字          文件时间

    18h       字          文件日期

    1Ah       双字        文件大小

    1Eh        13个字节   文件名以及由ASCIIZ字符串组成的扩展名;文件名和

                          扩展名之间无空格,而且扩展名前面有一个句号

对时间和日期项的解释如下:

                  位设置

                                              含义

    FEDCBA98          76543210

              时间字段编码

    x x x x x . . . . . . . . . . .         小时(0-23)

    . . . . . x x x x x x . . . . .         分钟(0-59)

    . . . . . . . . . . . x x x x x         两秒增长数(0-29)

              日期字段编码

    x x x x x x x . . . . . . . . .         年-1980

    . . . . . . . x x x x . . . . .         月(1-12)

    . . . . . . . . . . . x x x x x         日(1-31)

        可以阅读DTA以获取已定位文件的有关信息,如果某个文件名中包括

    通配符,那么该信息最终会反映出有一个文件名与搜索字符串不相同。但是,

    为了保证随后搜索的顺利进行,必须将DTA恢复原状。

系统

Int 21h             功能4Fh                                   版本2

                    搜索下一个匹配

563页

在成功地调用了功能4Eh之后,该调用继续搜索与指定的准则相匹配的文

件。为此,必须先调用功能4Eh,使DTA保存的信息恢复原状。

调用寄存器: AH            4Fh

返回寄存器:进位标志清除表示成功

              进位标志置位表示出错

              AX          出错代码

                          12h,无更多的文件

注释:如果在第一匹配搜索(功能4Eh)中使用了通配符,那么再次调用功能

4Eh就能搜索到其他与通配符文件说明相匹配的文件。搜索失败(在该功能返

回时,进位标志置位)表明;没有其他文件与这一说明相匹配。

    通过“下一个匹配”功能的搜索继续使用与第一匹配相同的进程。该功能

更新DTA以表明文件的名字以及与搜索过程中定位的文件有关的数据。在

两次调用之间,必须修改DTA,以便实现成功的搜索。表16.16列出了该功能

返回时,DTA中数据的格式。

                          表16.16 DTA布局

偏移值字节      字段长度                内    容

    00h        21字节             留给DOS用于随后的搜索

    15h       字节                匹配文件的属性

    16h       字                  文件时间

    18h       字                  文件日期

    1Ah       双字                文件大小

    1Eh        l3个字节           文件名以及由ASCIIZ字符串组成的扩展

                                  名;文件名和扩展名之间无空格,而且扩展

                                  名前面有一个句号

对时间和日期项的解释如下:

                  位设置

                                                含义

    FEDCBA9876543210

              时间字段编码

    x x x x x . . . . . . . . . . .           小时(0-23)

    . . . . . x x x x x x . . . . .           分钟(0-59)

    . . . . . . . . . . . x x x x x           两秒增长数(0-29)

              日期字段编码

    x x x x x x x . . . . . . . . .           年-1980

    . . . . . . . x x x x . . . . .           月(1-12)

    . . . . . . . . . . . x x x x x           日(1-31)

564页

        可以阅读DTA以获取已定位文件的有关信息,如果某个文件名中包括

    通配符,那么该信息最终会反映出有一个文件名与搜索字符串不相同。但是,

    为了保证随后搜索的顺利进行,必须将DTA恢复原状。

系统

Int 21h             功能50h                               版本2

                    设置PSP段

设置当前执行进程的程序段前缀(PSP)的地址

调用寄存器: AH              50h

              BX            新PSP的段地址

返回寄存器:无

注释:在DOS系统上,功能50h允许终止并驻留(TSR)程序来实现TSR进

程和中断进程之间的关联切换。“关联切换”(Context Switching)包括使DOS

系统把TSR当作初级进程而不是中断进程。为了实现这个目的,则必须记录

初始的PSP地址(功能51h)并告诉DOS:TSR的PSP是当前的PSP(功能

50h)。当打算返回到中断程序时,它把PSP返回到常规状态。

      常常有些报道说,DOS版本3之前的功能50h是不稳定的,尤其在Int

28h处理程序(键盘忙碌循环)中使用时,该功能更不稳定。

      对于出现这些报道的原因很简单:DOS版本2在未来得及把控制权移交

给任何请求功能之前先切换到它自己的内部堆栈中;如果是在DOS正准备处

理另一种常规输入功能时调用该功能,那么第二次堆栈切换的结果就是毁坏

掉输入功能所需的信息。

      防止的办法虽十分简单但却极其巧妙,即通过操纵DOS的关键出错标志

来欺骗DOS,令它相信它正在处理某个关键性的错误。在调用该功能之前设

置关键出错标志可强迫DOS使用其备用的内部堆栈。从这种功能中返回之

后,必须把关键出错标志恢复到它的初始值。关于关键出错标志的详细情况可

参见Int 21h、功能34h的注释部分。

      在版本3中,DOS在进行堆栈切换之前,先修改DOS调度代码对该功能

进行检测;如果该功能被请求,则DOS就会使用调用者自己的堆栈,从而避免

了上述问题。

      对于运行过程来说,应将PSP段地址称为进程ID(PID)。因此,该功能也

常常被称为SetPID。

系统

Int 21h             功能51h                                 版本2

                    获取PSP

565页

获取当前执行进程的程序段前缀(PSP)的地址

调用寄存器: AH          51h

返回寄存器: BX         当前执行进程的PSP

注释:该功能可用于确定由终止并驻留(TSR)程序中断的进程的PSP。TSR

能够保存这一地址,并告诉DOS:DOS自己的PSP就是DOS在处理过程中正

执行的psp。更详细的介绍请参见功能50h和第11章“中断处理程序”。

      常有报道说,在DOS版本3之前该功能是不稳定的,尤其在Int 28h处理

程序(键盘忙碌循环)中工作时,该功能更是不稳定。

      出现上述报道的原因很简单,即:DOS版本2在未来得及把控制权移

交给任何请求功能之前,已先切换回它自己的内部堆栈中;如果是在DOS正

准备处理另一种常规输入时调用该功能,那么第二次堆栈切换的结果就是毁

坏输入功能所需的信息。

      避免上述问题的办法虽十分简单但却极其巧妙,即通过操纵DOS的关键

出错标志来欺骗DOS,令它相信它正在处理某个关键性的错误。在调用该功

能之前设置关键出错标志可强迫DOS使用其备用的内部堆栈。从这种功能中

返回之后,必须把关键出错标志恢复到它的初始值。关于关键出错标志的详细

情况可参见Int 21h、功能34h的注释部分。

      在版本3中,DOS在进行堆栈切换之前,先修改DOS调度代码对该功能

进行检测;如果该功能被请求,则DOS就会使用调用者自己的堆栈,从而避免

了上述问题。

      对于运行过程来说,应将psp段地址称为进程ID(PID)。因此,该功能也

常常被称为GetPID。在版本3中,还增加了功能62h来实现同一任务;在所有

    已检验的版本中,这两种功能所执行的代码是完全相同的。

STOP

Int 21h         功能52h                           版本2

                获取磁盘列表

该功能可提供对驱动器参数块(DOS保存与磁盘配置的有关数据的地方)列

表,以及许多DOS内部表的访问。

调用寄存器: AH        52h

返回寄存器: ES:BX 指向DOS表的指针(见下一段的介绍)

注释:出于内部的原因,DOS把用于磁盘驱动器操作的主要参数作为驱动器

参数块的链接列表来监视。但是,DPB的列表仅仅只是DOS内在地保存的数

据项之一,并且该功能返回的指针还可用来定位其他的项,如表16.17所示。

有时,还把该功能返回的指针称作“表中表”(List of Lists)这是因为可以确定

的信息具有多方面的含义。附录D“保留的DOS功能”,更加详细地介绍了这

 

566页

一功能,有兴趣的读者可参考附录D。

                          表16.17配置变量表(CVT)

偏移值字节      字段长度          内    容

DOS版本3.x以及更高的版本

      - 08h       双字          当前缓冲区在BUFFERS= 链中

      - 04h       字            当前缓冲区内的偏移值

DOS版本2.x以及更高的版本

      - 02h       字            第一个内存控制块中的段

        00h       双字          指向第一驱动器参数块的指针

        04h       双字          指向第一个DCB(系统文件表设备控制块)的指针

        08h       双字          指向CLOCK$设备驱动程序的指针

        0Ch       双字          指向CON设备驱动程序的指针

仅用于DOS版本2.x

        10h       字节          逻辑驱动器数

        11h       字            在任何块设备上,每扇区的最大字节数

        13h       双字          指向磁盘缓冲区链链头的指针

        17h                      NUL设备驱动程序的程序头,是设备驱动程序链

                                中的第一个设备

DOS版本3.x以及更高的版本

        10h       字            任何块设备上,每扇区的最大字节数

        12h       双字          指向磁盘缓冲区链头的指针(在版本4中,指向

                                EMS链接记录,而该记录则接着指向缓冲区链)

        16h       双字          指向逻辑驱动器表(其布局见后面的介绍)的指针

        1Ah       双字          指向DOS的FCB链开头的指针

        1Eh       字            在交换过程中,要保存的FCB数

        20h       字节          块设备数

        21h       字节          逻辑驱动器数,通过CONFIG.SYS中的LAST-

                                DRIVE值设置(如果未指定,则缺省为5)

        22h                      NUL设备驱动程序的程序头;NUL是设备驱动程

                                序链中的第一个设备

        注意表16.17中,不同DOS版本的结构变化情况。在上表给出的数据中,

    只有从DPB指针-02h至+0Fh之间的数据在所有三种版本上保持着连续

    性,在版本2中,逻辑驱动器的数目是通过10h处的字节给出的,在该字节后

    面有一个以字节计算的最大块的字和一个指向第一个缓冲区控制块的双字。

        对于版本3,上表单独列出了另外六个字节;即一个指向当前缓冲区控制

    块的双字指针(位于-08h处)和位于-04h处的一个指示当前缓冲区(通常

    为0000)内的偏移值的字。在版本2中位于10h处的字在版本3中已被移到

    21h处,并将其后的六个字节移过来填充因调整后留下的空隙。在偏移值字节

    16h处,还增加了一个指向逻辑驱动器表的双字指针,在1Ah处设有一个指

 

567页

向系统FCB链的双字指针,在1Eh设有一个字,表明在网络操作期间进行换

出操作时,应保存多个FCB。位于20h处的字节表明现有的块设备数目,而位

于21h处的字节(前面曾提到)则表明现有的逻辑驱动器是多少。

      从表16.17中,我们可以看出,版本3至版本4之间的唯一变化是12h处

的BCB指针变成了一个指向新的EMS链接块(用于文件缓冲)的指针,位于

     -06h处的当前BCB指针则允许直接访问缓冲区链。

      表16.17中的许多数据区内存在着“空隙”(holes),这倒不是因为这些未

知的字节不起作用,而是由于它们的用途目前尚未弄清楚。已知的字节是一些

DOS跟踪高手弄清楚的,他们已在过去的某个时间里琢磨透了某段信息。附

录D“保留的DOS功能”中对这一方面的内容进行了更为详细的介绍(表16.

    19列出了每个DPB的格式,我们将在功能53h中对这些格式进行讨论)。

      表16.18列出了表16.17中由位于偏移值16h处的指针所指的逻辑驱动

器表(DOS版本3以及更高的版本中)中的已知部分。指针指向表的开头。从

驱动器A开始,系统上的每个逻辑驱动器都有一个专用表。最少的驱动器数

    为默认值5(A至E)或为设置在CONFIG.SYS文件的LASTDRIVE中的值。

    在内存中,这些表(在版本3中,每个表有81个字节的长度,在版本4中,每个

    表有88个字节)是一个接着一个的,中间无空隙。

                          表16.18逻辑驱动器表

偏移值字节    字段长度          内    容

    00h        2字节          实际驱动器标志符和:

    02h        65字节         驱动器的当前路径名,为ASCIIZ字符串(包括根目录

                              斜线和为末端的00h字留下的空格)

    43h       字              驱动器(位图)的当前状态

                              8000h=未知

                              4000h=准备使用

                              2000h=未知

                              1000h=被SUBST替代过的单元

                              0000h=未把逻辑驱动器映射给物理驱动器

    45h       双字            指向用于驱动器的DOS DPB的指针

    49h       字              当前目录的第一个簇(若驱动器从未被访问过则为

                              FFFFh,若位于根目录则为0)

    4Bh      字              未知

    4Dh       字              未知

    4Fh       字              在报告出目录时应跳过的字节数:0002用于一般驱动

                              器;更多则表明为已替代的(SUBSTed)单元

DOS版本4

    51h        7字节          未知,缺省值为0

568页

系统

Int 21h           功能53h                                 版本2

                  把BPB转换成DPB

把BIOS参数块转换成DOS驱动器参数块(DPB)。

调用寄存器: AH              53h

              DS:SI       指向DPB的指针

              ES:BP      指向DPB区域的指针

返回寄存器:无

注释: BIOS和DOS都分别保存着各自关于附加在系统上的磁盘和驱动器的

信息。该功能允许把BIOS参数块(BPB)变换成DOS驱动器参数块(DPB)。除

了参阅Int 21h、功能44h,子功能0Dh,次级功能40h外,还应参看Int 21h,功

能1Fh和32h。表16.19给出了DPB和BPB的布局。从表中不难看出,这里

给出的信息主要是面向磁盘的信息在BPB中的信息更是如此。

                      表16.19 BIOS和DOS参数块布局

偏移值字节      字段长度        内  容

BIOS参数块信息

      00h           字        每扇区的字节数

      02h           字节      每簇的扇区数

     03h            字        从扇区0开始的保留扇区数

      05h           字节      FAT的数目

      06h           字        最大的根目录项数

      08h           字        总扇区数据(或在版本4中为0,以表示使用扩展PBP

                              格式)

      0Ah           字节      介质描述符

      0Bh          字        每个FAT中的扇区数

      0Dh           字        每磁道的扇区数

      0Fh           字        磁头数

      11h         双字        隐藏扇区数

      15h         双字        采用扩展BPB格式的扇区总数;仅仅当字位于偏移值

                              08h至0之间时才使用。该项只适用版本4

      19h          7字节      保留

DOS参数块信息

    所有版本

      00h         字节        驱动器号(0=A,1=B,以及等等)

      01h         字节        设备驱动程序单元号)

      02h           字        每扇区的字节数

      04h         字节        每簇的扇区数(以0为基数)

569页

偏移值字节      字段长度      内    容

        05h           字节      移位因子

        06h           字        保留的引导扇区数

        08h           字节      FAT拷贝数目

        09h           字        根目录项数

        0Bh           字        第一个数据扇区号

        0Dh           字        最大的簇号加1

仅适用于版本2或3

        0Fh            字节      每个FAT的扇区数(0-255)

        10h            字        开始有扇区号的根目录项

        12h           双字      驱动器的设备驱动程序地址

        16h           字节      介质描述符字节

        17h           字节      磁盘参数块访问标志(0FFh表明需要重建)

        18h           双字      下一个设备参数块的地址

仅用于版本2

      1Ch             字        当前目录的起始簇号

        1Eh         字节        当前目录路径的ASCIIZ

仅用于版本3

        1Ch           字        从驱动器中分配出来的最后一个簇号

        1Eh           字        用途未知;通常为FFFFh

仅用于版本4

      0Fh             字        每个FAT的扇区数(0-65535)

        11h           字        开始计算扇区号的根目录

        13h         双字        驱动器的设备驱动程序地址

        17h         字节        介质描述字节

        18h         字节        磁盘参数块访问标志(0FFh表明需要重建)

        19h         双字        下一个设备参数块的地址

      1Dh             字        从驱动器中分配出来的最后一个簇号

      1Fh             字        用途未知,通常为FFFFh

系统

Int 21h           功能54h                             版本2

                  获取检验标志

获取写后读出(read-after-write)检验标志的当前值

调用寄存器: AH            54h

返回寄存器: AL            00h,检验断开

              AL           01h,检验接通

注释:检验标志控制着系统是否对磁盘操作进行写后读出检验。缺省时,该标

志为OFF(缺省值为00)。

 

570页

      功能2Eh设置检验标志。设置了这种标志的影响是在一定的程度上障低

    了磁盘操作的速度,以使检验能顺利进行。同时,这样做能增加磁盘操作成功

    的安全系数。

      由于网络系统不支持这一检验功能,因此在网络环境中,返回代码无任何

    含义。

STOP

Int 21h           功能55h                           版本2

                  创建PSP

在指定的段地址位置上创建出程序段前缀(PSP)。

调用寄存器: AH          55h

            DX          设置PSP位置处的段值

返回寄存器:无

注释:此功能类似于Int 21h的功能24h。不同之处是此功能并不只是简单地

复制psp;它要创建一个独立的不同的“子”pSP,为运行另一个程序作准备。

像Int 21h的功能26h一样,此功能已不起作用,已由EXEC功能(Int 21h的

功能4Bh)所取代。

磁盘

Int 21h         功能56h                             版本2

                重命名文件

    重命名一个文件,或将它移到同一个磁盘驱动器的另一个目录下。

    调用寄存器: AH        56h

              DS:DX    指向ASCIIZ当前文件名的指针

              ES:DI    指向ASCIIZ新文件名的指针

    返回寄存器:进位标志清除表示成功

              进位标志置位表示出错

                          02h,文件未找到

                          03h,路径未找到

                          05h, 访问被禁止

                          11h,设备不相同

    注释:现有的重命名功能不是比供文件控制块(FCB)功能使用的功能更强就

    是比它更弱。这一种重命名功能允许使用目录路径名来定位文件,甚至能在两

    个目录间移动文件。但是,由于该功能不允许使用通配符,对整组的文件进行

    更名显然没有可能。

      对很普通的工作来说,这些限制没有什么意义。但是,有了这些限制,则在

 

571页

    日常应用中,对目录中的文件进行更名和在目录间移动它们就方便得多。通过

    这种调用程序,多个文件便可同时得到处理。

        如果路径名不存在或所期望的文件已经存在于目的目录中,那么该功能

    就不会工作。同时,该功能不会越过磁盘驱动器去工作。如果要对其更名的文

    件是打开的,那么首先应关闭它们。当正在对某个文件进行更名时,该文件却

    是打开的,那么出现的结果是令人难以预料的。

        在网络环境中,必须拥有创建访问权限,才能更换文件名。

磁盘

Int 21h           功能57h     子功能00h                     版本2

                  获取文件日期和时间

从目录项中获取最后一次修改文件日期和时间。

调用寄存器: AH              57h

              AL             00h,获取最后一次修改的日期和时间

              BX            文件句柄

返回寄存器:进位标志清除表示成功

              CX            如果获取了日期和时间则为时间

              DX            如果获取了日期和时间则为日期

              进位标志置位表示出错

              AX            出错代码

                            01h,无效功能(文件共享)

                            06h,无效句柄

注释:这种获取日期和时间的功能只能工作在那些通过功能3Ch、3Dh、5Ah

或5Bh(句柄打开或创建功能)打开的文件上。表16.20介绍了日期和时间的

位布局以及各种位设置的含义

                        表16.20日期和时间布局

                位设置

                                          含义

    FEDCBA98        76543210

            时间字段编码

    x x x x x . . . . . . . . . . .     小时(0-23)

    . . . . . x x x x x x . . . . .     分钟(0-59)

    . . . . . . . . . . . x x x x x     两秒计算增长的数目(0-29)

            日期字段编码

    x x x x x x x . . . . . . . . .     年-1980

    . . . . . . . x x x x . . . . .     月(1-12)

572页

磁盘

Int 21h           功能57h     子功能01h                     版本2

                  设置文件的日期和时间

在目录项中设置最近一次修改文件的日期和时间

调用寄存器: AH            57h

              AL           01h,设置日期和时间

              BX          文件句柄

              CX          如果设置日期和时间则为时间

              DX          如果设置日期和时间则为日期

返回寄存器:进位标志清除表示成功

              进位标志置位表示出错

              AX          出错代码

                          01h,无效功能(文件共享)

                          06h,无效句柄

注释:这种设置日期和时间的功能只能在通过功能3Ch、3Dh、5Ah或5Bh(句

柄打开或创建功能)而打开的文件上工作。表16.21介绍了日期和时间的位布

局,以及各种位置的含义。

                        表16.21日期和时间布局

                  位设置

                                          含义

    FEDCBA98          76543210

            时间字段编码

x x x x x . . . . . . . . . . .         小时(0-23)

. . . . . x x x x x x . . . . .         分钟(0-59)

. . . . . . . . . . . x x x x x         按两秒计算的增长数(0-29)

            日期字段编码

x x x x x x x . . . . . . . . .         年-1980

. . . . . . . x x x x . . . . .         月(1-12)

. . . . . . . . . . . x x x             日(1-31)

磁盘

Int 21h           功能58h     子功能00h                     版本2

                  获取分配策略

获取表明在内存分配上采用哪一种策略的代码。

调用寄存器: AH              58h

              AL             00h,获取策略代码

返回寄存器:进位标志清除表示成功

573页

                AX          策略代码

                            00h,最先匹配,低位640K优先(缺省处理)

                            01h,最佳匹配,低位640K优先

                            02h,最后匹配,低位640K优先

                            40h,最先匹配,只能用UMBs

                            41h,最佳匹配,只能用UMBs

                            42h,最后匹配,只能用UMBs

                            80h,最先匹配,UMBs优先

                            81h,最佳匹配,UMBs优先

                            82h,最后匹配,UMBs优先

                进位标志置位表示出错

                AX          出错代码

                            01h,无效功能(文件共享)

注释:在版本2中,Microsoft和IBM已正式将该功能指定为“供DOS内部使

用”。如果你的DOS版本2拷贝出自于第三方厂商,那么可以将这一功能用于

其它的方面。在版本3中,Microsoft已正式公开了这一功能,但在IBM版本

中,仍未公开这一功能。

      子功能00h允许程序知道DOS用于分配内存给进程的策略。一般来说,

这类参数都是无意义的,除非能找到理由来相信一种策略优于另一种策略。

      就DOS来讲,目前已知的分配策略有最先匹配、最佳匹配和最后匹配。而

在版本5中,则可对这些策略进行修改,以便能指定UMBs优先或低位640K

优先。最先匹配策略从低位内存往高位内存中搜索以找到第一个块。与所请

求的内存大小相当或稍大些的内存,并返回它找到的第一个内存块。

      最佳匹配策略则检查所有可用的内存块,以找到与所请求的分配相符合

的最小内存块。这种策略虽然能最有效地把内存用于进程,但它占用的时间要

长些。

      最后匹配策略与最先匹配基本相同,不同之处在于,它是从高位内存向低

位内存搜索,而不是由低向高,并且返回最后一个符合要求的内存块。

      在版本5中,如果第一个被检查到的内存场符合要求(而不管该内存场是

低位的640K还是UMBs),那么就不会去检查第二个内存场。因而在版本5

    中,最佳匹配策略也没有必要给应用程序以大小最合适的内存。由于至少有一

个内存块可从第一个场里分配出来,这样,即使第二个场中可能有大小更般配

    的内存块,该功能也不会对其进行检查。

        在版本5之前,由于最后匹配策略(代码02)可以是任何大于或等于02

    的值,因此,非02的值也会被保存起来。故在检验策略时,必须考虑有大于02

    的号的可能性。

 

574页

系统

Int 21h           功能58h   子功能01h                 版本2

                  设置分配策略

设置代码来表明在内存分配时使用哪一种策略。

调用寄存器: AH              58h

                AL           01h,设置策略代码

                BX          策略代码

                            00h,最先匹配,低位640K优先(缺省处理)

                            01h,最佳匹配,低位640K优先

                            02h,最后匹配,低位640K优先

                            40h,最先匹配,只能用UMBs

                            41h,最佳匹配,只能用UMBs

                            42h,最后匹配,只能用UMBs

                            80h,最先匹配,UMBs优先

                            81h,最佳匹配,UMBs优先

                            82h,最后匹配,UMBs优先

    返回寄存器:进位标志清除表示成功

                进位标志置位表示出错

                AX          出错代码

                            01h,无效功能(文件共享)

    注释:在版本2中,Microsoft和IBM已正式将该功能规定为“供DOS内部使

    用"。如果你从第三方厂商那里购买的DOS版本2,那么可以将这一功能用于

    不同的方面。在版本3中,Microsoft已正式公开了这一功能,但在IBM版本

    中,至今仍未公开这一功能。

        就DOS来讲,目前已知的分配策略有最先匹配、最佳匹配和最后匹配这

    三种。而在版本5中,则可对这三种策略进行修改,以便能指定UMBs优先或

    低位640K优先。最先匹配策略从低位内存往高位内存中搜索以找到第一个

    块。与所请求的内存大小相当或稍大些的内存,并返回它找到的第一个内存

    块。

        最佳匹配策略则检查所有可用的内存块,以找到与所请求的分配相符合

    的最小内存块。

        最后匹配策略与最先匹配基本相同,不同之处在于,它是从高位内存向低

    位内存搜索,而不是由低向高搜索。

        在版本5中,如果第一个被检查到的内存场符合要求(而不管该内存场低

    位的640K还是UMBs),那么就不会继续向下检查,因而在版本5中,最佳匹

    配策略也没有必要给应用程序以大小最合适的内存。由于至少有一个内存块

575页

可从第一个场里分配出来,这样,即使第二个场中可能有大小更般配的内存

块,该功能也不会对其进行检查。

      在版本5之前,由于最后匹配策略(代码02)可以是任何大于或等于02

的值,因此,非02的值也会被保存起来。

系统

Int 21h             功能58h   子功能02h                     版本5

                    获取UMB链接状态

    获取UMB区域链接状态。

    调用寄存器: AH            58h

                AL           02h

    返回寄存器:进位标志清除表示成功

                AL            结果

                              00h,未链接

                              01h,已链接

                进位标志置位表示出错

                AX            出错代码

                              07h,此内存场已被废弃

    注释:该子功能允许程序知道DOS在其内存分配方案中是否使用了UMB。

系统

Int 21h           功能58h     子功能03h                   版本5

                  设置UMB链接状态

设置UMB区域链接状态

调用寄存器: AH              58h

                AL         03h

                BX          链接状态

                            00h,未链接

                            01h,已链接

返回寄存器:进位标志清除表示成功

                进位标志置位表示出错

                AX          出错代码

                            01h,无效功能,表明在装载

                            MS-DOS时,没有设置DOS=UMB

                            07h,该内存场已被废弃

注释:子功能03h允许程序选择DOS是否要在其内存分配策略中使用

 

576页

    UMB。

系统

Int 21h           功能59h                                   版本3

                    获取扩展的出错信息

      当调用某种Int 21h功能失败时,获取返回的扩展出错信息,包括提示采取何

      种补救措施。对这种功能的调用会破坏寄存器AX、BX、CX、DX、SI、DI、BP、

    DS和ES。

    调用寄存器: AH            59h

                        BX                00

    返回寄存器: AX           扩展出错代码

                  BH          出错类型

                  BL        被救措施

                  CH          出错场所

    注释:扩展的出错处理功能对DOS的出错处理过程提供了重要的扩展,它为

    DOS系统增加了诊断功能,并让DOS能在运行时处理出现的错误。该功能增

    加了一项重要的功能以分析和杜绝DOS调用中可能出现的问题。同时,还可

      以在调用Int 21h或Int 24h时出现了错误并且返回了出错状态代码之后调用

    该功能。如果不出错,该功能就会返回AX=0000h。通过该功能还能解决返回

    FFh的文件控制块(FCB)调用中出现的问题。

        在附表中对返回信息进行了分类。其中,寄存器AX返回扩展出错代码

      (参见表16.22)。这些都是常见的系统错误,从Int 21h功能返回的出错中我

    们已初步了解到了这些错误。寄存器BH则返回的是出错类别,它使我们对发

    生的错误有更深入的了解。(参见表16. 23)

          BL寄存器返回的值是最令人感兴趣的,即解决问题的办法(参见表

    16.24)。最后寄存器CH返回出错场所,它有助于我们找出出错的物理位置

      (参见表16.25)。在所有这些信息中,唯一存在的问题是信息能够涉及的范

    围。通用的出错处理程序可能不存在问题。但是,至于一些常规的步骤能否采

    用,就要看所发生的是哪种类型的错误。

        如果一种功能通过在返回时设置进位标志来指示出错,那么应采用如下

    的办法来处理所发生的错误:

        1.装载用于该功能的寄存器。

        2.发出Int 21h功能调用。

        3.如果进位标志已清除,则继续进行常规操作

        4.如果进位标志置位,则不管该功能返回的出错代码是什么,都应先调

            用功能59h。

        5.采用BL寄存器推荐的方法来确定正确的补救措施。

577页

        有些功能是通过AL寄存器返回某种代码(AL=FFh)来指示出错的。对

    于这种情况,应采用如下的调用步骤:

        1.装入用于该功能的寄存器。

        2.发出Int 21h功能调用。

        3.如果AL中未报告出错误,则继续进行常规操作。

        4.如果AL已报告出错误,则别理会出错代码是什么,都应先调用功能

          59h。

        5.采用BL寄存器建议的办法来进行正确的补救操作。

        必须十分小心地使用该功能。在返回时,该功能会破坏寄存器AX、BX、

    CX、DX、SI、DI、BP、DS和ES。并且,在出现错误后,必须“立即”调用该功能。

    如果在该调用之前执行了另一种DOS功能,那么返回代码就不能正确地表达

    出所发生的错误。

                      表16.22通过AX返回的扩展出错代码

代      码                        含义

十进制          十六进制

    1             01        无效功能号

    2             02        文件未找到

    3             03        路径未找到

    4             04        无可用的句柄

    5             05        访问被禁止

    6             06        无效句柄

    7             07        内存控制块被破坏

    8             08        内存不够

    9             09        无效内存块地址

    10             0A       非法环境

    11             0B       无效格式

    12             0C       无效访问代码

    13             0D       无效数据

    14             0E       保留

    15             0F       无效驱动器

    16             10       试图删除当前目录

    17             11       不是同一设备

    18             12       无更多的文件

    19             13       磁盘写保护

    20             14       未知单元

    21             15       驱动器未就绪

    22             16       未知命令

    23            17        CRC出错

    24             18       错误的请求结构长度

578页

代码                含义

    十进制      十六进制

    25             19       寻道出错

    26             1A       未知的介质类型

    27             1B       扇区未找到

    28             1C       缺纸

    29             1D       写故障

    30             1E       读故障

    31             1F       常规失败

    32             20       共享违反

    33             21       锁定违反

    34             22       非法磁盘变换

    35             23        FCB不可用

    36             24       共享缓冲区溢出

    37             25       代码页不匹配

    38             26       不能完成文件操作(仅用于版本4)

    39             27       句柄磁盘已满

    40-49         28-31       保留

    50             32       不支持网络请求

    51             33       远程计算机未在接收

    52             34       在网络上复制名称

    53             35       网络名未找到

    54             36       网络忙碌

    55             37       网络设备不存在

    56             38     超出了NetBIOS命令限制

    57             39       网络接口卡出错

    58             3A       不正确的网络响应

    59             3B    意想不到的网络出错

    60             3C     不兼容的远程接口卡

    61             3D     打印队列已满

    62             3E     用于打印文件的空间不够

    63             3F       已删除打印文件

    64             40       已删除网络名

    65             41     访问被禁止

    66             42     网络设备类型不正确

    67             43     网络名未找到

     68           44      超出了网络名称限制

    69             45     超出了NetBIOS会晤期范围

    70             46     共享被暂停

    71             47     不接收网络请求

    72             48     已暂停打印或磁盘重定向

73-79           49-4F      保留 

579页

    代码                含义

十进制        十六进制

80               50       文件已经存在

81               51       复制FCB

82               52       不能辨别目录项

83               53       在Int 24上失败

84               54       重定向太多

85               55       复制重定向

86               56       非法口令

87               57       无效参数

88               58       网络数据出错

89               59       网络不支持功能(仅用于版本4)

90               5A       未安装所要求的系统组件(仅用于版本4)

表16.23通过BH返回的出错类别代码

代码                            含义

十进制          十六进制

    1               01        资源不够

    2               02        暂时状态

    3               03        授权

    4               04        内部的

    5               05        硬件失败

    6               06        系统失败

    7               07        应用程序出错

    8               08        未找到

    9               09        错误格式

    10               0A       已锁定

    11               08       介质

    12               0C       已经存在

    13               0D       未知

表16.24通过BL返回建议的动作代码

措施代码                  含义

    1                 重试。如果进位标志仍未清除,则提示用户放弃努力或忽略该

                      标志。

    2                 先延迟然后重试。如果进位标志仍未清除则提示用户放弃努力

                      或忽略该标志。

    3                 从用户(坏文件名或磁盘驱动器)那里获取正确的数据。

    4                 通过清除来中止应用程序。

580页

措施代码                  含义

    5               中止应用程序而清除它(清除可能增加问题)。

    6               忽略错误。

    7               提示用户改正错误,然后再重试。

      表16.25通过CH返回的出错场所代码

      代码                    含义

      1                     未知

      2                     块设备(磁盘或磁盘仿真器)

      3                     网络

      4                     串行设备

      5                     相关的内存

磁盘

Int 21h             功能5Ah                                     版本3

                    创建单独的命名文件

      创建文件,并保证它在指定目录中拥有独一无二的文件名。

      调用寄存器: AH            5Ah

                    CX          属性

                    DS:DX    指向未尾为反斜杠的ASCIIZ路径说明的指针

      返回寄存器:进位标志清除表示成功

                    AX          句柄

                    DS:DX    指向其后附着有文件名的ASCIIZ文件

                                说明的指针

                    进位标志置位表示出错

                    AX          出错代码

                                 03h,路径未找到

                                04h,无可用的句柄

                                05h,访问被禁止

      注释:独一无二的文件往往可用作暂时文件。通过使用单独的文件创建调用,

      用户不必为创建的文件名是否恰当而担心;因为这个问题可留给操作系统自

      己去解决。

          要想使用该功能,必须把路径名指向希望在其内创建暂时文件的目录,同

      时,还应使用末尾为反斜杠的完整路径名(例如,使用\TMP\来把文件放在\

      TMP目录中)。也可以为你想创建的文件指定属性。下表列出了可通过该功能

 

581页

    设置的有效属性。然后,该功能就可按照它自己的内部规则返回一个独一无二

    的文件名。

      值                      与之相匹配的文件类型

        00h                       普通文件

        02h                       隐藏文件

        04h                       系统文件

        06h                       隐藏文件和系统文件

      这种文件创建功能有一种有趣的作用;即在PC网络上实现信号灯机制。

    如果该功能成功地创建了文件,那么程序就会有一个信号灯,并继续往前运行

    到它的关键代码部分。如果程序不能创建文件,那么你所能做的就是周期性地

    对操作进行检验。

        当创建文件的程序完成了它的关键代码部分后,它就会删除已创建的文

    件,并释放信号灯。

      在网络环境中,必须拥有创建访问权限,才能使用该功能。

磁盘

Int 21h             功能5Bh                                版本3

                    创建新文件

在指定的目录下创建一个新文件。

调用寄存器: AH            5Bh

              CX          属性

              DS:DX    指向ASCIIZ文件说明的指针

返回寄存器:进位标志清除表示成功

              进位标志置位表示出错

              AX            出错代码

                            03h,路径未找到

                            04h,无可用句柄

                            05h,禁止访问

                            50h,文件已存在

注释:这是创建一个新文件时的正常方法,所创建文件不仅仅是用作临时文

件的。该功能返回一个用于访问此文件的句柄。如果因为路径未找到,或无可

用句柄,或因为想在根目录下创建文件,但根目录已满等原因而不能创建文

件,则该功能会失败。

      与功能3Ch不同的是,如果要创建的文件已存在,该功能也会失败。因此

可用此功能来测试指定的文件是否已存在。如果创建成功,说明该文件不

 

582页

    存在。

        用读/写属性创建的是一个普通文件。可用功能43h来改变属性。但是,

    不能创建卷标或子目录。表16.26列出了有效的属性。

                      表16.26创建文件时可用的有效属性

值                匹配的文件类型

00h                 普通文件

02h                 隐藏文件

04h                 系统文件

06h                 隐藏的且是系统的文件

      该文件创建功能的一个有趣用途是在PC网络上实现一种信号灯机制。

如果此功能成功地创建了一个文件,程序就有一个信号灯,并可以进入关键性

代码部分。如果不能创建文件,则可以周期性地进行重新测试操作。

        当创建文件及关键部分的程序完成操作时,它再删除该文件并释放信号

灯。

      在网络环境里,使用此功能时还必须有创建的访问权限。

磁盘

Int 21h             功能5Ch       子功能00h                     版本3

                    设置文件访问锁

    锁定某个文件的指定区域。

    调用寄存器: AH            5Ch

                AL           00h

                BX            文件句柄

                CX            区域偏移值中的高位部分

                DX            区域偏移值中的低位部分

                SI            区域长度中的高位部分

                DI            区域长度中的低位部分

    返回寄存器:进位标志清除表示成功

                进位标志置位表示出错

                AX            出错代码

                              01h,无效功能

                              06h,无效句柄

                              21h,非法锁

                              24h,超出了共享缓冲区

    注释:在网络环境中,文件锁定对于面向数据库或其它事务处理的功能来说

 

583页

    是必要的。如果系统允许一个以上的进程来同时写某个文件中的同一部分,那

    么这两种写的结果都是不确定的。而锁定则能强迫操作按顺序进行,以便一个

    进程能在另一个进程开始之前完成其写操作。该功能不能保证写的顺序一定

    能明确地出现,它只能保证进程之间不会相互干扰。

        锁定与解锁就像是Pascal中的Begin-End对或C语言中的大括号({});

    它们必须成对地出现。即是说,对于每个文件锁定,在同一程序中还必须同时

    存在着一个与之相对应的解锁操作。文件解锁的失败会导致文件的状态不能

    确定。

      使用文件锁定功能的程序必须承担起捕获该程序中可能出现的任何错误

    这一任务,以便在出现非常规的情况下也能处理文件解锁。访问那些是锁定的

    或能被锁定的文件的程序不能直接访问这些文件。使用锁定机制的正确办法

是不能依靠这种机制来防止直接冲突。相反,应直接锁定文件的指定部分,然

后检查返回的出错代码,看看锁定是否成功,如果能创建文件锁,那么就能进行

文件控制。如果不能创建这种文件锁,那么就意味着程序必须延迟并应重试。

      这种锁定机制包括一种自动的重试功能。通过使用IOCTL功能(44h)的

子功能0Bh,就能改变重试的次数和重试间隔时间。

      用功能45h复制的文件句柄继承了对锁定区域的访问。而用程序EXEC

功能(4Bh)创建出的程序则不能继承文件锁以及对应的文件。

磁盘

Int 21h             功能5Ch     子功能01h                     版本2

                    清除文件访问锁

打开由子功能00h锁定的指定文件区域。

调用寄存器: AH              5Ch

                AL          01h

                BX          文件句柄

                CX          区域偏移值中的高位部分

                DX          区域偏移值中的低位部分

                SI          区域长度中的高位部分

                DI          区域长度中的低位部分

返回寄存器:进位标志清除表示成功

                进位标志置位表示出错

                AX          出错代码

                            01h,无效功能

                            06h,无效句柄

                            21h,非法锁定

                            24h,超出了共享缓冲区

 

584页

    注释:在网络环境中,文件锁定是数据库或其它事务处理功能必须进行的一

    项操作。如果系统允许一个以上的进程来同时写某个文件中的同一部分,那么

    两种写的结果都是不确定的。记录锁定则能强迫操作按顺序执行,这样便使得

    一个进程能在另一个进程开始之前完成其操作。该功能不能保证写的顺序一

    定能明确地出现,它只能保证进程之间不会相互干扰。

        锁定与解锁就像是Pascal中的Begin-End对或C语言中的大括号({});

    它们必须成对地出现。即是说,对于每个文件锁定,在同一程序中还必须同时

    存在着一个与之相对应的解锁操作。文件解锁的失败会导致文件的状态不能

    确定。

        该功能的其他细节可参见对功能00h的讨论。

STOP

Int 21h             功能5Dh     子功能00h                       版本3

                    把数据复制到DOS保存区

该功能从DS:SI所指的位置中把数据的18个字节复制到DOS内部的寄存

器保存区域,这样,当DOS返回给调用者时,复制的内容便可随着寄存器一起

返回。

调用寄存器: AH            5Dh

              AL         00h

返回寄存器: DS:SI     指向要复制的数据的指针

注释:该功能的作用是替换DOS保存的所有寄存器值,并把控制权传送给该

系统的另一部分。但是,该功能的真正目的目前还是个未知数。

STOP

Int 21h             功能5Dh       子功能06h                     版本3

                    获取关键出错标志地址

返回一个指针,指向保存系统关键出错标志的位置。

调用寄存器: AH              5Dh

                AL          06h

返回寄存器: DS:SI       指向关键出错标志的指针

注释:该功能返回一个指向关键出错标志的指针,其中,关键出错标志由

DOS用来确定是否已发生了关键出错。

STOP

Int 21h             功能5Dh     子功能0Ah                     版本3

                    设置出错数据值

585页

    改变每个DOS操作内部保存的系统出错数据代码。

    调用寄存器: AH            5Dh

                  AL         0Ah

                  DS:SI     指向ERROR(错误)结构的指针

                              字,扩展出错代码

                            字节,要设置的动作码

                              字节,要设置的类别符号

                              字,要设置的场所代码

                              字,在出错发生时刻的DX

                              字,在错误发生时刻的SI

                              字,在错误发生时刻的DI

                              字,在错误发生时刻的DS

                                字,在错误发生时刻的ES

                                字,保留

                                字,计算机ID号(0表示本地的)

                                字,程序ID号(0表示本地的)

    返回寄存器:无

    注释:子功能0Ah能改变DOS的内部存储位置,通过中断21h,功能59h(获

    取扩展出错信息),DOS就能用这些位置返回信息。一旦检测到错误,程序便

    可通过子功能06h(获取关键出错标志地址)来使用内部存储位置,以便保存

    上述代码,然后,当前一个进程(可能修改DOS保存的代码)完成时,程序还能

    恢复这些代码。

        在TSR编码中可使用上述几种子功能来防止因不小心改变了某个出错

    代码而引发的弹出行为,以及由此产生的不精确的结果。为了实现这个目的,

    可首先使用子功能06h来获取出错地址,并将得到的数据保存在自己的存储

    区中。在进行保存操作时,应注意功能06h使用的DOS内部结构与子功能

    0Ah使用的结构之间的不同点:

        字节,场所代码

          字,扩展出错代码

        字节,行为代码

        字节,类别代码

        双字,指向驱动程序地址的远指针

网络

Int 21h             功能5Eh     子功能00h                   版本3.1

                    获取机器名

586页

获取网络机器名。

调用寄存器: AH                5Eh

                AL             00h,获取机器名

                DS:DX       指向将接受机器的缓冲区的指针

                DS:SI       指向设置字符串的指针

返回寄存器:进位标志清除表示成功

                CH=          00h,未指定机器名

                CH>         00h,已指定机器名

                CL            NetBIOS名称号(CH>00h)

                进位标志置位表示出错

                AX            出错代码

                              01h,无效功能

注释:机器名共有15个字节,由ASCIIZ字符串组成,其作用是把机器标识

给网络。该功能要求网络是运行的。如果网络不是在运行,那么使用该功能就

得不到预期的结果。

网络

Int 21h             功能5Eh     子功能01h                   版本3.1

                    设置机器名

设置网络机器名。

调用寄存器: AH                5Eh

                AL             01h,设置机器名

                DS:DX      指向保存着机器名(为ASCIIZ字符串)的

                              缓冲区的指针

返回寄存器:进位标志清除表示成功

                进位标志置位表示出错

                AX            出错代码

                              01h,无效功能

注释:机器名共有15个字节,由ASCIIZ字符串组成,其作用是把机器标识

给网络。该功能要求网络是运行的。如果网络不在运行,那么使用该功能便得

不到预期的结果。该功能只能由网络软件使用,因为它所修改的是网络操作的

必需信息。

网络

Int 21h             功能5Eh     子功能02h                   版本3.1

                    设置网络打印机(setup)

587页

    设置打印机。

    调用寄存器: AH            5Eh

                  AL           02h,设置打印机

                  BX          重定向列表索引

                  CX          装置字符串的长度(最长为64个字节)

                  DS:SI     指向设置字符串的指针

    返回寄存器:进位标志清除表示成功

                  进位标志置位表示出错

                  AX          出错代码

                              01h,无效功能

    注释:打印机设置是一种字符串,在访问网络打印机时,该字符串先于所有打

    印工作被最先发送出去。子功能02h允许设置这种字符串。

网络

Int 21h           功能5Eh     子功能03h                 版本3.1

                  获取网络打印机设置(Setup)

    获取打印机设置字符串

    调用寄存器: AH            5Eh

                  AL           03h,获取打印机设置

                  BX          重定向列表索引

                  ES:DI     指向要接收设置字符串的缓冲区的指针

    返回寄存器:进位标志清除表示成功

                  CX          打印机设置字符串的长度

                  ES:DI     指向打印机设置字符串的指针

                  进位标志置位表示出错

                  AX          出错代码

                              01h,无效功能

    注释:打印机设置是一种字符串,当访问网络打印机时,该字符串先于所有打

    印机工作被最先发送给打印机。子功能03h允许获得这种字符串。

网络

Int 21h           功能5Fh   子功能02h                 版本3.1

                  获取重定向列表项

获取网络重定向列表项

调用寄存器: AH            5Fh

588页

                    AL              02h

                    BX              重定向列表索引

                    DS:SI        指向用于设备名的128个字节缓冲区的指针

                    ES:DI        指向用于网络名的128个字节缓冲区的指针

    返回寄存器:进位标志清除表示成功

                    BH              设备状态标志

                                    位0=0,设备有效

                                    位0=1,设备无效

                    BL              设备类型

                                    03h,打印机

                                    04h,磁盘驱动器

                    CX              保存的参数值

                    DX              已破坏

                    BP              已破坏

                    DS:SI        指向ASCIIZ本地设备名的指针

                    ES:SI        指向ASCIIZ网络名的指针

                    进位标志置位表示出错

                    AX              出错代码

                                    01h,无效功能

                                    12h,无更多的文件

注释:该功能可用在网络上获取用于设备(打印机或磁盘目录)的网络重定

向。网络必须是运行的,以便能支持这种功能。例如,使用这一功能(以及子

功能03h),就能把磁盘驱动器标识符与网络目录联系起来。还可以指定某个

远程打印机设备可通过本地的打印机设备名来访问,因为这种功能支持用于

远程磁盘访问的远程口令。

      要想使用这种功能,必须载入文件共享模式。由于所有的标识符都被当作

ASCIIZ字符串进行传送,因此它们能与用C语言进行的编程操作兼容,但不

能直接与Pascal或BASIC语言兼容。在获取目录项时,每个发往于功能02h

的调用都会返回重定向表中的一个单项。重定向表中的所有项都是ASCIIZ

字符串,分别代表着本地设备名(DS:SI所指向的字符串)和网络名(ES:DI

指向的字符串)。

      当随后对功能02h进行再次调用时,如果系统返回了出错代码21h(无更

多的文件),那么就意味着已达到了重定向列表的终点。调用功能5Fh会破坏

寄存器DX和BP中的内容,即使不通过它们来返回值时,它们也同样会遭到

破坏。

      尽管有复杂的重定向变量,但都不能对COM设备、STDOUT和

STDERR进行重定向。

589页

网络

Int 21h             功能5Fh     子功能03h                   版本3.1

                    设置重定向列表项

获取或修改网络重定向列表项。

调用寄存器: AH              5Fh

                AL         03h

                BL          设备类型

                            03h,打印机

                            04h,磁盘驱动器

                CX          保存的参数值

                DS:SI    指向ASCIIZ本地设备名的指针

                ES:DI    指向其后为ASCIIZ口令的网络名的指针

返回寄存器:进位标志清除表示成功

                进位标志置位表示出错

                AX          出错代码

                            01h,无效功能

                            03h,路径未找到

                            05h,访问被禁止

                            08h,内存不够

                            0Fh,无效驱动器

                            12h,无更多的文件

                            57h,无效参数

注释:在网络上,可用子功能03h来为设备(打印机或磁盘目录)设置网络重

定向。这种功能是通过修改与网络设备、文件或目录相关的局部设备名称列表

来实现上述目的。网络必须是运行的,以便能支持这一功能。例如,在实际操

作中,使用这一功能就能把磁盘驱动器标识符与网络目录联系起来。也可以指

定通过本地的打印机设备名来访问某个远程打印机设备。因为该功能支持用

于远程磁盘访问的远程口令。

      在使用该功能之前必须装入文件共享模式。由于所有的标识符都是当作

ASCIIZ字符串来传送的,因此它们能与用C语言进行的编程操作兼容,但不

能直接与Pascal或BASIC语言兼容。重定向表中的每一个项都是一个ASCI-

IZ字符串,分别代表着本地设备名(DS:SI指向的)和网络名(ES:DI指向

的)。

      子功能03h允许指定一种供使用的重定向方式。因此,可以指定一种打印

机或磁盘重定向(BL=设备类型)并指明该设备的本地名(A、B等代表磁盘重

定向;PRN:LPT1:等代表打印机重定向)。当重定向打印机时,则面向该打印

 

590页

机的输出就会被缓冲,并且被发送给目的设备的网络假脱机打印。由于重定向

发生在Int 17h层,因此,可以获取除硬件访问外对打印机自身进行的所有访

问。

      尽管有复杂的重定向变量,但都不能对COM设备、STDOUT和

STDERR进行重定向。

网络

Int 21h           功能5Fh   子功能04h               版本3.1

                  删除重定向列表项

删除网络重定向列表项。

调用寄存器: AH            5Fh

              AL          04h

              DS:SI    指向ASCIIZ设备名的指针

返回寄存器:进位标志清除表示成功

              进位标志置位表示出错

              AX          出错代码

                          01h,无效功能

                          0Fh,无效驱动器

注释:在网络上可用该功能来取消对设备(打印机或磁盘目录)的网络重定

向。该功能是通过修改与网络设备、文件或目录相关的本地设备名列表来实现

上述目的。例如在实际操作中,使用这一功能就能把磁盘驱动器标识符与网络

目录联系起来。也可以指定某个远程打印机设备可通过本地的打印机设备名

进行访问。因为该功能支持用于远程磁盘访问的远程口令。

    在使用该功能之前必须装入文件共享模式。由于所有的标识符都被当作

ASCIIZ字符来传送,因此,它们与用C语言进行的编程操作兼容,但却不能

直接与Pascal或BASIC语言兼容。

    尽管COM设备、STDOUT和STDERR有很复杂的重定向变量,但却不能

对它们进行重定向。

STOP

Int  21h        功能60h                           版本3

                扩展路径名字符串

该功能的作用是把相对路径名(其中包括由替代的(SUBST的)驱动器或指定

的(ASSIGN的)的路径名)扩展成可供物理驱动器引用的完整合格路径名。

调用寄存器: AH              60h

                DS:SI     指向ASCIIZ相对路径名的指针

591页

                ES:DI        67字节工作缓冲区的地址

    返回寄存器:进位标志清除表示成功

                ES: DI       未改变;工作缓冲区保存着完整合格的路径名

                进位标志置位表示出错

                AX            出错代码

                              02h,输入字符串中出现了非法字符

    注释: DOS的版本3引入了这一功能以允许EXEC功能把程序文件的完整

    路径名加到环境区域的末端。虽然一些报道说该功能还执行其它的令牌分析,

    但我们的试验表明,该功能只解释那些是合法路径名(包括使用通配符?和

    * )的字符串。该功能对命名文件是否存在不作检查。在整个执行过程中,唯

    一报告出错的原因归咎于输入字符串中出现了不合法的字符。

系统

Int 21h           功能62h                                 版本3

                  获取PSP地址

获取用于当前程序的程序段前缀(PSP)的段地址

调用寄存器: AH            62h

返回寄存器: BX            PSP的段地址

注释:该功能的作用是允许当前程序在程序启动过程中的任何时刻获取其

PSP的地址,而不必明显地将这一地址保存在可访问的区域。由于对大多数功

能的访问都必须避免直接访问PSP,因此,功能62h只能作为一种边缘的实用

程序来应用。

      在所有已验证的DOS版本中,功能62h是保留的功能51h的备用功能,

两者使用的代码是相同的。

系统

Int 21h           功能63h   子功能00h                 版本2.25

                  获取系统前导字节表

获取系统前导字节表的地址。

调用寄存器: AH              63h

                    AL              00h

返回寄存器: DS:SI      指向前导字节表的指针

注释:该功能的作用是获取系统前导字节表的地址。这些数据结构与处理每

字符2个字节的显示系统如Kanji和Hangeul有关。最初,该功能仅适用于

DOS版本2.25,而不能用在DOS版本3上,但是,该功能随后却再次出现在

 

592页

    DOS版本4中,而且DOS版本4对这种作法没有作出任何解释。

        在版本4中,功能63h的其它子功能没有得到执行,并且当调用该功能失

    败时,系统也不会返回任何出错提示。

系统

Int 21h             功能63h     子功能01h                   版本2.25

                    设置/获取临时控制台标志

控制临时控制台标志。

调用寄存器: AH                63h

                AL           01h

                DL           00h,设置临时控制台标志

                DL           01h,清除临时控制台标志

返回寄存器:无

注释:该功能对临时控制台标志实行控制。这些数据结构与处理每字符2个

字节的显示系统如Kangji和Hangeul有关。该功能只适用于DOS版本2.25;

它不能用于DOS版本3以及更高的版本中。

系统

Int 21h             功能63h     子功能02h                   版本2.25

                    获取临时控制台标志值

    获取临时控制台标志的值。

    调用寄存器: AH          63h

                AL         02h

    返回寄存器: DL          临时控制台标志的值

    注释:该功能可获取临时控制台标志的值。这些数据结构处理每字符2个字

    节的显示系统如Kangji和Hangeul是密切相关的。该功能只适用于DOS版本

    2.25;而不能用于DOS版本3以及更高的版本中。

系统

Int 21h             功能64h                                     版本3

                    设置当前的国家字节

    设置DOS内部的当前国家字节

    调用寄存器: AH            64h

                AL            当前国家的字节值

    返回寄存器:无

593页

    注释: AL寄存器的内容被保存在DOS内部的当前国家代码位置上。功能

    64h不进行有效性检查,并且在出错时也不返回任何出错代码。该功能不改变

    任何标志。

系统

Int 21h             功能65h                               版本3.3

                    获取扩展国家信息

返回指定国家的扩展信息。

调用寄存器: AH              65h

              AL            要获取的信息的ID号(1、2、4、5、6或7)或子功

                            能(20h、21h或22h)

              BX            想获取的代码页(-1=活动的CON设备)

              CX            要返回的数据数

              DX            国家ID号(缺省值为-1)

              ES:DI      指向返回信息将到达的缓冲区指针

返回寄存器:进位标志清除表示成功

              ES:DI      指向接收信息的缓冲区的指针

              进位标志置位表示出错

              AX            出错代码

                            01h,无效功能

                            02h,文件未找到

注释:要使用国际系统(非美英语)的程序员必须能访问大范围的国家专用信

息,如符号和数据格式。根据所指定的某个国家,功能65h能为程序获取相应

的国家信息。

      表16.27可通过国家ID号来获取缺省值(-1)代表美国。调用功能65h

只能返回CX寄存器中指定的数据量。如果表中还包含有其它的数据,那系统

会截取这些数据,并且不返回任何错误信息。

                          表16.27扩展国家信息

偏移值    字段  含义

    字节            长度

扩展国家信息缓冲区

信息ID:01

      00h             字节      信息ID号=1

      01h             字        大小(38或更小)

      03h             字          国家ID号

      05h             字        代码页

      07h             字          日期和时间格式代码

594页

偏移值              字段

                              含义

字节                长度

                                  0=美国月日年,时时:分分:秒秒

                                  1=欧洲日月年,时时:分分:秒秒

                                  2=日本 年月日,时时:分分:秒秒

        09h            5字节      货币符号字符串(ASCIIZ)

        0Eh           字节        千分隔号

        0Fh           字节        0

        10h           字节        十进制分隔号

        11h           字节        0

        12h           字节        日期分隔号

        13h           字节        0

        14h           字节        时间分隔号

        15h           字节        0

        16h           字节        货币格式

                                  00h=符号在前,中间无空格

                                  01h=符号在后,中间无空格

                                  02h=符号在前,中间有1个空格

                                  03h=符号在后,中间有1个空格

                                  04h=符号替代了小数分隔符

        17h           字节        小数点后面的数字数

        18h           字节        时间格式

                                  位0=0-12小时时钟

                                  位0=1-24小时时钟

        19h           双字        大小写转换调用地址

        1Dh             字        日期列表分隔符

        1Eh           字节        零

        1Fh            10字节     保留

扩展国家大写字母表

信息ID:02

        00h           字节        信息ID=02

        01h           双字        指向大写字母表的指针。大写字母表有130字节

                                  :2字节的长度加上128字节的大写值

扩展的国家文件名大写表

信息ID:04

        00h           字节        信息ID=04

        01h           双字        指向文件名大写表的指针。文件名大写表共有

                                  130个字节;2个字节的长度,加上128字节的大

                                  写值

595页

偏移值              字段

                              含义

    字节            长度

    扩展文件名字符表

    信息ID:05

        00h             字节        信息ID=05

        01h             双字        指向文件名字符表的指针。表头为一个16位的

                                    长度字,后跟指定国家所用的字符。

    扩展国家排列表

    信息ID:06

          00h           字节        信息ID=06

          01h           双字        指向排列表的指针。排列表共有258字节:2字节

                                    的长度值,加上256个用于排列顺序的字节。

    DBCS引导字节表(仅用于版本4)

    信息ID:07

          00h             字        后跟的字节数

          02h            2字节      第一个前导字节范围的开头与结尾

          04h            2字节      下一个前导字节范围的开头与结尾

                        2字节       在必要时重复

                        2字节       0,0标记着表的结束;不在计数范围内

系统

Int 21h           功能65h     子功能20h                   版本4

                  转换字符

使用当前大写字母表,把指定的字符转换成大写体

调用寄存器: AH            65h

              AL          20h

              DL          字符

返回寄存器:进位标志清除表示成功

              DL          大写体字符

              进位标志置位表示出错

注释:该功能提供了一种可靠的路径来把字符转换成可用于当前国家的大写

体。

系统

Int 21h           功能65h     子功能21h                     版本4

                  转换字符串

596页

    使用当前大写字母表把指定的字符串转换成大写体。

    调用寄存器: AH          65h

                        AL              21h

                        CX              串长度

                        DS:DX        指向字符串的指针

      返回寄存器:      进位标志清除表示成功

    注释:该功能提供了一种可靠的途径来把字符串转换成可用于当前国家的大

    写体。

系统

Int 21h           功能65h   子功能22h                   版本4

                  转换ASCIIZ字符串

使用当前大写字母表,把指定的字符串转换成大写体。

调用寄存器: AH            65h

                    AL              22h

                    DS:DX        指向ASCIIZ字符串的指针

返回寄存器: DS:SI     进位标志清除表示成功

注释:该功能提供了一种可靠的途径,可把字符串转换成用于当前国家的大

写体。 

系统

Int 21h           功能66h   子功能01h                   版本3.3

                  获取全局代码页

    获取用于当前国家的代码页。

    调用寄存器: AH            66h

                AL            01h

    返回寄存器:进位标志清除表示成功

                BX            活动的代码页

                DX            系统代码页

                进位标志置位表示出错

                AX            出错代码

                              02h,文件未找到

    注释:该功能指出保存在COUNTRY.SYS中的哪一个国家数据是在常驻国

    家缓冲区即代码页中。如果设备支持代码页转换,那么系统会自动地选择出这

  些能在CONFIG.SYS文件中进行代码页转换的设备。

597页

系统

Int 21h             功能67h                               版本3.3

                    设置句柄计数

    允许进程动态地修改可用于进程的文件句柄数(通常为20)。

调用寄存器: AH              67h

                BX          允许打开的句柄数

    返回寄存器:进位标志清除表示成功

                进位标志置位表示出错

                AX          出错代码

    注释:该功能允许程序在运行过程中对可供使用的文件句柄数实行控制。这

    对于复杂的数据库程序来说尤其重要,因为这些程序常常要求对它们必须保

    持打开的巨大文件数进行控制。内存是从功能4Ah释放出的内存中分配出来

    的。如果内存数量小于当前打开文件数目,那么只有当当前打开的文件数降低

    到内存限以下时,这些内存才变得可用。

        在DOS版本3.3中,CONFIG.SYS项FILES=最多能设置255个文件

    句柄。如果指定的文件句柄数小于20,那么这个数字会缺省地为20。

磁盘

Int 21h           功能68h                                 版本3

                  清空缓冲区

把用于某个文件的所有得到缓冲的数据全部传送给设备。

调用寄存器: AH            68h

              BX          文件句柄

返回寄存器:进位标志清除表示成功

              进位标志置位表示出错

              AX          出错代码

注释:长期以来,把缓冲区清空至磁盘的标准方法就是关闭文件并重新打开

它。在这方面所做的改进是用功能45h来复制文件句柄,然后再关闭复制的文

件句柄。这同样达到了关闭文件的目的,而且不致于引发另一文件的打开。

      使用功能68h不需要任何技巧。如果想清空缓冲区,使用该功能不仅能更

快地实现这个目的,而且使用起来更为安全。

系统

Int 21h           功能6Ah                               版本4

                  分配内存

598页

    分配可供使用的内存块,并返回一个指向该内存块块首的指针。该功能是功能

    48h的备用功能。

    调用寄存器: AH        6Ah

              BX          文件句柄

    返回寄存器:进位标志清除表示成功

              进位标志置位表示出错

              AX          出错代码

    注释:在IBM版本4.01中,该功能使用与未公开的功能48h相同的代码。

磁盘

Int 21h           功能6Ch                               版本4

                  扩展的打开/创建

把先前由功能3Ch、3Dh和5Bh提供的功能结合到一种多用途的文件打开设

备中。

调用寄存器: AH            6Ch

              AL           00h(所要求的)

              BX          打开模式(位图):

            位设置

                                                含义

FEDCBA98          76543210

. . . . . . . .     . . . . . 000                  只读访问

            . . .   . . . . . 001                   只写访问

. . . . . . . .     . . . . . 010                  读/写访问

. . . . . . . .     . . . . . 011                   未使用,0

. . . . . . . .     . . . . . 1x x                  未使用,0

. . . . . . . .     . . . . x. . .                  未使用,0

. . . . . . . .     . 000. . . .                    兼容模式

. . . . . . . .     . 001. . . .                    禁止所有的共享

. . . . . . . .     . 010. . . .                    禁止写共享

. . . . . . . .     . 011. . . .                    禁止读共享

. . . . . . . .     . 100. . . .                    无禁止

. . . . . . . .     . 101. . . .                    未使用,0

. . . . . . . .     . 110. . . .                    未使用,0

. . . . . . . .     . 111. . . .                    未使用,0

. . . . . . . .     0. . . . . . .                  子进程继承了句柄

. . . . . . . .     1. . . . . . .                  句柄未被传送给子进程

. . . x x x x x . . . . . . . .                       未使用,0

. . 0. . . . .      . . . . . . . .                 使用Int 24h处理程序

. . 1. . . .        . . . . . . . .                 只返回出错

599页

              位设置

                                                  含义

FEDCBA98            76543210

. 0. . . . . . . . . . . . . .                可以缓冲写

.1. . . . . . . . . . . . . .                立即执行所有的写操作

.x. . . . . . . . . . . . . .                未使用,0

CX            文件属性(位图):

            位设置

                                              含义

FEDCBA98          76543210

. . . . . . . . . . . . . . . 0              读写

. . . . . . . . . . . . . . . 1               只读

. . . . . . . . . . . . . . 0.               可见的

. . . . . . . . . . . . . . 1.               隐藏

. . . . . . . . . . . . . 0. .                普通用户文件

. . . . . . . . . . . . . 1. .                系统文件

. . . . . . . . . . . . 0. . .                不是卷标

. . . . . . . . . . . . 1. . .                卷标

. . . . . . . . . . . x. . . .                未使用,0

. . . . . . . . . . 0. . . . .                未被修改

. . . . . . . . . . 1. . . . .                已被修改(档案)

x x x x x x x x x x . . . . . .               未使用,0

DX              动作标志(位图):

            位设置

                                            含义

FEDCBA98          76543210

. . . . . . . . . . . . 0000              如果文件存在则失败

. . . . . . . . . . . . 0001              如果文件存在则打开

. . . . . . . . . . . . 0010              如果文件存在则替换它

. . . . . . . . . . . . 0011              未使用,0

. . . . . . . . . . . . 01x x             未使用,0

. . . . . . . . . . . . 1x x x            未使用,0

. . . . . . . . 0000.. . .               如果文件不存在,则失败

. . . . . . . . 0001. . . .               如果文件不存在,则创建此文件

. . . . . . . . 001x. . . .               未使用,0

. . . . . . . . 01x x . . . .             未使用,0

. . . . . . . . 1x x x . . . .            未使用,0

x x x x x x x x . . . . . . . .           未使用,0

              DS:SI      指向用于文件的ASCIIZ路径名的指针

返回寄存器:进位标志清除表示成功

 

600页

                AX        文件句柄

                CX        动作标志

                          01,文件存在并且是打开的

                          02,文件不存在,是创建的文件

                          03,文件存在,但已被置换

                进位标志置位表示出错

                AX        出错代码

注释:该功能与它所结合的三种旧的句柄型文件打开/创建功能一样,也是通

过令DS:SI指向要打开或创建的文件的ASCIIZ路径名。令AL保存着所期

望的访问权限的位图;当调用创建功能创建出文件时,令CX保存着指定给该

文件的永久属性的位图,只有这样才能调用该功能。但是,与旧功能不相同的

是,这种功能还通过DX寄存器返回了一些其它方面的信息,以通知系统;当

文件存在时应做些什么以及当文件不存在时它又应该做些什么。该功能还允

许程序指定在文件出错时不使用Int 24h Critical Error(关键出错)处理程序,

并允许程序在处理所有出错时,不必修改对那些可能在同时运行的程序所执

行的DOS操作。

      往DOS中加进这一功能的目的是为了与OS/2兼容,这是根据实际操作

中的要求而加入的,并且,有必要把这一功能加进那些可能忽略DOS版本4

之前的所有程序中。

      如果指定路径中任何部分(文件名部分除外,该部分由入口处的DX的设

置控制)未找到,那么该功能就会失败。在网络上运行时,用户拥有的访问权限

至少必须符合调用该功能所规定的要求。

系统

Int 22h                                                   版本1

                  终止地址

这不是一种中断,而仅仅只是例程的地址,当执行程序终止时,控制权就被传

送到这个地址。

调用寄存器:不能应用

返回寄存器:不能应用

注释:在装载程序时,系统就会把这一内存位置中的内容复制到偏移值字节

0Ah处的程序段前缀(PSP)中。而当该程序终止时,系统又会把这个值恢复到

原来的位置上。由于该功能纯粹只是一存储区,因此,它永远都不可能被直接

执行。

601页

系统

Int 23h                                                         版本1

                    Ctrl-C中断处理程序

该中断处理程序是一种例行程序,当系统检测到Ctrl-C(或间接地为Ctrl-

Break)时,该程序就会接受控制权。

调用寄存器:不可用

返回寄存器:不可用

注释,在I/O操作期间,无论何时检测到Ctrl-C或在其它时间里,当BREAK

为打开的时候,系统都会进入中断向量中给定的地址。(Ctrl-Break服务)通常

强迫Ctrl-C进入DOS输入缓冲,因而,Ctrl-C也能到达这一例程,不过不是直

接到达而已。)当系统装载程序时,它就会把这一中断向量保存在字节0Eh处

的程序段前缀(PSP)中;而当程序终止时,系统又将该向量恢复到原来的状

    太

      Ctrl-Break或Ctrl-C是程序员们必须编写的两种最常用的特殊例程。复

杂的程序不可能主动把控制权移交给缺省处理程序。它们必须控制住任何中

断操作,以便允许在出现问题时,能进行适当的清理。(不老练的程序员编写的

远程通信程序尤其容易出现这类错误。)

      控制权的问题不能解决,就绝对不可能调用Int 23h来激活该处理程序。

因此,当系统处理Ctrl-C和Ctrl-Break字符时,该功能会迅速地进入显示操

作。

       Ctrl-C和Ctrl-Break处理程序有许多选项可供它们用来处理中断情况:

      ·处理程序可以设置一个局部标志,以便主程序在继续进行操作时能够

        查询这一标志。这样,程序就能直接采用一些受限制的行动,并从可以

        执行的中断(IRET)中返回,以便把控制权归还给DOS。此时,DOS将

        重新从头开始启动被中断的程序,并能按正常的方式来完成调用。这

        样的处理方式对应用程序来说是有益的,因为对应用程序来说,在处

        理中断时争取每个毫秒的时间都是很重要的。高速通信程序可以采用

        这种方式来编写。

      ·处理程序可以采取必要的行动来应付导致中断的情况,然后采用一个

        “远返回”(ret far)来把控制权返回给DOS。当系统允许应用程序继续

        操作时,必须设置进位标志来指示系统拒绝或清除该应用程序。

      ·处理程序可采取一切有必要的行动来直接恢复程序的操作,而不必把

        控制权返回给DOS。

      上述选项都是有效的,选择哪一个选项要根据实际情况而定。如果想尽量

减少在处理程序上所花费的时间,以使其符合常规处理的要求,那么就应选择

 

602页

    选项1。当有可能禁止某个进程时,则常常使用该选项来处理。而当没有什么

    好办法让初始操作继续进行时,就可用选项3来重定向操作,以使其能直接继

    续进行。这样做不会有什么坏处,相反,它是一种能让你在绝处逢生的聪明主

    意。

        一旦处在Ctrl-C/Ctrl-Break处理程序中,就能使用一切所需的DOS功能

    来处理实际情况。

系统

Int 24h                                                         版本1

                      关键出错处理程序

该中断是一种例行程序,当系统检测到关键出错时,它就会接收控制权。关键

出错通常表示某些类型的硬件失败,并且是在DOS范围内的驱动程序调用失

败后的结果。

调用寄存器: AH         出错信息

            AL        驱动器号

            DI          出错代码

            BP:SI  指向设备驱动程序头的指针

            STACK     设置如下:

高位地址      标志            初始调用者的标志寄存器

                  CS              初始调用者的CS寄存器

                  IP              初始调用者的IP寄存器

                  ES              初始调用者的ES寄存器

                  DS              初始调用者的DS寄存器

                  BP              初始调用者的BP寄存器

                  DI              初始调用者的DI寄存器

                  SI              初始调用者的SI寄存器

                  DX              初始调用者的DX寄存器

                  CX              初始调用者的CX寄存器

                  BX              初始调用者的BX寄存器

                  AX              初始调用者的AX寄存器

                  Flags            DOS的标志寄存器

                  CS               DOS的CX寄存器

    低位地址      IP               DOS的IP寄存器

返回寄存器:动作代码

注释:当系统装载程序时,程序向量中的内容就被装入起始于偏移值12h处

的程序段前缀(PSP)中。而当该程序终止时,系统终止处理程序又把该向量恢

 

 

复到原来的状态。切不可直接调用关键出错处理程序。

603页

      当DOS调用关键出错处理程序时,AH、AL和DI寄存器中便保存着该

    出错特征的有关信息。BP:SI指向设备驱动程序头。同时,关键出错处理程序

还必须保留寄存器SS、SP、DS、ES、BX、CX和DX。

      在调用关键出错处理程序之前,DOS典型地重试设备驱动程序调用(通

常重试三次,但在较高的DOS版本中,这个次数可以改变)。而当关键出错处

理程序被调用时,它必须保留上面已提到的这些必须的寄存器,然后才试图处

理已出现的错误。在关键出错处理程序中,只能调用DOS功能00h-0Ch(传统

    的字符I/O功能)、30h(获取DOS版本)和59h获取扩展出错信息)。其它的功

能调用则会破坏DOS内部堆栈,因此必须避免调用这些功能。

      如果错误为磁盘出错,则AH寄存器的位7清除,否则,位7置位。并且,

如果错误为磁盘出错,则AH寄存器中其余各位的用途将如表16.28中所示

    的一样。同时,AL则会保存着驱动器号(0=A,1=B等等)。

                    表16.28在磁盘出错时,AH寄存器的用途

    位                      含义

        7                 0,表示磁盘错误

        6                 保留

        5                 0=不允许忽略应答

                          1=允许忽略应答

        4                 0=不允许重试应答

                          1=允许重试应答

        3                 0=不允许功能调用失败应答

                          1=允许功能调用失败应答

        1-2                发生错误的磁盘区域

                          00=MS-DOS区域

                          01=文件分配表

                          10=根目录

                          11=文件区域

        0                 0=读

                          1=写

          如果错误为非磁盘错误,那么系统就会检查位于[BP:SI+4] 处的字节;

      如果位15为1,则出错由于字符设备调用引起,8字符的设备名放在[BP:SI

      +10] 开始的位置。

          通过DI的低位字节返回的出错代码与通过设备驱动程序的请求程序头

      所返回的出错代码是相同的(参见表16.29)。

                        表16.29出错代码(DI的低字节)

代码                                        含义

    00h                                 写保护出错

    01h                                 未知单元

604页

代码                                      含义

02h                                   驱动器未就绪

03h                                   未知命令

04h                                   数据出错(非法的CRC)

05h                                   错误的请求结构长度

06h                                   查找出错

07h                                   未知的介质类型

08h                                   扇区未找到

09h                                   打印机缺纸

0Ah                                   写故障

0Bh                                   读故障

0Ch                                   一般失败

0Fh                                   非法的磁盘改变

      当关键出错处理程序准备返回时,它必须按照表16.30的设置来在AL

寄存器中设置动作代码。

                        表16.30动作代码

    代码                      含义

      00h                       忽略

      01h                       重试操作

      02h                       终止程序

      03h                       使系统调用失败(版本3以及更高的版本)

          当该处理程序设置了动作代码后,被保存的寄存器就得到恢复,并且该程

      序也随后从中断中返回。

          关键出错处理程序能直接返回到用户程序上,但是,如果它这样做的话,

      那么在它被调用IRET之前,它将负责清除堆栈并且把除最后三个字处的其

      他所有字都移出堆栈。接着,当导致出错的I/O功能完成之后,控制权会直接

      返回到原来的状态。这就使得DOS处于一种“不稳定的”状态,直到实现了Int

      21h功能号在0Ch之上的功能时,DOS的状态才稳定下来。尤其是,当DOS

      CritErr标志继续保持置位时,这意味着还有可能导致DOS内部堆栈出现潜

      在的问题。而对于处理程序来说,克服问题的可能途径是设置CritErr标志的

      地址,并显式地清除它;具体细节可参照Int 21h,功能34h。对常规DOS操作

      进行这种修改只有在万不得已的情况才采用;在大多数情况下,Int 24h处理

      程序采用的最佳方式是通过DOS而不是直接返回。

          此外,还值得我们注意的是该处理程序的动作代码:据一些程序员反映,

      动作代码2在一些DOS版本中不起作用;具体是哪几个DOS版本还有待我

      们去弄清楚。因为许多人曾努力过,但至今仍未弄个水落石出。在版本4之前

      的所有版本中(包括本书的第一版本)对动作代码所作的介绍都是说终止是通

      过中断23h产生的;而在《IBM技术参考手册》第4版本中,中断23h变成了

605页

采用常规终止进程的中断22h。很明显,早期的版本成了印刷错误牺牲品的杰

出代表,因为从未有人调用过中断23h。

      DOS版本4加进了扩展文件打开功能,以便能够指定关键出错处理程序

不能用于某个文件。这就是说,当文件是打开的时候,如果在寄存器中设置了

适当的位,那么任何关键出错都能导致系统自动地返回出口代码了,而不在屏

幕上显示出任何提示。

磁盘

Int 25h                                                       版本1

                    绝对磁盘读

把数据从指定的磁盘扇区中读进目标内存区域。

调用寄存器: AL           驱动器号(0=A,1=B等等)

       CX          >0,要读取的扇区数

                           -1,使用扩展格式(版本4)

              DX          开始相对(逻辑)扇区号

              DS:BX    如果CX>0则为指向DTA的指针

                          如果CX=-1,则指针指向参数

返回寄存器:进位标志清除表示成功

              进位标志置位表示出错

              AL          出错代码

                          0207h,使用了错误的格式(仅用于版本4)

注释:该功能通过直接访问所期望的逻辑扇区来把磁盘扇区从磁盘中读进内

存。在处理这类访问时必须细心,因为它绕过了DOS的目录结构。

      逻辑扇区所在的位置是从磁道,磁头0处开始的。磁道上的第一个扇区就

是磁盘扇区0。其余的扇区依次到达下一个磁头,以及下一个磁道,如此类推。

逻辑扇区与按磁化方式保存在磁盘上的扇区号序列是相对应的,但有可能与

物理扇区号不对应。通过指定交叉因子,就能在磁盘上将逻辑扇区物理地进行

分隔开。通常情况下都是采用这种方法来提高磁盘的效率。

      当该功能返回时,如果进位标志置位,那么AX寄存器返回的每一个值都

具有不同的含义,详细情况可参见附表。其中,对AH和AL所返回的出错代

码解释如下(见表16.31)。

                  表16.31对Int 25h返回的出错代码的解释

代码                                            含义

AH寄存器出错代码

80h                                 应答连接失败

40h                                 查找操作失败

606页

代码                                          含义

20h                                   控制器失败

10h                                   数据出错(非法的CRC)

08h                                   DMA出错

04h                                   未找到要求的扇区

03h                                   写保护出错

02h                                   错误的地址标记

01h                                   错误的命令

AL寄存器的出错代码

00h                                   写保护出错

01h                                   未知单元

02h                                   驱动器未就绪

03h                                   未知命令

04h                                   数据出错(非法的CRC)

05h                                   错误的请求结构长度

06h                                   查找出错

07h                                   未知的介质类型

08h                                   扇区未找到

09h                                   打印机缺纸

0Ah                                   写操作出错

0Bh                                  读操作出错

0Ch                                   一般性的失败

          由于绝对磁盘读会破坏除段寄存器以外的所有寄存器,因此,在调用该功

      能之前应采取措施保存必需的值。

        该功能存在着一个很特殊的问题使得很难在高级语言中直接使用它。当

      该功能返回时,包含CPU标志的字(最初是由Int 25h将它压入堆栈的)仍然

      留在堆栈中。为了摆脱这个字并把堆栈恢复到期望状态,我们可以进行一次

      POPF,以便从堆栈中消除这个字的空间。或者可进行一次ADD SP,2,以增加

      堆栈的指针来维护堆栈。由于高级语言不直接为这类操作提供支持,因此,只

      能从汇编语言中调用该功能,以防止系统失败。(可以像Turbo Pascal那样直

      接嵌入汇编代码。)

          在DOS版本4中,逻辑扇区号的可能大小被扩展到了32位。为了能容纳

      更大的值,程序员们已创建出了可供中断25h使用的扩展格式;不过,必须在

      从大于32M的卷中进行读操作时才使用这种扩展格式,即使扇区号是采用

      16位的数字来表达的。

        把CX设置为FFFFh(-1)即表明在使用扩展格式。此时,DS:BX所指

      的地址为参数块的地址,而不是从中读出数据的缓冲区的地址。这种参数块的

      安排如下:

 

 

607页

偏移值              长度                说    明

00h                 双字                  逻辑扇区号,以0为基数

04h                 字                    要传送的扇区数

06h                 双字                  指向数据缓冲区的指针

磁盘

Int 26h                                                         版本1

                    绝对磁盘写

从目标传送区(DTA)中把数据写给指定的磁盘扇区。

调用寄存器: AL           驱动器号(0=A,1=B等等)

              CX           >0,要写入的扇区数

                          -1,使用扩展格式(版本4)

              DX          起始处相对(逻辑)扇区号

              DS:BX    如果CX>0则指针指向DTA

                          如果CX=-1,则指针指向参数

返回寄存器:进位标志清除表示成功

              进位标志置位表示出错

              AX          出错代码

                          0207h,使用了错误的格式(仅用于版本4)

注释:该功能通过直接访问期望的逻辑扇区来从内存中写出磁盘扇区。在处

理这类访问时必须小心,因为它绕开了DOS目录结构。

      逻辑扇区的位置是从磁盘0、磁头0处开始的。在磁道上的第一个扇区即

为磁盘扇区0,然后是下一个磁头,然后下一个磁道,并按顺序一直排列下去。

逻辑扇区与磁盘通过磁化方式而保存的扇区号顺序是相对应的,并且有可能

与物理扇区不对应。通过指定交错因子,就能在磁盘上将逻辑磁盘扇区硬性地

分隔开。有时就是采用这种方式来提高磁盘的利用率。

      当该功能返回时,如果进位标志依然置位,那么AX寄存器所返回的值就

像附表中所示的含义。其中,AH和AL寄存器返回的出错代码含义如下(见

16.32)。

                  表16.32对Int 26h返回的出错代码的含义

代码                                        含义

AH寄存器的出错代码

80h                                   应答连接失败

40h                                   查找操作失败

20h                                   控制程序失败

608页

代码                                      含义

10h                                   数据出错(非法的CRC

08h                                   DMA出错

04h                                   未找到请求的扇区

03h                                   写保护出错

02h                                   错误的地址标记

01h                                   错误的命令

AL寄存器的出错代码

00h                                   写保护出错

01h                                   未知单元

02h                                   驱动器未就绪

03h                                   未知命令

04h                                   数据出错(非法的CRC)

05h                                   错误的请求结构长度

06h                                   查找出错

07h                                   未知的介质类型

08h                                   扇区未找到

09h                                   打印机缺纸

0Ah                                   写操作出错

08h                                   读操作出错

0Ch                                   一般性的失败

        由于该功能本身存在的特殊问题使得很难直接从高级语言中使用该功

    能。当该功能返回时,保存着CPU标志的字(最初是由Int 26h压入堆栈的)仍

    然留在堆栈中。为了摆脱这个字,并将堆栈恢复到期望的状态,我们可以进行

    一次POPF,以便从堆栈中消除这个字的位置,或者可进行一次ADD SP,2以

    增加堆栈的指针来恢复堆栈平衡。由于高级语言不能直接为这类操作提供支

    持,因此,只能从汇编语言中调用该功能,以防止系统失败。(可以像Turbo

    Pascal那样直接嵌入汇编代码)。

        在DOS版本4中,逻辑扇区号的可能大小被扩展成了32位。为了能容纳

    更大的值,程序员们已经创建出了可供中断25h使用的扩展格式;不过,必须

    在从大于32M的卷中进行读操作时才使用这种扩展格式,即使扇区号是采用

    16位的数字来表达的。

        把CX设置为FFFFh(-1)即表明在使用扩展格式。此时,DS:BX所指

    的地址为参数块的地址,而不是从中读出数据的缓冲区的地址。这种参数块的

    安排如下:

 

609页

偏移值                长度                说    明

00h                 双字                逻辑扇区号,以0为基数

04h                 字                  要传送的扇区数

06h                 双字                指向数据缓冲区的指针

系统

Int 27h                                                       版本1

                    终止并驻留

    终止当前运行的程序,但保留它的内存区域。

    调用寄存器: DX         要保持长驻程序最后一个字节

                            偏移值加1(相对于(PSP)

                CS          PSP的段

    返回寄存器:无(无返回)

    注释:对所有使用PC机的人来说,终止并驻留(TSR)实用程序并不陌生。在

    那些经常使用SideKick或其它能创建多任务操作条件的实用程序的用户中,

    有谁没有遇到过真正的多任务操作?该中断不过是一种初始的(DOS版本1)

    TSR终止进程,它允许程序在接触到它所需要处理的任何中断后,仍然保留

    它的内存。

        在终止时,该进程首先将恢复Int 22h(终止地址)、Int 23h(Ctrl-C中断向

    量)和Int 24h(关键出错向量),然后把控制权传送到终止地址。它允许程序仍

    然保留着程序的内存区域(DX寄存器规定被保留区域的大小),以便TSR能

    继续保持活性。

        在使用这类终止时,应注意几个重要的限定条件。首先,必须把CS寄存

    器设置为程序的程序段前缀(PSP)中的段。一般来说,这算不上是什么问题,

    但是你必须做到万无一失。而最为重要的是,保留给TSR程序的内存最多只

    能有64K字节。在DOS版本2和版本3中,TSR终止时优先使用的是Int21h

    的功能31h,这种功能允许保留任何数量的内存,并且不要求设置CS寄存器

    应该在TSR中断处理程序中使用改进的功能31h,而Int 27h就只能用在

    DOS版本1.x系统上。

        与常规的终止行为不一样,该中断并不关闭任何可能是打开的文件。如果

    想关闭这些文件的话,那么必须在使用该中断之前将它们一一关闭。

系统

Int 28h                                                       版本1

(这一章大概是60%左右,剩下的待续吧)

原文地址:https://www.cnblogs.com/Chaobs/p/3838552.html