DOS程序员手册(十二)

DOS可安全使用

610页

在DOS控制台I/O操作进行轮询循环时,有规律地调用中断,以便允许终止

并驻留(TSR)程序(如适用于DOS的实用程序PRINT.COM),知道它可安全

地使用文件操作和其他功能号在0Ch之上的Int 21h功能。

调用寄存器:不能用

返回寄存器:不能用

    注释: DOS在进行控制台输入轮询循环时,在能安全地进行文件系统操作或

    执行大多数其他DOS功能(>0Ch)处才调用该中断。

        通常,用于中断28h的向量指向某个IRET指令,从而使得它成为一个空

    的处理程序承接体。所写入的任何处理程序必须连接到机内的下一个处理程

    序上,并允许初始的缺省IRET来负责返回到DOS。这样,当COMMAND.

    COM在命令行提示符下等待输入时,所有依赖于中断28h的进程都能获得安

    全运行机会。

        值得注意的是,在DOS版本2中,并非所有大于0Ch的DOS功能都能从

    该中断中安全地进行使用,原因是在使用内部堆栈时会发生冲突。至于具体到

    该问题是如何产生的,以及怎样来克服这类问题的详细情况可参见Int 21h,

    功能34h。

STOP

Int 29h                                                         版本2

                    快速地输出字符

DOS输出例程中断

调用寄存器:AL              要显示的字符

返回寄存器:不能应用

注释:如果输出将送往设备,并且该设备驱动程序的属性字已把位3设置成

1时,那么DOS输出例程就会调用该中断。

      所有ASCII字符在输出时就如同要进行提示一样,不作任何处理,不过,

回车、换行和报警字符除外,因为这些字符起着控制字符的作用。

      设计该中断的最初目的是为了供DOS设备驱动程序使用,并且没有任何

资料表明DOS版本2支持该功能。不仅如此,该中断作为供ANSI.SYS使用

的输出方法也是在较高的DOS版本中才出现的,因此,对该中断的支持目前

尚无任何改变。这样,任何把该中断放在应用程序中来使用的做法都是一种冒

险。

STOP

Int 2Ah                                                         版本3

                    Microsoft网络接口

611页

    该中断具有多种功能,能保证在网络系统上的多个用户之间不会出现相互干

    扰的情况。

    调用寄存器:不能应用

    返回寄存器:不能应用

    注释: DOS经常调用该中断以防止同一网络上的多个进程之间出现相互干

    扰。当网络不存在时,系统就会禁止调用该中断的例程,而一旦安装了网络,则

    系统就会自动地解除对该代码的禁令。并且调用该中断来控制对代码的关键

    区域的访问。不能在应用程序中使用该中断。因为在没有安装网络软件的情

    况下,该中断并不是DOS的一部分。本书的其他章节对该中断的行为已作了

    详细的介绍,这里就不再多讲,有疑问的读者可自行参阅有关章节的内容。

系统

Int 2Eh                                                         版本3

                      主外壳程序装入器

在主命令解释程序外壳下装入要执行的程序。

调用寄存器: DS:SI       指向已计数的、由CR终止的命令字符串,这个

                            字符串与中断21h、功能0Ah调用的字符串相

                            同

返回寄存器: Int 22h向量所指向的地址

注释:该功能允许访问主环境区域。这样便在EXEC功能(Int 21h,功能4Bh、

子功能00h)的基础上前进了一大步。

      唯一已知使用该功能而不是EXEC功能的原因是为了获得对系统主环

境区域的访问以便对它作出改变。使用该功能的程序不能在网络或多用户环

境中进行操作。

系统

Int 2Fh                                                         版本3

                    多路复用服务中断

到目前为止还只是部分地公开了多路复用服务;该服务的作用受输入的AH

寄存器的内容控制,可控制的范围为01至FFh。

注释:只有功能12h(DOS内部服务)出现在“核心的”DOS操作中;其他功能

则是随着相应程序的安装才能在这种服务中发挥各自的作用。例如,在没有安

装DOS打印假脱机(PRINT.COM)之前,功能01h就不起任何作用。

      DOS将该中断的功能00h至BFh留给它自己使用(余下部分中,C0h至

FFh已被公开,且可供用户使用。而这个分界线最初为80h而不是C0h,直到

 

612页

    DOS功能APPEND使用了功能B7h(版本3.3),才将这一分界线移到C0h。

    目前,至少第三方厂商的实用程序得搜索Int 2Fh链,以寻找可供使用的代

    码,并使用它能找到的第一个代码。

        为了保存指令的某些特征,DOS已正式把所有功能的子功能00h(AL的

    内容)保留起来,以用来进行“获取已安装状态”的操作,并返回这种状态,整个

    过程与功能01h的已公开部分相似;在返回时,AL若为00h,则表明尚未安装

    该功能,但装上即可,为01h则表明不仅未安装该功能而且还不能安装它;若

    为FF则表明该功能已经到位。由于附加了这种标准,从而使得该功能能够避

    免对同一常驻实用程序的多次安装。遗憾的是,并非所使用Int 2Fh的功能都

    遵循这一标准,似乎只有部分功能是这样做的。对于那些不按标准行事的功

    能、附录C"一种标准的TSR标识技术”中对它们作了详细的介绍。

系统

Int 2Fh           功能01h     子功能00h                     版本3

                  打印安装检查

通向DOS打印假脱机程序(PRINT.COM)中常驻部分的接口。

调用寄存器: AH            01h

                    AL              00h

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

                    AL                状态

                                      00h,未安装、但装上即可

                                      01h,未安装且不可安装

                                      FFh,已安装

注释:对于许多因过于忙碌而没有空停下来等待打印完毕的用户来说,假脱

机打印已变成了一种日常使用的操作方法。而该功能则允许程序访问假脱机

打印。其中,子功能00h帮助程序确定是否已安装了打印机假脱机。

系统

Int 2Fh             功能01h   子功能01h                     版本3

                    把文件保存到打印机假脱机程序中

    通往DOS打印假脱机程序(PRINT.COM)中常驻部分的接口。

    调用寄存器: AH          01h

                      AL              01h

                      DS:DX        指向包地址的指针

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

                      进位标志置位表示出错

                      AX              出错代码

 

613页

                              01h,功能无效

                              02h,文件未找到

                              03h,路径未找到

                              04h,打开文件太多

                              05h,访问被禁止

                              08h,打印队列已满

                              09h,假脱机忙碌

                              0Ch,文件名称太长

                              0Fh,驱动器无效

    注释:对于许多因过于忙碌而没有时间停下来等待打印完成的用户来说,假

    脱机打印已变成了一种日常使用的操作方法。该功能的作用就是允许程序访

    问打印假脱机程序。

        对于子功能01h,只需在第一个字节中优先提供一个5字节的包,以及一

    个指向要打印的ASCIIZ文件说明的指针,那么假脱机程序就会接管打印机

    工作并自动地打印文件(如果没有人为的阻止)。

系统

Int 2Fh           功能01h     子功能02h                     版本3

                  从打印队列中撤出文件

通往DOS打印假脱机程序(PRINT.COM)中常驻部分的接口。

调用寄存器: AH            01h

              AL         02h

              DS:DX    指向ASCIIZ文件说明

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

              进位标志置位表示出错

              AX          出错代码

                          01h,功能无效

                          02h,文件未找到

                          03h,路径未找到

                          04h,打开文件太多

                          05h,访问被禁止

                          08h,打印队列已满

                          09h,假脱机忙碌

                          0Ch,文件名称太长

                          0Fh,驱动器无效

注释:对于许多因过于忙碌而没有时间停下来等待打印完成的用户来说,假

脱机打印已变成了一种日常使用的操作方法。该功能的作用就是允许程序访

 

614页

问打印假脱机程序。

      子功能02h允许在文件说明中使用通配符(*和?),以便通过一次调用该

功能就能终止多个打印文件。

系统

Int 2Fh           功能01h     子功能03h                   版本3

                  取消打印队列中的全部文件

停下当前打印工作,并从打印队列中撤走全部文件。

调用寄存器: AH                01h

                AL            03h

返回寄存器:无

注释:由于该功能不清除正被打印文件的末页,因此,用户还需要调用程序来

进行换页。

系统

Int 2Fh             功能01h   子功能04h                     版本3

                    保持打印作业

通往DOS假脱机打印(PRINT.COM)常驻部分的接口。

调用寄存器: AH            01h

              AL         04h

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

              DX          计数错误

              DS:SI     指向打印队列的指针

              进位标志置位表示出错

              AX          出错代码

                          01h,功能无效

                          09h,假脱机程序忙碌

注释:对于那些因过于忙碌而没有时间停下来等待打印完成的用户来说,假

脱机打印已变成了一种很常用的操作方法。该功能允许程序访问打印假脱机

程序。

      子功能04h返回一个指向系列文件名项的指针,每个文件名项有64个字

节,并且保存着打印文件之一的文件说明(为ASCIIZ字符串)。系列文件名列

表中的第一项为程序正在打印的文件。最后一项的第一个字节中有一个NUL

字符(长度为0的文件名字符串)。该功能还把假脱机程序的行为保存在

HOLD状态中,这样,在调用者能够施加影响之前,不会有任何信息变成无用

信息。子功能05h则能解除HOLD状态。

615页

系统

Int 2Fh           功能01h     子功能05h                     版本3

                  终止打印保持

连接DOS假脱机打印程序(PRINT.COM)常驻部分的接口。

调用寄存器: AH              01h

                AL         05h

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

                进位标志置位表示出错

                AX          出错代码

                            01h,功能无效

                            09h,假脱机打印程序忙碌

注释:对许多因太忙碌而没有时间来等待打印完成的用户来说,假脱机打印

已成了一种经常使用的操作方法。该功能允许程序访问打印机假脱机程序。

      子功能05h能取消由子功能04h在使用过程中建立起来的HOLD状态;

在这两个调用的转换期间,所有假脱机打印行为都会停止。

系统

Int 2Fh           功能01h     子功能06h                     版本3

                  获取打印设备

返回用于当前打印设备头的地址。

调用寄存器: AH              01h

                AL         06h

返回寄存器:进位标志清除表明打印队列为空

                AX           0

                进位标志置位表明打印机队列不空

                DS:SI     指向设备头的指针

                AX         0008

注释:该功能的作用是用于确定打印队列是否为空。

系统

Int 2Fh             功能05h                                     版本3

                    获取外围关键出错处理程序的安装状态

通向外围关键出错处理程序的接口。

调用寄存器: AH              05h

              AL           00h

616页

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

              进位标志置位表示出错

              AL            状态

                            00h,未安装,装上即可

                            01h,未安装,但不能安装

                            FFh,已安装

注释:目前,对这种未公开功能的行为人们还不是十分清楚。但已清楚地了解

了的是,该功能允许直接与DOS关键出错处理程序例程序进行通信。

系统

Int 2Fh         功能06h                                         版本3

                获取ASSIGN.COM/ASSIGN.EXE的安装状态

检查并确定是否安装了ASSIGN.COM/ASSIGN.EXE。

调用寄存器: AH                06h

                AL          00h

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

                AL            状态

                              00h,未安装、但装上即可

                              01h,未安装且不可安装

                              FFh,已安装

注释:该功能是通向ASSIGN.EXE的接口,并且在没有安装ASSIGN时,该

功能不会起任何作用。

系统

Int 2Fh             功能08h                                   版本3

                    获取DRIVER.SYS的安装状态

检查是否安装了DRIVER.SYS

调用寄存器: AH              08h

                AL         00h

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

                AL          状态

                            00h,未安装、但装上即可

                            01h,未安装且不可安装

                            FFh,已安装

注释:该功能是通往DRIVER.SYS的接口,并且在没有安装这一文件时,该

功能就不会起任何作用。

617页

系统

Int 2Fh             功能10h                                 版本3

                    获取SHARE.EXE的安装状态

检查并确定是否安装了SHARE.EXE

调用寄存器: AH              10h

                AL        00h

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

                AL          状态

                            00h,未安装、但装上即可

                            01h,未安装且不可安装

                            FFh,已安装

注释:该功能是通往SHARE.EXE的接口,并且在没有安装这一文件时,该

功能就会无事可做。

系统

Int 2Fh             功能11h                                 版本3

                    获取网络重定向程序的安装状态

检查并确定是否安装好网络重定向程序接口。

调用寄存器: AH              11h

                AL        00h

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

                AL          状态

                            00h,未安装、但装上即可

                            01h,未安装且不可安装

                  FFh,已安装

注释:该功能是连接标准网络重定向程序例程的接口,并且在没有装Mi-

crosoft Networks或类似的完全兼容的程序时,该功能就无事可干。

STOP

Int 2Fh           功能12h     子功能00h                   版本3

                  获取DOS安装状态

检查并确定是否安装了DOS;其主要目的是为了与其它的Dos功能保持一

致。

调用寄存器: AH            12h

              AL        00h

 

618页

返回寄存器: AL            FFh(已安装了功能)

    注释:功能12h能访问DOS内部的某些服务器(在版本3中为00h-25h,在版

本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内核的

段才能调用其中的大多数服务器;“如果不遵从这些限制,那么就极有可能毁

坏数据”。不仅如此,而且它们提供的信息是很难通过其它方法来保存的,并且

对那些在操作过程中适度地保持着谨慎的用户来说,这些信息十分有用。

      子功能00h总是返回“已安装的”状态,因为该功能是通过硬件编码到

DOS内核中的。通过该功能进行“功能可用吗?”的检验是一种标准检验,并且

它似乎已与其它进行安装检查的DOS功能保持了一致性。

STOP

Int 2Fh         功能12h 子功能01h               版本3

                清除文件

访问DOS的内部服务程序以清空文件。

调用寄存器: AH              12h

              AL            01h

              BX            文件句柄

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

              进位标志置位表示出错

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内核

的段时,才能调用其中的大多数;“如果不遵从这一限制,那么就极有可能毁坏

数据”。不仅如此,而且这些程序提供的信息还很难通过其他方式来获取,这

样,只有保持适度的谨慎,这些信息才能为开发者们提供很大的帮助。

    子功能01h的作用是清除其句柄被传递它的文件。即子功能01h把为该

文件而积累的所有缓冲区全部写入磁盘。同时,该功能还要所有的段寄存器都

应指向DOS的内核区域。不过,对这一行为能否关闭文件目前尚不清楚。

STOP

Int 2Fh         功能12h 子功能02h               版本3

                获取中断向量地址

访问DOS的内部服务程序以获取中断向量。

调用寄存器: AH          12h

            AL          02h

            STACK       要获取的中断号

返回寄存器: ES:BX    指向中断向量的远指针

619页

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内核

的段时,才能调用这些服务程序中的大多数,“如果不遵守这个限制,那么就极

有可能毁坏数据”。不仅如此,这些程序所提供的信息还很难通过其它的途径

来获取,这样,只要适当地加以小心,这些信息就能为你提供很大的帮助。

      子功能02h可直接访问由中断21h,功能25h和35h使用的内部例程,以

定址中断向量表。不过,首先必须把所期望的中断向量号传递给子功能02h,

并且保存在堆栈顶部的字的低位字节中。该功能通过ES和BX返回一个指向

中断向量自身(而不是中断服务例程)的远指针。

STOP

Int 2Fh           功能12h     子功能03h                     版本3

                  获取DOS数据段

    访问DOS的内部服务程序以返回DOS内核的数据段值。

    调用寄存器: AH            12h

                AL           03h

    返回寄存器: DS            DOS内核段地址

    注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

    版本4中为00h-2Fh)。注意,必须把所有的段寄存器都设置为指向DOS内核

    的段才能调用其中的大部分程序;如果不遵循这一限制条件,那么就极有可能

    毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获取,并

    且,只要加以适当的小心,这些信息便能为你所用。

        子功能03h能获取DOS内核的段地址,接着,可用这一地址来使其它的

    段寄存器指向DOS的内核区域。由于这种调用会破坏寄存器DS,因此,在调

    用该功能之前,调用者应首先保存好DS的值,以便在调用完后能恢复DS的

    值。

STOP

Int 2Fh           功能12h     子功能04h                     版本3

                  规范化路径分隔符

访问DOS的内部服务程序,以便规范化路径定界符

调用寄存器: AH              12h

              AL           04h

              STACK         要处理的分隔符(在低位字节中)

返回寄存器: AL              5Ch(ASCII“\”)

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

 

620页

    版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内核

    的段才能调用其中的大部分程序;“如果没有遵循这一限定条件,那么就极有

    可能毁坏数据”。不仅如此,这些程序提供的信息还很难通过其它的途径来获

    取,并且,只要适当地加以小心,这些信息便能为开发者们提供帮助。

      子功能04h能把路径分界符(/)转换成标准的DOS分界符(\),或者反过

    来转换。

STOP

Int 2Fh           功能12h     子功能05h                   版本3

                  输出一个字符

访问DOS内部的服务程序以便能通过Int 29h输出一个字符

调用寄存器: AH            12h

                  AL              05h

                  STACK           要输出的字符(在低位字节中)

返回寄存器:无

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内核

的段才能调用其中的大部分程序;“如果不遵循这一限定条件,那么就极有可

能毁坏数据”。不仅如此,这些程序提供的信息还很难通过其它的途径来获取,

当然,只要开发者们适当地加以小心,这些信息便能为他们提供帮助。

      子功能05h使用中断29h来把它在堆栈顶部所找到的字符送往CRT。这

是一种冗余的功能,专供那些已经使用Int 29h的程序员使用,并增加了他们

的内务操作。

STOP

Int 2Fh          功能12h     子功能06h                     版本3

                  调用关键错误

访问DOS的内部服务程序,以调用关键出错处理程序,就好像它遇上了关键

性的错误。

调用寄存器: AH            12h

              AL          06h

返回寄存器: AL           动作代码(参见中断24h)

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内核

的段才能调用其中的大部分程序;如果不遵循这一限制条件,那么就极有可能

毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获取。当

然,只要开发者们适当地加以小心,这些信息便能为他们提供很大的帮助。

621页

      子功能06h总是先调用关键出错处理程序,就好像它已检测到了某种错

    误,然后才返回它的动作代码。

STOP

Int 2Fh           功能12h     子功能07h                   版本3

                  移动磁盘缓冲区

在DOS版本3中,该功能可访问DOS内部的服务程序以移动磁盘缓冲区。

调用寄存器: AH            12h

                    AL             07h

返回寄存器: DS:DI      指向磁盘缓冲区的指针

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置成了指向DOS内

核的段时,才能调用其中的大部分程序;如果不遵循这一限制条件,那么就极

有可能毁坏数据。不仅如此,这些程序提供的信息还很难通过其它方式来获

取。当然,只要适当地加以小心,这些信息就能为开发者们提供较大的帮助。

      子功能07h控制着通过CONFIG.SYS中的BUFFER=而设置的DOS

内部磁盘缓冲区。除非你确信对缓冲区算法的了解比本书的作者更深入一些,

否则,最好不要使用该功能;因为文件分配表通过常驻留在这些缓冲区内,稍

有不慎就有可能毁掉硬盘中的所有数据。

STOP

Int 2Fh           功能12h     子功能08h                   版本3

                  减少用户计数

访问DOS的内部服务程序以减少设置在设备控制块中的用户计数。

调用寄存器: AH            12h

              AL         08h

返回寄存器: AX           新的用户计数

注释:子功能08h能减少设置在DOS内部设备控制块中的用户计数。通过

ES:DI设置为指向合适的DCB(因为用户计数是DCB中的第一个字,DI会

自动地指向这个字)就能调用子功能08h,然后,该功能就会通过AX返回被

减少后的DCB用户计数,也就是新的用户计数。一般情况下,该例程是作为处

理关闭的句柄功能的一部分来调用的,但是,通过让ES:DI指向RAM中的

某些其它字,就能使用该功能来减少ES:DI所指的字。该功能对段寄存器的

设置不作要求。

622页

STOP

Int 2Fh           功能12h     子功能0Ch                   版本3

                  供DOS使用的IOCTL打开功能

访问DOS的内部服务程序以便能使用IOCTL例程打开文件或设备。

调用寄存器: AH          12h

                  AL             0Ch

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

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有在把所有的段寄存器都设置成指向DOS内

核的段时,才能调用其中的大部分程序;如果不遵循这一限定条件,那么就极

有可能毁坏寄存器中的数据。不仅如此,这些程序提供的信息还很难通过其它

的途径来获取,但只要适当地加以小心,这些信息便能为开发者们提供帮助。

    子功能0Ch使用IOCTL调用中的Open子功能来打开先前由DOS内部

指针激活的文件或设备。这一子功能只能由DOS或那些控制着所有DOS内

务表和标志的程序来使用。

STOP

Int 2Fh           功能12h     子功能0Dh                   版本3

                  获取文件关闭的日期和时间

访问DOS的内部服务程序以获得作为文件日期和时间标记的系统日期和时

间。

调用寄存器: AH            12h

                  AL                0Dh

返回寄存器:       AX               采用压缩(文件)格式的系统日期

                  DX                采用压缩(文件)格式的系统时间

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置成指向DOS内核

的段时,才能调用其中的大部分程序;如果没有满足这个限定条件,那么就极

有可能毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获

取,但只要适当地加以小心,这些信息便能为开发者们提供帮助。

      在关闭已修改过的文件时,DOS可使用子功能0Dh来获取采用文件目录

格式的系统日期和时间。该功能要求所有的段寄存器指针都必须指向DOS内

核。

623页

STOP

Int 2Fh           功能12h     子功能0Eh                         版本3

                  搜索缓冲区链

仅仅在版本3中访问DOS的内部服务程序,以便搜索某条缓冲区链。

调用寄存器: AH              12h

                AL         0Eh

返回寄存器:未知

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置成指向DOS内核

的段时,才能调用其中的大部分程序;如果没有满足这个限定条件,那么就极

有可能毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获

取,但只要适当地加以小心,这些信息便能为开发者们所利用。

      该子功能的用途目前尚不太清楚。它似乎是用来搜索DOS内部使用的磁

盘缓冲区,并且要小心地处理。具体细节可参见子功能07h的注释部分。

STOP

Int 2Fh           功能12h     子功能10h                         版本3

                  寻找已修改的缓冲(用于版本3)、时间延迟(版本4)

    访问DOS的内部服务程序以查找已被修改的磁盘缓冲区(在DOS版本3中)

    或执行时间延迟(在DOS版本4中)。

    调用寄存器: AH            12h

                AL            10h

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

    注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

    版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置成指向DOS内核

    的段时,才能调用其中的大部分程序;如果未能满足这一限定条件,则极有可

    能毁坏数据。不仅如此,这些服务程序提供的信息还很难通过其它的方式来获

    取,因此,只有适当地加以小心,才能使用这些信息。

        在版本3中,子功能10h的作用是定位“占用的”缓冲区(已被修改且需要

    将其写出磁盘的缓冲区)。在版本4中,由于采用了全部重写缓冲区方案,子功

    能10h也就因此变得过时了,并且将它划归时间延迟例程使用,以提供一种无

    害的无操作(no-op)行为。切不可在DOS之外使用这一子功能。

STOP

Int 2Fh           功能12h     子功能11h                       版本3

                  标准化ASCIIZ文件名

624页

访问DOS的内部服务程序以实现路径名的标准化转换。

调用寄存器: AH          12h

                  AL              11h

                  DS:SI         指向要对其进行标准化的文件名

                  ES:DI         指向接收输出的缓冲区的指针

返回寄存器: ES:DI 未改变,指向被标准化的文件名,其中所有的字

                      母都变成大写,并且所有/字符被改变为字符

注释:子功能11h能把文件名或路径名格式转换成可供其它DOS功能使用

的标准格式。其中,所有的小写字母被转换成了大写字母,并且所有的向前斜

线被转换成向后的斜线。该功能的输入和输出都是ASCIIZ字符串,并且该功

能对寄存器的设置不作要求。

STOP

Int 2Fh         功能12h   子功能12h                 版本3

                确定ASCIIZ字符串的长度

访问DOS的内部服务程序以确定ES:SI所指的ASCIIZ字符串的长度。

调用寄存器: AH          12h

                  AL              12h

                  ES:SI        指向ASCIIZ字符串的长度

返回寄存器: CX           按字节计算的字符串长度

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内核

的段,才能调用其中的许多程序;如果未能满足这个限定条件,则极有可能毁

坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获取,因此,

只有适当地加以小心,才能充分地利用这些信息。

      子功能12h计数由ES:DI所指的ASCIIZ字符串的字节数,然后通过

cx寄存器返回这个计数(不包括终止ASCIIZ字符串的NUL字符)。该功能要

求SS寄存器必须指向DOS内核区域。

STOP

Int 2Fh         功能12h   子功能13h                   版本3

                大小写和国家转换

访问DOS的内部服务程序以便对ASCII字符进行大小写转换(以及在有必要

时进行国家转换)。

调用寄存器: AH          12h

                  AL              13h

625页

                STACK         要转换的字符

返回寄存器: AL               字符的大写(以及转换后的)型式

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内核

的段时,才能调用其中的许多程序;如果未能满足这一限定条件,那么就极有

可能毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获

取,只有适当地加以小心,才能在上述限定条件下得以使用这些信息。

      子功能13h获取堆栈顶部的字,将它的低位字节转换成大写体,并且,如

果有必要进行国家转换的话,则将它从扩展的ASCIIZ字符集转换成普通的

ASCII码。结果通过AX返回。该功能要求SS寄存器必须指向DOS内核代

码,以便能定位国家转换表和转换标志;鉴于这一缘故,该功能在大多数情况

下是不起作用的。

STOP

Int 2Fh           功能12h     子功能14h                   版本3

                  比较32位的数值

访问DOS的内部服务程序以比较两个32位值(典型地为指针)。

调用寄存器: AH              12h

              AL            14h

              DS:SI       第一个指针

              ES:DI       第二个指针

返回寄存器:零标志置位表明两个指针相等,零标志清除表示不相等

注释:子功能14h可用来比较任意两个32位的数值,具体办法是将它们分别

装入适当的寄存器来进行比较。 DOS将这一功能当作通用的指针对比功能来

使用。该功能对寄存器的设置不作要求。

STOP

Int 2Fh           功能12h     子功能16h                   版本3

                  获取DCB地址

访问DOS的内部服务程序以获取某个特定句柄的设备控制块地址。

调用寄存器: AH            12h

              AL          16h

              BX          文件句柄

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

              ES:DI     指向与文件句柄相对应的DCB

              进位标志置位表示出错

626页

                AX            出错代码

    注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,

    在版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内

    核的段时,才能调用其中的许多程序;如果未能满足这一限定条件,那么就极

    有可能毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获

    取,只有小心地按上述要求去做才能利用这些信息。

        子功能16h可直接访问任何文件或设备句柄正在使用的设备控制块。但

    是,该功能要求所有的段寄存器都必须指向DOS内核,由于这一限定条件,该

    功能主要供DOS使用。

STOP

Int 2Fh           功能12h     子功能17h                     版本3

                  获取LDT地址

访问DOS的内部服务程序以返回逻辑驱动器表的地址

调用寄存器: AH              12h

              AL           17h

              Stack         字,驱动器代码(0=A,1=B,等等)

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

              DS:SI      指向用于特定驱动器的逻辑驱动器表(DOS内

                            部指针也被设置)

              进位标志置位表示出错

              AX            出错代码

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,必须把所有的段寄存器都设置为指向DOS内核

的段时,才能调用其中的部分程序;如果未能满足这一限定条件,那么就极有

可能毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获

取,这样,只有满足上述条件,开发者们才能充分地利用这些信息。

      由于子功能17h要求所有的段寄存器指针都必须指向DOS内核代码,因

此,这一子功能主要用于DOS中。该功能能够设置当前驱动器指针,并返回用

于指定驱动器的逻辑驱动器表(LDT)的地址。

STOP

Int 2Fh             功能12h     子功能18h                       版本3

                    获取用户堆栈地址

访问DOS的内部服务程序以获取用户的堆栈地址。

627页

调用寄存器: AH                12h

                AL            18h

返回寄存器: DS:SI          指向DOS堆栈区域,在这一区域里,所输入的

                              寄存器都被保存在其内,并指向中断21h

    注释:子功能18h从一个特定的位置中装载DS和SI,这个位置就是DOS在

进入Int 21h时把所有输入的寄存器压入堆栈后,再保存SS和SP的位置。这

    一子功能允许程序直接控制由中断21h返回的值(除非后跟的代码再次改变

    了这个值)。它被限定只能在DOS内使用,并且对段寄存器的设置不作要求。

STOP

Int 2Fh           功能12h   子功能19h                   版本3

                  设置LDT指针

访问DOS的内部服务程序以设置逻辑驱动器表指针。

调用寄存器: AH            12h

              AL         19h

返回寄存器:无

注释:功能12h允许访问DOS内部的某些服务程序(在版本3中为00h-25h,

在版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内

核的段时,才能调用其中的部分程序;如果未能满足这一限定条件,那么就极

有可能毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获

取,因此,只有适当地加以小心,开发者们才能在上述限定条件下得以利用这

些信息。

      子功能19h使用DOS内部数据来设置LDT指针,以指向特定的驱动器。

该功能要求所有的段寄存器指针必须指向DOS内核代码,并且在DOS之外

不能使用它。

STOP

Int 2Fh           功能12h     子功能1Ah                     版本3

                  从路径名中获取驱动器代码

访问DOS的内部服务程序以便从特定的路径名中分析出驱动器代码。

调用寄存器: AH            12h

            AL            1Ah

            DS:SI      指向ASCIIZ路径名

返回寄存器: AL           驱动器代码(0=缺省,1=A,如此等等)

            DS:SI      如果驱动器存在则移动到该驱动器说明的前

                          面;否则不动

 

628页

注释:子功能1Ah确定是否已将某个驱动器指定为传送给它的路径名的一

部分,并且,如果是这样的话,则把该驱动器字母转换成数字值,并将SI移动

到该驱动器说明的前面。这一功能对段寄存器不作要求。

STOP

Int 2Fh           功能12h     子功能1Bh                   版本3

                  调整闰年

访问DOS的内部服务程序,以便能根据所指定的年份是否为闰年来设置2月

份的天数。

调用寄存器: AH            12h

              AL          1Bh

              CX          年份(完整值,如1989)

返回寄存器: AL           如果闰年为29,否则为28

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内核

的段时,才能调用其中的许多程序;如果未能满足这一限定条件,那么就极有

可能毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的方式来获

取,因此,只有适当地加以小心,开发者们才能在上述限定条件下得以使用这

些信息。

      子功能1Bh要求所有的段寄存器指针都必须指向DOS内核,因此它只能

限定在DOS内使用。该功能通过检验CL中的值来确定某个年份是否为闰

年,如果是,它就会相应地修改DOS内每月的天数表。在任一操作中,指定年

份的2月天数都通过AL返回。该功能只是DOS时间/日期进程的一部分。

STOP

Int 2Fh             功能12h   子功能1Ch                     版本3

                    计数从月头开始的天数

访问DOS的内部服务程序,以返回从月头开始算起所经过的天数。

调用寄存器: AH            12h

              AL          1Ch

              CX          当前月份

              DX          以前年份的总天数(如果这一天是在所期望的

                          年份里,则天数为0)。

              DS:SI     指向每月中的天数表

返回寄存器: DX           从当前月分月头算的总天数

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

629页

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内核

的段之后,才能调用其中的大多数程序;如果未能满足这一限定条件,那么就

极有可能毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来

获取,因此,只有适当地加以小心,才能在上述限定条件下得以使用这些信息。

    功能1Ch要求所有的段寄存器都必须指向DOS内核,这就限制它只能用

于DOS内。它能计算出从DOS"零天”(1980年、1月、1日)至现在所经过的天

数,或计算出从当前年的年头(如果DX=0)到当前月的月头之间的天数。该

功能是DOS时间/日期处理的一部分。

STOP

Int 2Fh           功能12h     子功能1Dh                   版本3

                  计算日期

访问DOS的内部服务程序,以便在给出经过的天数时能计算出那一天是当年

的几月几日。

调用寄存器: AH            12h

                    AL                1Dh

                    CX              00h

                    DX                当年的总天数计数

                    DS:SI          指向每月中天数的表

    返回寄存器:     CX               月份

                    DX                日期

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内核

的段时,才能调用其中的部分程序;如果未能满足这一限定条件,那么就极有

可能毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获

取,因此,只有适当地加以小心,开发者们才能在上述限定条件下得以使用这

些信息。

      子功能1Dh要求所有的寄存器都必须指向DOS内核,这也决定了它只

能用于DOS内。它能通过接收当年里的总天数计数来计算出当前的月份和日

期值。该功能是DOS时间/日期进程中的一部分。

      该功能与功能12h,子功能1Ch的作用是相反的。它要求通过DX所输入

的天数必须小于367,但在输入不符合要求的值时,它也不会报告任何错误。

如果DX超出了这个范围,则结果是不可预知的,究其原因是由于这种功能本

来就不是供普通用户使用的,这样,也就没有为它设计错误检测功能。

630页

STOP

Int 2Fh             功能12h     子功能1Eh                       版本3

                    比较字符串

访问DOS的内部服务程序,以便能返回对两个ASCIIZ字符串进行比较的结

果。

调用寄存器: AH              12h

              AL            1Eh

              DS:SI       指向一个字符串

              ES:DI       指向另一个字符串

返回寄存器:零标志置位表明两个字符串完全匹配;零标志清除则表明是两

              个不同的字符串

注释:子功能1Eh能对两个ASCIIZ字符串进行一般性的检验,以比较它们

是否相等。它对段寄存器不作任何要求。但是,如果两个字符串不相同,它所

返回的信息为零标志清除而不是两个字符串不同。尤其是它并不告诉这两个

字符串之间的不同之处在哪里,或者它们的属性是否相同。

STOP

Int 2Fh             功能12h     子功能1Fh                       版本3

                    初始化LDT

访问DOS的内部服务程序,以便为指定的驱动器设置逻辑驱动器表。

调用寄存器: AH                12h

                AL            1Fh

                STACK       采用ASCII的驱动器字母

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

                进位标志置位表示出错

                AX            出错代码

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内核

的段时,才能调用其中的许多程序;如果未能满足这一限定条件,那么就极有

可能毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获

取,因此,只有适当地加以小心,开发者们才能在上述限定条件下得以使用这

些信息。

      子功能1Fh要求所有的段寄存器都必须指向DOS内核,这也是限制它只

能用于DOS内的主要原因。该功能是为SUBST功能—一种允许把子目录

标识为单独的逻辑驱动器的功能中的一部分来使用的。由于它会修改DOS指

631页

针,因此,在使用该功能之前,必须仔细地了解这一子功能。

STOP

Int 2Fh         功能12h   子功能20h               版本3

                获取DCB号

访问DOS的内部服务程序,以返回某个指定文件句柄的驱动器控制块号(不

是地址)。

调用寄存器: AH            12h

              AL          20h

              BX          文件句柄

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

              ES:DI       指向用于当前进程的句柄表中特定字节(该句

                            柄的DCB号的地址)的指针

              进位标志置位表示出错

              AX            出错代码

注释:子功能20h只要求ss寄存器必须指向DOS内核,以便能定位用于当

前进程的句柄表。而对其他的寄存器则不作要求。在成功地返回时,ES:DI指

向当前进程句柄表中的特定字节,该字节中保存着指定句柄的DCB号。然后,

子功能16h便能使用这个DCB号来定位DCB。

    通过把ss:sp设置成指向某个闲置驱动器的逻辑驱动器表中的偏移值

40h,便能迫使ss寄存器指向DOS内核。有关定位LDT的具体细节可参见附

录D“保留的DOS功能”。

STOP

Int 2Fh         功能12h   子功能21h                 版本3

                扩展ASCIIZ路径名

访问DOS的内部服务程序以便把部分路径名扩展成完整的路径名。

调用寄存器: AH      12h

                  AL          21h

                  DS:SI    指向用于扩展的路径名

            ES:DI   指向65个字节的缓冲区以接收扩展后的字符串

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

            ES:DI  未改变,指向扩展后的字符串

            进位标志置位表示出错

            AX        出错代码

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

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

 

632页

版本4中为00h-2Fh)。注意,必须把所有的段寄存器都设置为指向DOS内核

的段时,才能调用其中的许多程序;如果未能满足这一限定条件,那么就极有

可能毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获

取,因此,只有适当地加以小心,开发者们才能在上述限定条件下得以使用这

些信息。

      子功能12h所访问的例程与中断21h中未公开的功能60h所使用的例程

是相同的。该功能要求SS寄存器必须指向DOS内核,以便能够访问在扩展过

程中所使用的各种内部表。扩展后的字符串中包括驱动器字母和完整的路径

名(如果输入字符串引用了替代(SUBSTed)驱动器,则在输出的扩展字符串

中,物理驱动器字母将替换掉这个由SUBST所替换的驱动器)。

STOP

Int 2Fh             功能12h     子功能22h                       版本3

                    转换扩展出错代码

    访问DOS的内部服务程序,以确定用于某个错误的扩展出错代码。

    调用寄存器: AH          12h

                AL          22h

    返回寄存器:无

    注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

    版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内核

    的段时,才能调用其中的许多程序;如果未能满足这一限定条件,则就极有可

    能毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获取,

    因此,只有适当地加以小心,开发者们才能在上述限定条件下得以使用这些信

    息。

        子功能22h在DOS中起着十分重要的作用。它使用DOS内部表把一种

    出错情况转换成特定的扩展出错代码、分类代码、动作代码和出错场所;然后

    再将这些值放入DOS内部的存储位置,以便供Int 21h、功能59h能从中获取

    这些值。这一子功能不能用于其它程序中。

STOP

Int 2Fh             功能12h   子功能24h                     版本3

                    执行延迟

访问DOS的内部服务程序,以便能根据DOS的内部值来执行可变长度的延

迟。

调用寄存器:AH               12h

              AL            24h

返回寄存器:无

633页

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内核

的段时,才能调用其中的许多程序;如果未能满足这一限定条件,则就极有可

能毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获取,

因此,只有适当地加以小心,开发者们才能在上述限定条件下得以使用这些信

息。

      子功能24h能使用保存在DOS内核中的延迟值来执行延迟循环。该功能

要求所有的段寄存器都必须指向DOS内核,并因此决定了它只能用于DOS

内。

STOP

Int 2Fh           功能12h     子功能25h                   版本3

                  获取ASCIIZ字符串的长度

访问DOS的内部服务程序以确定DS:SI所指向的ASCIIZ字符串的长度。

调用寄存器: AH            12h

            AL            25h

            DS:SI      指向ASCIIZ字符串

返回寄存器:按字节计算的字符串长度

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内核

的段时,才能调用其中的许多程序;如果未能满足这一限定条件,那么就极有

可能毁坏寄存器的数据。不仅如此,这些程序提供的信息还很难通过其它的途

径来获取,这就决定了开发者们必须小心从事才能充分地利用好这些信息。

    子功能25h计数由DS:SI所指向的ASCIIZ字符串中的字节数,然后通

过CX寄存器返回这个计数。该功能要求SS寄存器必须指向DOS内核区域。

STOP

Int 2Fh             功能12h   子功能26h                     版本4

                    打开文件

访问DOS的内部服务程序以便能通过Int 21h,功能3Dh打开文件。

调用寄存器: AH            12h

              AL          26h

              CL          访问模式(与用Int 21h,功能3Dh中

                          的AL是一样的)

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

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

              AX          句柄

 

634页

                进位标志置位表示出错

                AX          出错代码

                            01h,无效功能

                            02h,文件未找到

                            03h,路径未找到

                            04h,无可用的句柄

                            05h,访问被禁止

                            0Ch,非法的访问代码

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh),注意,只有把所有的段寄存器都设置为指向DOS内核

的段时,才能调用其中的许多程序;如果未能满足这一限定条件,那么就极有

可能毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获

取,这便决定了开发者们必须小心从事才能充分地利用好这些信息。

      子功能26h能把CL传送到AL中,并接着执行与中断21h,功能3Dh(打

    开文件)使用的相同的例程。该功能要求所有的段寄存器都必须指向DOS内

核,因而,在大多数情况下,它只能用于DOS中。

STOP

Int 2Fh           功能12h     子功能27h                   版本4

                  关闭文件

访问DOS的内部服务程序以便通过Int 21h,功能3Eh来关闭文件。

调用寄存器: AH            12h

              AL          27h

              BX          文件句柄

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

              进位标志置位表示出错

              AX          出错代码

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内核

的段时,才能调用其中的许多程序;如果未能满足这一限定条件,则极有可能

毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获取,这

便决定了开发者们只有小心从事才能充分地利用好此信息。

      子功能27h执行与Int 21h,功能3Eh(关闭文件)使用相同的例程。它要

求所有的段寄存器都必须指向DOS内核,因此,在大多数情况下,它只能用于

DOS。

635页

STOP

Int 2Fh         功能12h   子功能28h                 版本4

                定位文件指针

访问DOS的内部服务程序,以便通过Int 21h,功能42h来定位文件指针。

调用寄存器: AH        12h

                  AL              28h

                  BX              文件句柄

                  CX              偏移值中的高位部分

                  DX              偏移值中的低位部分

              BP          用于Int 21h、功能42h的AX的常规值

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

              DX:AX     新的文件指针位置

              进位标志置位表示出错

              AX          出错代码

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

                          06h,无效句柄

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内核

的段时,才能调用其中的许多程序;如果未能满足这一限定条件,则极有可能

毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获取,这

样便决定了开发者们只有小心从事,才能充分地利用这些信息。

      子功能28h先把BP传送到AX中,并接着执行与Int 21h、功能42h(移动

文件指针)使用的相同的例程。它要求所有的段寄存器都必须指向DOS内核,

因此,在大多数情况下,该功能只对DOS有用。

STOP

Int 2Fh         功能12h   子功能29h                 版本4

                读取文件

访问DOS的内部服务程序,以便通过Int 21h,功能3Fh来读取文件。

调用寄存器: AH        12h

                  AL              29h

                  BX              文件句柄

                  CX              字节数

                  DS:DX        指向缓冲区的指针

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

 

636页

                AX          已读取的字节数

                进位标志置位表示出错

                AX          出错代码

                            05h,访问被禁止

                            06h,无效句柄

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00-25h,

在版本4中为00-2Fh)。注意,只有把所有的段寄存器都设置为指向DOS内

核的段时,才能调用这些程序中的许多程序;如果未能满足这一限定条件,则

极有可能毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来

获取,由此便决定了开发者们必须小心从事才有可能利用这些信息。

      子功能29h执行Int 21h、功能3Fh(读取文件或设备)所使用的程序相

同的例程。它要求所有的段寄存器都必须指向DOS内核。由于这一限定条件

使得在大多数情况下,该功能只能供DOS使用。

STOP

Int 2Fh             功能12h     子功能2Bh                    版本4

                    IOCTL接口

    访问DOS的内部服务程序,以通过接口连接上Int 21h、功能44h的IOCTL

    服务程序。

    调用寄存器: AH            12h

                AL            2Bh

                BX            句柄(子功能代码00h、01h、02h、03h、

                             06h、07h和0Ah)

                BL            驱动器代码:0=缺省,1=A如此等等(子功能

                              代码04h、05h、08h和09h)

                BP            用IOCTL功能的常规AX值

                DS:DX       指向缓冲区的指针(子功能代码02h-05h)

                DX            设备信息(子功能代码01h)

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

                AX            已传送的字节数(子功能代码02-05h)

                AL            状态(子功能代码06h-07h)

                              00h,未准备好

                              FFh,已就绪

                  AX          值(子功能代码08h)

                              00h,可移动的

                              01h,固定的

                DX            设备信息(子功能代码00h)

 

637页

                进位标志置位表示出错

                AX            出错代码

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

                              04h,无可用的句柄

                              05h,访问被禁止

                              06h,无效句柄

                             0Dh,无效数据

                              0Fh,无效驱动器

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置成指向DOS内核

的段时,才能调用其中的许多程序;如果未能满足这一限定条件,则极有可能

毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获取,这

便决定了开发者们只有谨慎行事才能充分地利用这些信息。

      子功能2Bh先把BP传送到AX中,然后就能执行与Int 21h,功能44h

(IOCTL)所使用的程序相同的例行程序。它要求所有的段寄存器都必须指向

DOS内核。鉴于这一要求,便决定了在大多数情况下,该功能只能用于DOS

中。

STOP

Int 2Fh           功能12h     子功能2Dh                     版本4

                  获取扩展出错代码

访问DOS的内部服务程序,以获取扩展的出错代码信息。

调用寄存器: AH           12h

              AL          2Dh

返回寄存器: AX           出错代码

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置成了指向DOS内

核的段时,才能调用其中的许多程序;如果未能满足这一限定条件,则极有可

能毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的途径来获取,

因此,便决定了开发者们只有小心从事,才能充分地利用这些信息。

      子功能2Dh可通过AX返回扩展出错代码的当前值(这个值也可以通过

Int 21h,功能59h来返回)。该功能要求SS和DS寄存器都必须指向DOS内

核。

638页

STOP

Int 2Fh             功能12h   子功能2Fh                     版本3

                    保存DX

访问DOS的内部服务程序,以便把DX的值保存在DOS内核中。

调用寄存器: AH              12h

                AL          2Fh

                DX          要设置的新值

返回寄存器:无

注释:功能12h可访问DOS内部的某些服务程序(在版本3中为00h-25h,在

版本4中为00h-2Fh)。注意,只有把所有的段寄存器都设置成指向DOS内核

的段时,才能调用这些服务程序中的一部分程序;如果未能满足这一限定条

件,则极有可能毁坏数据。不仅如此,这些程序提供的信息还很难通过其它的

途径来获取,这样便决定了开发者们只有小心从事才能利用这些信息。

      子功能2Fh可把DX寄存器的值保存到DOS内部字中,其作用目前尚不

清楚。不过,在执行该功能时应保持高度的小心。因为它要求所有的段寄存器

都必须指向DOS内核。

STOP

Int 2Fh             功能14h   子功能00h                     版本3

                    获取NLSFUNC安装状态

作为访问NLSFUNC.COM的接口,并且在没有安装该程序时,它不会去做任

何事情。

调用寄存器: AH         14h

                    AL            00h

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

                    AL              状态

                          00h,未安装,装上即可

                          01h,未安装,且不能安装

                          FFh,已安装

注释:功能14h,子功能00h可用来作为访问NLSFUNC.COM的接口。至于

该功能的其它子功能,到目前为止尚未弄清它们的用途。

STOP

Int 2Fh             功能15h                                 版本3

                    CDROM接口

639页

作为访问CDROM例程的接口,并且在没有装入这一程序时,该功能无事可

干。

调用寄存器: AX            1500h,获取被安装的状态

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

              AL          状态

                          00h,未安装,装上即可

                          01h,未安装,且不能安装

                          FFh,已安装

注释:用于CD-ROM接口例程,尤其是那些由Microsoft在CD-ROM扩展版

本中提供的接口例程。本书的其它章节已详细地介绍了这些服务程序,这里就

不再描述。

系统

Int 2Fh             功能16h   子功能80h                     版本5

                    MS-DOS空闲调用

通知系统,调用程序正处于空闲状态。

调用寄存器: AH            16h

              AL          80h

返回寄存器:无

注释:当程序是空闲的时候,如当它们在等待用户输入时,它们就必须使用该

中断。不过,在这样做之前,调用程序应确保Int 2Fh向量不为零。

      该中断是不阻塞的;如果系统确实没有其它程序可运行,则这一中断会立

即返回,并且调用程序也会因此而继续运行。

系统

Int 2Fh           功能1Ah     子功能00h                     版本4

                  获取ANSI.SYS的安装状态

返回ANSI.SYS的安装状态。

调用寄存器: AH              1Ah

                AL        00h

返回寄存器: AL              FFh,已安装ANSI.SYS

                            00h,尚未安装ANSI.SYS

注释:该功能可用来确定是否已安装了ANSI.SYS。ANSI.SYS程序可提供

ANSI屏幕处理代码的子集。在使用这种代码之前,程序必须调用该功能以确

定系统是否会支持这些代码。

 

640页

系统

Int 2Fh           功能43h   子功能00h                   版本5

                  获取XMS驱动程序的安装状态

返回XMS驱动程序的安装状态。

调用寄存器: AH              43h

              AL            00h

返回寄存器: AL              80h,已安装XMS驱动程序

                            00h,未安装XMS驱动程序

注释:在调用功能4310来检验XMS驱动程序是否存在时,必须先调用该功

能。

系统

Int 2Fh             功能43h   子功能10h                     版本5

                    获取XMS驱动程序入口点的地址

返回XMS驱动程序功能调用的地址

调用寄存器: AH                43h

                AL            10h

返回寄存器: ES:BX         指向该功能的指针

注释:只有在调用功能43h,子功能00h检验到已安装了XMS驱动程序之

后,才能调用该功能。

      如果MSDOS正管理着XMS驱动程序的HMA和UMB区域的话,那么

程序就不能再去管理这些区域。

系统

Int 2Fh             功能48h     子功能00h                       版本5

                    获取DOSKEY.COM安装状态

返回DOSKEY.COM的安装状态。

调用寄存器: AH                48h

                AL          00h

返回寄存器: AL               非零值,表明已安装DOSKEY.COM

                              00h,未装入DOSKEY.COM

注释:该功能用于确定是否安装了DOSKEY.COM—一种增强的命令行

解释程序。

641页

系统

Int 2Fh           功能48h   子功能10h                   版本5

                  读取命令行

读共有126个字符的命令行,并将它拷贝给指定的缓冲区。

调用寄存器: AH            48h

                  AL              10h

                  DS:DX        指向缓冲区的指针

                                  字节0,最大的缓冲区大小

                                  字节1,被返回的命令行长度

                                  字节2,输入命令行的第一个字节

返回寄存器: AX                    0表示成功

注释:在该调用期间,系统将启用DOSKEY宏命令和功能键。如果输入宏命

令,则AX将为0,但是必须再发出第二次调用来扩展这个宏命令。

      被返回的命令行末尾出现一个回车符(0Dh),但该返回行的长度中并不

包括这个回车符。

    程序将所敲入的命令行加进了DOSKEY历史记录。

系统

Int 2Fh           功能4Bh     子功能01h                 版本5

                  建立通报链

创建一个由通报功能处理程序链接而成的列表。

调用寄存器: AH            4Bh

                    AL              01h

                    ES:BX          0

                    CX:DX        服务功能处理程序地址

返回寄存器: ES:BX      0,无通报链

                          非为SWCALLBACKINFO结构的地址,

                          其格式如下:

                          双字通报链中下一个SWCALLBACKINFO

                                结构的地址

                          双字通报处理程序的地址

                          双字保留

                          双字SWAPINFO结构的地址

注释:客户程序必须把这一调用作为它对Int 2Fh处理的一部分来处理以支

持任务切换API。如果没有处理这一调用,则客户程序必须跳转到以前曾安装

 

642页

    的Int 2Fh处理程序上。

        如果客户程序选择处理这一调用,那么它首先必须调用以前装入的Int

    2Fh处理程序。在返回时,它还必须填充它自己的SWCALLBACKINFO结

    构,把下一个SWCALLBACKINFO结构的地址设置为前一个Int 2Fh处理程

    序返回的ES:BX值,并把ES:BX设置为指向它自己的SWCALLBACKIN-

    FO结构的地址。因此,最后装入的客户程序必定是通报链上的第一个程序。

系统

Int 2Fh             功能4Bh   子功能02h                     版本5

                    检测切换程序

检测是否有任何切换程序

调用寄存器: AH              4Bh

              AL            02h

              BX            0

              DI            0

              ES:BX        0

返回寄存器: ES:BX         0表示未安装任务切换程序,如果已安装任务

                            切换程序,则为服务功能程序处理程序的地址

注释:需要防止和控制因任务切换而导致中断的程序必须在初始化期间调用

该功能。

系统

Int 2Fh           功能4Bh    子功能03h                   版本5

                  分配切换程序的ID

返回独一无二的切换程序标识符。

调用寄存器: AH              4Bh

                AL         03h

                BX          0

                ES:DI    服务功能处理程序

返回寄存器: BX              00,可能未分配标识符

                            01h-0Fh,标识符

注释:该功能只能由任务切换程序调用,而不能由客户程序调用。

      任务切换程序应首先调用功能4Bh,子功能02h来确定它是否为装入的

第一个程序。如果是,它就必须处理本应由其它任务切换程序处理的这一调

用。否则,它就必须调用该功能并获取一个切换程序ID。如果它这样做失败

了,那么它只能退出系统或禁止它自己。

      任务切换程序总是把它的切换ID作为它创建的会晤期标识符的四个高

643页

位字节来使用。因此,可确保两个会晤期标识符不会相同。

      在检查和改变分配给它的切换标识符的记录时,任何切换程序必须禁止

中断。而在其余的任何时间里,任务切换程序都允许中断并允许调用任意的

MS-DOS功能。它可以修改AX和BX寄存器,但也必须保留其余的寄存器。

系统

Int 2Fh           功能4Bh     子功能04h                   版本5

                  释放切换程序ID

释放由功能4Bh,子功能03h分配的切换程序标识符

调用寄存器: AH              4Bh

                AL         04h

                BX          标识符

返回寄存器: BX             0,已释放了有效标识符

                            非零,无效标识符

注释:当任务切换程序退出时,它必须调用该功能以释放它的标识符。

系统

Int 2Fh           功能4Bh    子功能05h                   版本5

                  标识实例数据

标识由客户程序维持的实例数据。

调用寄存器: AH              4Bh

              AL            05h

              ES:BX        0

              CX:DX       服务功能处理程序

返回寄存器: ES:BX       0,没有实例数据链

                            非零,SWSTARTUPINFO结构的地址:

                              字版本

                            双字前一个处理程序的SWSTARTUPINFO

                                  结构地址

                            双字被忽略

                            双字被忽略

                            双字SWINSTANCEITEM结构地址

注释:客户程序必须把这一调用作为它对Int 2Fh处理的一部分来处理,以

支持任务切换API。如果没有处理这一调用,那么该客户程序必须跳转到以前

安装的Int 2Fh处理程序上。

      如果客户程序选择了处理这一调用,那么它首先必须调用以前装入的Int

2F处理程序。在返回时,它必须填充它自己的SWSTARTUPINFO结构。把

 

644页

前一个处理程序的SWSTARTUPINFO结构的地址设置为以前装入的Int

2Fh处理程序返回的ES:BX值,并且把ES:BX设置为指向它自己的SW-

STARTUPINFO结构的地址。由此可知,最近装入的客户程序必定是链中的

第一个结构。

系统

Int 2Fh             功能ADh   子功能80h                   版本3.3

                    获取KEYB.COM的版本号

返回KEYB.COM的版本号。

调用寄存器: AH              ADh

              AL            80h

返回寄存器: BH             主版本号

              BL            次版本号

注释:如果未装入KEYB.COM,则返回的版本为0。

系统

Int 2Fh           功能ADh     子功能81h                   版本3.3

                  设置KEYB.COM的活动代码页

设置用于KEYB.COM的活动代码页

调用寄存器: AH              ADh

              AL            81h

              BX            代码页标识符

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

              进位标志置位表示出错

              AX      0001

注释:该功能可用来为键盘驱动程序选择代码页。

系统

Int 2Fh             功能ADh     子功能82h                   版本3.3

                    设置KEYB.COM国家标志

设置KEYB.COM国家标志

调用寄存器: AH                ADh

                AL            82h

                BX            国家标志

                              00h,本国(美国)

                              FFh,外国

645页

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

              进位标志置位表示出错

注释:该功能可用来选择美国或非美国的国家标志。

系统

Int 2Fh           功能ADh     子功能83h           版本3.3

                  获取KEYB.COM国家标志

获取KEYB.COM国家标志

调用寄存器: AH            ADh

              AL          83h

返回寄存器: BL         国家标志

注释:该功能可用来获取国家标志。值00h表示本国(美国),值FFh表示外

国。

系统

Int 2Fh          功能B0h     子功能00h                   版本3.3

                  获取GRAFTABL.COM的安装状态

返回GRAFTABL.COM的安装状态。

调用寄存器: AH            B0h

              AL        00h

返回寄存器:               FFh,已安装了GRAFTBL.COM

                          00h,未安装GRAFTBL.COM

注释:该功能可确定是否安装了GRAFTABL。在图形模式中的80h-FFh范

围内,GRAFTABL允许MS-DOS显示字符。

系统

Int 2Fh           功能B7h     子功能00h                 版本3.3

                  检查APPEND的安装情况

返回一个值,表明在DOS层上是否安装了APPEND。

调用寄存器:AH               B7h

              AL          00h

返回寄存器: AH             如果已安装APPEND则为非0

注释:该功能通过检查AH中的返回值来确定是否安装了APPEND。在DOS

层上是通过APPEND命令来安装APPEND的。在过去的几年里,由于在联网

操作上几乎没有什么标准可言,因此,不是所有的网络都可直接响应这一中

断。

 

646页

系统

Int 2Fh             功能B7h   子功能02h                     版本4

                    获取APPEND版本号

确定安装的是哪一个APPEND版本。

调用寄存器: AH            B7h

                  AL               02h

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

                  AX                如果安装的是APPEND版本4,则为FFFFh;

                                    任何其他值都表明所安装的APPEND不是

                                    MS-DOS版本4

                  进位标志置位表示出错

                  AX                出错代码

注释:该功能可用来确定加给APPEND版本4的所有功能是否可用。任何其

它的版本存在,则子功能00h会返回installed(已安装);该功能则只检查所安

装的版本是不是版本4。

系统

Int 2Fh             功能B7h     子功能04h                     版本4

                    获取APPEND路径指针

如果已安装APPEND,则返回一个指向当前活动的APPEND路径的指针。

调用寄存器: AH            B7h

              AL         04h

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

              ES:DI     指向活动的APPEND路径的指针

              进位标志置位表示出错

              AX          出错码

注释:该功能用于确定活动的APPEND路径的地址。

系统

Int 2Fh             功能B7h     子功能06h                       版本4

                    获取APPEND功能状态

返回当前使用的APPEND功能的位图(如果已安装APPEND)。

调用寄存器: AH              B7h

                AL         06h

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

647页

    BX          APPEND状态(位图)

          位设置        含义

      FEDCBA98            76543210

      . . . . . . . .     . . . . . . . 0       禁止APPEND

      . . . . . . . .     . . . . . . . 1       允许APPEND

      . . . x x x x x x x x x x x x .           未使用(0)

      . . 0. . . . .      . . . . . . . .       /PATH不活动

      . . 1. . . . .      . . . . . . . .       /PATH活动

      .0.. . . . .      . . . . . . . .       /E开关不活动

      .1.. . . . .      . . . . . . . .       /E开关活动

      0.. . . . . .      . . . . . . . .       /x开关不活动

      1. . . . . . .      . . . . . . . .         /x开关活动

                  进位标志置位表示出错

                  AX          出错代码

    注释:该功能可用来读取APPEND功能的当前状态。有关各种转换的细节,

    可参见介绍APPEND的DOS版本4文件。

系统

Int 2Fh           功能B7h     子功能07h                     版本4

                  设置APPEND功能状态

使用位图代码来改变APPEND功能的状态。

调用寄存器: AH              B7h

              AL           07h

              BX             APPEND状态(位图)

          位设置          含义

    FEDCBA98            76543210

    . . . . . . . . . . . . . . . 0      禁止APPEND

    . . . . . . . . . . . . . . . 1       允许APPEND

    . . . x x x x x x x x x x x x .       未使用(0)

    .. 0. . . . . . . . . . . . .        不活动的/PATH

    . . 1. . . . . . . . . . . . .        活动的/PATH

    .0.. . . . . . . . . . . . .        不活动的/E开关

    .1.. . . . . . . . . . . . .        活动的/E开关

    0.. . . . . . . . . . . . . .        不活动的/x开关

    1.. . . . . . . . . . . . . .        活动的/x开关

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

648页

                  进位标志置位表示出错

                  AX            出错代码

      注释:该功能通过把一个描述期望状态的位图传送给APPEND功能,来设置

      APPEND功能的状态。关于各种转换的详细细节,可参见介绍APPEND的

      DOS版本4文件。

系统

Int 2Fh           功能B7h     子功能11h                     版本4

                  设置返回所发现的名称状态

仅仅为了下一次DOS访问而修改APPEND的动作。

调用寄存器: AH            B7h

              AL          11h

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

              进位标志置位表示出错

              AX          出错代码

注释:该功能可用来激发APPEND去修改中断21h,功能3Dh、43h和6Ch

的动作。在执行该功能时,下一个发往上述几种功能之一的调用都会在把文件

名传送给该功能的同一位置上返回一个完整合格的文件名。在这一过程中,必

须确保有足够大的缓冲区(67个字节)以接收任何可能的返回值。

      一旦返回了已被完全扩展后的文件名,系统就会清除由该功能设置的进

位标志,并且中断21h的操作也同时会返回到正常状态。这样,每次使用这种

APPEND子功能都只影响某一个中断21h功能的使用。

 

第17章鼠标参考手册
鼠标功能有它自己独特的操作方式,这就是:通过一种已安装的驱动程序(MOUSE.
SYS或MOUSE.COM)把它自身和访问这些功能的Int 33h联结在一起来进行操作。随
着鼠标的移动,驱动程序也会不断地改变鼠标光标在屏幕上的位置。而对于程序来说,没
有必要采取任何措施以维持这种驱动程序的动作。
程序可在任意时间里询问鼠标驱动程序,以掌握鼠标的当前状态。
目前市场上存在着几种不同的鼠标驱动程序版本;其中,Microsoft正在悄无声息地
为更新这些版本而努力着。由于Microsoft提供的鼠标驱动程序总是能够符合工业标准的
要求,因此,本章将着重介绍Microsoft的版本8.x驱动程序,同时还介绍一些较旧的驱动
程序和其它鼠标生产厂家设计的鼠标驱动程序所忽略的功能(尤其是那功能号大于18h
的功能)。而对于DOS版本1,由于它不允许使用可安装的设备驱动程序,因此在大多数
情况下还把该功能当作TSR来使用,而不管是作为驱动程序(.SYS文件)还是作为TSR
.COM文件)来安装,该功能的作用都是相同的。许多鼠标用户甚至在所有的DOS版本
上都采用TSR版本。
如果想编写鼠标程序的话,本章的末尾还介绍了一些EGA寄存器接口功能,这些功
能将有助于实现读者的编程目的。
此外,若对本章是如何介绍这些功能有疑问的话,还可以参照本书前面“参考手册概
述这一章的内容。
                        17.1鼠标功能
鼠标
Int 33h           功能00h                               版本2
                  初始化鼠标
确定是否安装了鼠标,重新设置鼠标驱动程序,并返回鼠标上的按钮数目。
调用寄存器: AX            0000h
返回寄存器: AX           0,未安装鼠标
                          -1,已安装鼠标
              BX          按钮数(2用于Microsoft,3用于其它公司)
 
650页
注释:当希望在其中使用鼠标的程序启动时,该程序必须验证鼠标是否存在。
常用的检验方法是调用功能00h。该功能可把鼠标复位到屏幕的中央,并可确
保该鼠标是关闭的并且还设置缺省鼠标光标和缺省移动系数。
      在DOS版本2.x中,最好的检验方式是在使用该功能之前检验中断33h
中指向代码中断向量。如果向量的四个字节不全为00,那么就可安全地使用
功能00h来确定驱动程序是否存在。
      下面的列表显示了使用该功能来建立鼠标驱动程序的初始状况:
      显示页:      页0
      光标范围:  整个屏幕(x=0至639,y=0至199)
      排斥区域:  无
      光标位置:  位于屏幕中央(x=320,y=100)
      光标状态:    隐藏
      光标形状:  对于图形模式是箭头
                  对于文本模式是反向块
      用户中断:  被禁止
      光笔仿真器:允许
      米基/象素比:水平方向=8比8
      速度阀值:  每秒64个米基(米基是鼠标移动单位。一个米基约等于
                 1/1200英寸)
鼠标
Int 33h           功能01h                                 版本2
                  显示鼠标光标
导致鼠标光标出现在显示屏幕上。
调用寄存器: AX            0001h
返回寄存器:无
注释:一打开鼠标光标,就意味着允许它出现在屏幕上,这并非是一种绝对的
功能,相反,它增加了一个内部鼠标光标标志。最初,这种标志被设置为-1。因
此,无论何时,只要这个标志变为0,屏幕上就会显示出一个鼠标光标。而如果
该标志的初始值为0,则功能02h减少一个光标标志,并导致鼠标光标消失在
屏幕。因此,若出现对功能02h的多个调用,就要求应多次调用本功能。不过,
软件会阻止光标标志的值出现大于0的情况。
鼠标
Int 33h           功能02h                                 版本2
                  隐藏鼠标光标
关掉鼠标光标的显示。
651页
调用寄存器: AX            0002h
返回寄存器:无
注释:该功能只关闭显示而不禁止驱动程序。如同功能01h的注释部分所介
绍的一样,功能02h也只是减少一个光标标志。如果光标标志的值不为0,则
光标被关闭。由于光标标志的值永远都不可能大于0,因此,只需调用该功能
一次,即可保证能隐藏鼠标光标。
鼠标
Int 33h          功能03h                                   版本2
                  获取鼠标位置
返回当前的鼠标位置和按钮状态。
调用寄存器: AX              0003h
返回寄存器: BX             按钮状态
                CX          X坐标(水平方向)
                DX          Y坐标(垂直方向)
注释:该功能能告诉鼠标所在的位置。无论屏幕是在哪种模式下,功能03h都
是返回一介于0-639之间的x坐标(列)和一个介于0-199之间的y坐标
(行)。表17.1采用屏幕(象素)坐标的方式显示出了各种显示模式所允许的鼠
标光标位置。
                          表17.1 鼠标光标的位置
屏幕模式                  目标坐标
00h,01h                      x=16*列
                              y=8*行
    02h,03h                  x=8*列
                              y=8*行
    04h,05h                   x=2*屏幕x
                              y=屏幕Y
      06h                      x=屏幕x
                              y= 屏幕Y
      07h                     X=8*屏幕列
                              y=8*屏幕行
    0Eh-10h                  x=屏幕x
                              y=屏幕Y
      鼠标按钮的状态是通过BX返回的;其中,只有低顺序的位才有意义。表
17.2阐明了各个位的含义。由于每个按钮的动作都是独立的,因此,对于两个
按钮的鼠标来说,状态值可以是0-3中的任何一个,而对于三个按钮的版本
 
652页
来说,状态值可以是表中0-7之间的任何一个。
                        表17.2目标按钮状态位
            位
                                  含义
    76543210
    . . . . . . . 0             左按钮向上
    . . . . . . . 1             左按钮向下
    . . . . . . 0.             右按钮向上
    . . . . . . 1.              右按钮向下
    . . . . . 0. .              中央按钮(如果有)向上
    . . . . . 1. .              中央按钮(如果有)向下
    x x x x x . . .             未定义
鼠标
Int 33h             功能04h                                 版本2
                    设置鼠标位置
设置鼠标在屏幕上的位置
调用寄存器: AX              0004h
              CX            新的X坐标(水平方向)
              DX            新的Y坐标(垂直方向)
返回寄存器:无
注释:可使用该功能把鼠标光标设置在屏幕上的任意位置处。(鼠标驱动程序
将从这个位置中恢复操作)例如,当在屏幕上取出某个菜单时,如果想从该菜
单的第一项开始鼠标操作,那么就可使用该功能来设置鼠标的位置。
    如果X、Y坐标都没有按照功能03h所定义的那样与当前显示模式相匹
配,那么该功能就会把坐标值调整为一个最为近似的值。如果指定的位置超出
了通过调用功能07h和08h所建立的显示范围,那么光标还在限定的范围之
内时,该功能会尽量地把光标安置在指定位置的附近。而如果光标位置位于功
能10h所定义的排斥区域内,那么光标会消失不见。
鼠标
Int 33h             功能05h                                   版本2
      获取按钮按压信息
返回按钮按压的有关信息。
调用寄存器: AX                0005h
                BX            按钮
653页
                              0,左
                                1,右
                                2,中央(如果有)
返回寄存器: AX                 按钮状态(参见表17.2)
                BX              按钮按下的次数(在每次调用时都会复位到0)
                CX              在最后一次按压按钮时,光标的水平位置
                DX              在最后一次按压按钮时,光标的垂直位置。
注释:功能05h能提供最近一次调用该功能以来,在指定光标按钮上所发生
的一切。从中,可以得知自从调用该功能后这一指定按钮是否被按压过,如果
按压过,那么按压的数又是多少,以及在最近一次按压该按钮时,鼠标所在的
位置。
      按钮状态是通过寄存器AX返回的。这里的状态与功能03h通过BX返
回的状态(参见表17.2)是相同的。
鼠标
Int 33h             功能06h                                   版本2
                    获取按钮松开信息
返回按钮松开的有关信息
调用寄存器: AX              0006h
              BX            按钮
                            0,左
                            1,右
                            2,中央(如果有)
返回寄存器: AX             按钮状态(参见表17.2)
              BX            自最近一次调用该功能以来松开按钮的次数
              CX            在最后一次松开按钮时,光标的横向位置
              DX            在最后一次松开按钮时,光标的纵向位置
注释:功能06h返回鼠标按钮的松开信息。(功能05h返回按压的有关信息)
按钮松开(允许按钮走动)是针对按压(按住该按钮)而言的。并且,在使用功能
06h的05h时,还能辨别出按钮是压下的还是松开的。用于功能06h的寄存器
保存着松开操作的有关信息。
鼠标
Int 33h           功能07h                                 版本2
                  设置鼠标X界限
设置鼠标在屏幕上移动的x界限
654页
调用寄存器: AX            0007h
              CX          最小的x界限
              DX          最大的x界限
返回寄存器:无
注释:当想限定鼠标光标在x(水平)方向上的移动范围时,可调用功能07h。
因此,当有意识地要把鼠标光标限制在屏幕上的某个指定区域(例如,菜单)内
时,该功能便能帮助实现这个目的。功能08h(Y界限)也能用来限制鼠标光标
的移动范围。
      在初始化鼠标驱动程序时系统便设置出了鼠标的X界限,即最小为0,最
大为639。传给该功能的值必须在0-639之间。如果CX的值大于DX的值。
系统就会交换这两值。而在执完该功能之后,鼠标光标的位置如果超出了这个
界限,那么它会自动地退回到限定位置上。
鼠标
Int 33h             功能08h                                     版本2
                    设置鼠标Y界限
设置鼠标在屏幕上移动的Y界限
调用寄存器: AX            0008h
              CX          最小的Y界限
              DX          最大的Y界限
返回寄存器:无
注释:当想限定鼠标光标在Y(垂直)方向上的移动范围时,可调用功能08h。
这样当有意识地要把鼠标光标限制在屏幕上的某个指定区域(例如,菜单)内
时,该功能便可实现这一目的。功能07h(x界限)也可用来限制鼠标光标的移
动范围。
      在初始化鼠标驱动程序时,系统便设置出了鼠标的Y界限,即最小为0,
最大为199。如果CX的值大于DX的值,系统就会交换这两个值。而在执行完
该功能之后,如果鼠标光标的位置超出了0-199这个界限,那么它会自动地
退回到限定位置上。
鼠标
Int 33h             功能09h                           版本2
                    设置图形光标形状
设置在图形模式中使用的光标形状
调用寄存器: AX              0009h
655页
                BX            热点x位置(-16至6)
                CX            热点y位置(-16至16)
                ES:DX        指向屏幕和光标的指针
返回寄存器:无
注释:在图形模式中,光标是由一种屏幕屏蔽、一种光标以及热点共同定义
的。功能09h则能用来指定它们的全部内容。
      这样一种概念是鼠标驱动程序中最容易令人弄混的概念之一,它要求我
们应作出仔细的检查。为了形成一个总体上的检查框架,应记住永远要按照以
下的方式来把可见的鼠标光标定义给软件,这就是将它限定在16个象素乘以
16个象素区域的范围内,热点是一个象素,位于这个16*16 正方形平面的左
上角,是正式的光标位置。在这个正方形内,可见指针的形状是由屏幕和光标
屏蔽共同建立的。
      当在图形模式下产生鼠标光标时,先将屏幕屏蔽与屏蔽内容相“与”
(AND),然后再将光标屏蔽与结果相“异或”(XOR)。当将两个字节进行“与”
(AND)操作时,结果字节中各位的形成是这样的:两个字节中相同位都为1
时,结果字节中对应位的值就是1;两个字节中的相同位中,只要有一个为0,
则结果字节中对应位的值即为0。两个字节“异或”(XOR)时,只有两个字节
的相同位中只有一个1时,结果位为1;其它情况下为0。
      例如:如果屏幕屏蔽为9Ch,给定字节为3Bh,那么将它们“与”(AND)起
来的结果如下:
      9Ch               10011100
      AND3Bh           00111011
                        00011000
    如果光标屏蔽为9Ch,且字节为3Bh,则将它们“异或”(XOR)起来的结
果如下:
9Ch              10011100
XOR3Bh           00111011
                  101000111
对于图形模式1到6,这些操作所得到的每一个位的实际结果如下:
656页
而对于图形模式7以及更高的模式来说。其结果则是这样的:
    保存在ES:DX所指的位置上的屏蔽是一个由16位字组成的位图块。该
位图中的每个字都与光标的16行中的一个行相对应(最上面的一行为第一个
屏幕屏蔽)。字0至15为屏幕屏蔽;字26到31为光标屏蔽。图17.1显示了
字节是怎样同光标位置一一对应的。
                  图17.1与光标位置相对应的字节
在图形模式4-6和14-16中,即使光标大小不同,每个光标象素中也都含有
两个位。
    屏幕屏蔽暂时性地擦除了位于光标区域后面的所有内容;这样,光标屏蔽
就能在余下的空间里描绘出指针形状。这使得鼠标指针的出现,覆盖了屏幕上
的数据。通过给定几个屏蔽集,并使用该功能来在它们之间进行切换,那么,就
能在程序的不同部分使用不同的指针形状。
    把热点设置为0,0便能导致映象的左上角成为正式的鼠标位置(缺省箭
头映象的顶部);若把热点设置为8,8就会使得位映象区域的中央成为正式
的鼠标位置;若为16,16便把正式位置移至该区域的右下角。由于-16,-16
也是有效的热点设置,因此,设置为-16,-16甚至能把正式的鼠标位置移出
实际映象之外,不过,目前还很难找出什么好的理由要这样做。
657页
鼠标
Int 33h             功能0Ah                                     版本2
                    设置文本光标类型
设置文本模式的光标。
调用寄存器: AX                000Ah
                BX             0,选择属性光标
                             1,选择硬件光标
                CX            如果BX=0,为屏幕屏蔽(AND值)
                              如果BX=1,为起始扫描行
                DX            如果BX=0,为光标屏蔽(XOR值)
                              如果BX=1,则为终止扫描行
返回寄存器:无
注释:在文本模式中,根据BX设置值的不同,光标可为属性光标或硬件光
标。若为属性光标则CX和DX寄存器就分别为屏幕和光标屏蔽,它们将按照
图形模式屏蔽在象素上的操作方式来处理CRT属性字符字节对其中屏幕屏
蔽可保留大多数初始字符的属性,而光标屏蔽则确定要改变哪些属性。为了保
留那些未变的字符,应把屏幕屏蔽的低位字节设置为FFh,并且把光标屏蔽的
低位字节设置为00h。
      位于鼠标光标位置上的属性字节和字符字节可通过屏幕屏蔽将它们“与”
(AND)在一起,并且可通过光标屏蔽将它们XOR(按位异或)在一起。
      如果选择了操作的硬件模式,则CX和DX寄存器就会按照Int10h,功能
01h中的CH和CL所采用的方式来选择鼠标光标的起始和终止扫描行。有了
这一选项,便可把鼠标光标设置成与普通文本光标为相同的形状,这样便可轻
易地在屏幕上区分它们。由于可使用的形状是有限的,因而在大多数情况下,
人们通常使用属性模式。
鼠标
Int 33h             功能0Bh                                     版本2
                    读取移动计数器
确定自最近一次调用该功能以来,鼠标是否移动过,如果移动过,那么实际移
动的距离是多远。
调用寄存器: AX              000Bh
返回寄存器: CX             水平方向上移动的米基数
                            (-32768至32767,负数表示向左移动)
              DX            垂直方向上移动的米基数
                            (-32768至32767,负数表示向上移动)
 
658页
    注释:功能0Bh能告诉你在两次调用之间鼠标光标移动的相对距离。在整个
过程中,内部软件都会监视鼠标光标的位置并且在每次调用该功能时都记录
    下它的位置。
      CX和DX寄存器返回鼠标光标的相对移动距离(正值表示移向屏幕的右
    边和下方)。返回的数字为米基数(米基为鼠标移动的单位)。每个米基约等于
    0.5毫米(0.02英寸)。
鼠标
Int 33h           功能0Ch                                 版本2
                  设置用户定义的事件句柄
建立起一个指向(Pointing)功能的向量,这里所说的功能是指只要由特定调用
屏蔽所定义的事件一出现,设备驱动程序就会调用的功能。
调用寄存器: AX            000Ch
              CX          调用屏蔽(参见注释)
               ES:DX     指向用户中断例程的指针
返回寄存器:无
注释:该功能能够设置特殊的处理程序,以处理鼠标驱动程序能识别的情况
它可以编写一种功能来负责按钮按压、按钮松开,在光标位置内的改变,或上
述事件的任意组合。其操作必须起到一种与中断处理程序等效的作用,尤其是
在该功能的活动过程中,如果出现了任何程序的执行情况,那么通过这种操
作,必须能调用用户定义的中断例程;同时,该中断处理序没有必要去关心鼠
标驱动程序内的任何细节。
      这种特殊处理程序的操作是设CX中的“调用屏蔽”控制的,因为这种屏
蔽能识别哪些情况会激发对该处理程序的调用。无论在什么地方,只要这种调
用屏蔽中出现了一个1位,那么系统就会执行ES:DX所指的功能。若在同一
位置上出现一个0位,则会取消ES:DX所指的功能。
      表17.3显示了调用屏蔽中位的设置情况,并且表17.4显示了在输入给
用户定义的事件处理程序的例程时,CPU寄存器的状态。
                      表17.3调用屏蔽位的值
                    位
                                        含    义
          76543210
        . . . . . . . 1               移动鼠标
        . . . . . . 1.               按下左按钮
        . . . . . 1. .                松开左按钮
        . . . . 1. . .                按下右按钮
659页
          位
                              含      义
76543210
. . . 1. . . .                  松开右按钮
.. 1. . . . .                  按下中心按钮(如果有)
.1. . . . . .                  松开中心按钮(如果有)
表17.4在调用用户功能时寄存器的设置
寄存器              内    容
              事件激发位(与表17.3中所介绍的条件屏蔽是一样的,只不过
AX
              是表1.3只介绍了激发该调用的一个位而已)
BX            按钮状态(与功能05h和06h是一样的)
CX            光标的横坐标(与功能03h相同)
DX            光标的纵坐标(与功能03h相同)
DI            水平方向上的计数(与用于功能0Bh的CX相同)
SI            垂直方向上的计数(与用于功能0Bh的DX相同)
      只要调用功能00h时,系统就会把整个调用屏蔽复位到0。其实,在设置
特殊处理程序以处理这些情况的程序终止之前,可调用功能00h,0Ch或14h
来把调用屏蔽复位为0。不过应记住,在终止程序之前,必须把调用屏蔽和子
程序地址恢复到初始值。
鼠标
Int 33h           功能0Dh                                 版本2
                  启动光笔仿真
打开光笔仿真模式。
调用寄存器: AX              000Dh
返回寄存器:无
注释:在光笔仿真模式中,鼠标位置就是光笔位置。同时按下两个鼠标按钮相
当于把光笔按压给屏幕。不过,应清楚地认识到,并非所有的鼠标驱动程序都
提供这种接口。
鼠标
Int 33h           功能0Eh                                 版本2
                  停止光笔仿真
关闭光笔仿真模式
660页
    调用寄存器: AX            000Eh
    返回寄存器:无
    注释:可用该功能来指示设备驱动程序停止处理鼠标输入,尽管它们源于光
    笔。功能0Eh可导致鼠标按照常规的方式进行工作,而不进行驱动程序转换。
    同样,并非所有的鼠标驱动程序都提供这种接口。
鼠标
Int 33h           功能0Fh                               版本2
                  设置米基与象素比
设置光标的物理移动距离(以米基计算,1米基为1/200英寸)和坐标改变(按
象素计算)之间的比例。
调用寄存器: AX            000Fh
              CX          在水平方向上变8个象素的距离(缺省值8)
                          所要求的米基数
              DX          在垂直方向上变8个象素的距离(缺省值16)
                          所要求的米基数
返回寄存器:无
注释:在寄存器CX和DX中,高位字节必须为0。每个米基与象素比的最小
值是1。比值越大,鼠标光标在屏幕上移动得越慢。
鼠标
Int 33h           功能10h                                 版本2
                  条件光标关闭
指定光标隐藏的屏幕区域(排斥区域)。
调用寄存器: AX              0010h
              CX           x屏幕坐标的上限
              DX           y屏幕坐标的上限
              SI           x屏幕坐标的下限
              DI           y屏幕坐标的下限
返回寄存器:无
注释:功能10h可在屏幕指定光标消失的区域。使用了该功能之后,如果光标
移出了隐藏区域,那么为了使光标再次出现在屏幕上就必须再一次调用功能
01h。
鼠标
Int 33h           功能13h                                 版本2
                  设置双倍速度的阀值
661页
设置一种阀值速度,超过了这个速度,光标就会按常规速度的两倍来移动。
调用寄存器: AX              0013h
              DX            按每秒多少米基数来计算的阀值速度(缺省值
                            为64)
返回寄存器:无
注释:当鼠标按照阀值速度(每秒内的米基数)或大于阀值速度移动时,光标
在屏幕上移动的速度就是正常速度的2倍。
系统
Int 33h             功能14h                                   版本2
                    交换用户事件处理程序
在返回以前的值后,设置用户中断功能和调用屏蔽。
调用寄存器: AX              0014h
              CX            用户中断调用屏蔽
                ES:DX      指向用户中断父例程的指针
返回寄存器: CX              旧的用户中断屏蔽
                ES:DX       旧的用户中断向量
注释:与功能0Ch一样,该功能也是设置用户定义的处理功能,以处理鼠标
设备驱动程序能识别的特殊事件。这里的调用屏蔽与功能0Ch中使用的调用
屏蔽(参见表17.5)是相同的。把调用屏蔽位置为1,表示允许功能14h;把它
设置为0则会禁止该功能。
                          表17.5调用屏蔽位
        位
                            含    义
    76543210
    . . . . . . . 1           移动鼠标
    . . . . . . 1.           按下左按钮
    . . . . . 1. .            松开左按钮
    . . . . 1. . .            按下右按钮
    . . . 1. . . .            松开右按钮
    .. 1. . . . .            按下中心按钮(如果有)
    .1. . . . . .            松开中心按钮(如果有)
        与功能0Ch不一样,通过该功能可返回旧的值,这样便允许你将它们保
    存起来,并在调用完毕后恢复这些值。除此之外,该功能与功能0Ch是相同
    的。
        在调用用户事件处理程序时,系统便可按表17.4所示的信息来设置
    CPU寄存器。其中,DS寄存器指向鼠标驱动程序数据段。如果这种用户功能
    需要获取它自己的数据,那么它就必须把DS设置为指向它自己和数据段。
        该功能与功能0Ch之间的主要区别在于该功能允许保存调用屏蔽和用
 
662页
户中断向量的初始值。
鼠标
Int 33h           功能15h                                   版本2
                  获取保存状态存储区的大小
    返回用于鼠标设备驱动程序当前状态的缓冲区大小。
    调用寄存器: AX          0015h
    返回寄存器: BX         需要用于保存当前鼠标状态的缓冲区大小(字
                            节)
    注释:在调用另一道也需要用鼠标的程序之前,可调用该功能(用于为功能
    16h或17h做准备)来确定保存鼠标的当前状态需要多少内存。返回的值正好
    是可保存鼠标驱动程序状态的字节数。
鼠标
Int 33h             功能16h                                 版本2
                    保存鼠标驱动程序状态
把鼠标驱动程序的状态保存到ES:DX所指的缓冲区中。
调用寄存器: AX            0016h
              ES:DX      指向要保存鼠标状态的缓冲区的指针
返回寄存器:无
注释:该功能可把鼠标的当前状态保存到ES:DX所指的缓冲区中。至于需
要多大的缓冲区可通过调用功能15h来确定。
      无论想在什么时候挂起一个正在使用鼠标的程序并执行另一道这类程序
时,都可调用功能16h。当第二个程序终止时,还可把鼠标的状态恢复到第二
个程序开始前的状态。
鼠标
Int 33h           功能17h                                   版本2
                  恢复鼠标驱动程序状态
把鼠标驱动程序恢复到功能16h所保存的状态上
调用寄存器: AX            0017h
              ES:DX      指向保存着鼠标状态的缓冲区的指针
返回寄存器:无
注释:当一个程序在执行完另一个使用鼠标的程序之后再继续前一个进程
时,该功能允许立即把鼠标的状态恢复到在执行第二个程序之前它所处的状
态上(如果这一状态是通过功能16h来保存的)。
663页
鼠标
Int 33h           功能18h                               版本2
                  设置备用的鼠标用户处理程序
允许设置多达三个特殊的事件处理程序(与功能0Ch或14h所定义的那些程
序类似)
调用寄存器: AX            0018h
              CX          调用屏蔽(参见注释)
              ES:DX      功能的地址偏移值
返回寄存器: AX            0018h表示功能成功
                          FFFFh表示功能失败
注释:该功能可创建出一种特殊的处理程序以处理鼠标设备驱动程序所识别
的事件。它可编写一种功能专门负责按钮按压或松开,或者在光标位置内进行
改变。调用功能18h可创建多达三个这类处理程序,并且各自有其独立的定
义。通过该功能建立的处理程序与通过功能0Ch或14h所建立的处理程序只
有在按下Shift、Alt或者Ctrl键时才能起作用。驱动程序允许总数为四个处理
程序同时存在,其中三个是该功能所允许的,另外一个是由功能0Ch设置的。
该功能不支持诸如Shift-Alt和Ctrl-Alt之类的键组合,这与别的出版物所
介绍的内容相违背。
      该中断的操作是由调用屏蔽控制的,因为调用屏蔽能识别哪些情况可激
发这种特殊的处理程序。无论何处,只要调用屏蔽中出现一个1位,那么系统
    就会执行DX寄存器所指的功能。而如果在调用屏蔽中的同一位置上出现了
    一个0位,那么系统就会取消DX所指的功能。表17.6显示出了调用屏蔽中
    的位设置情况。注意,在调用屏蔽中由于在3个按钮的鼠标上用于标识中心按
    钮的位是供Shift和Ctrl键指示符驱使的,因此,该功能不能响应3按钮鼠标
    上的中心按钮。
                          表17.6调用屏蔽位
              位
                                          含义
      76543210
    . . . . . . . 1               移动鼠标
    . . . . . . 1.               左按钮下移事件
    . . . . . 1. .                左按钮上移事件
    . . . . 1. . .                  右按钮下移事件
    . . . 1. . . .                  右按钮上移事件
      . . 1. . . . .                在事件过程中按下Shift键
      .1. . . . . .                在事件过程中按下Ctrl键
      1. . . . . . . .              在事件过程中按下Alt键
664页
      调用功能00h可把调用屏蔽复位到0。在终止前设置特殊处理程序以处
理特殊事件的程序必须调用功能18h或功能00h来恢复调用屏蔽。
      在调用特殊事件处理程序时,CPU寄存器的设置情况如表17.4所示的
一样。
鼠标
Int 33h           功能19h                                       版本2�
                  获取用户备用的中断向量
返回一个指向功能的指针,这里的功能是通过调用功能18h而定义的。
调用寄存器:AX             0019h
            CX            调用屏蔽
返回寄存器: BX:DX     用户中断向量
            CX            调用屏蔽(0表示未找到匹配的调用屏蔽)
注释:该功能搜索功能18h所定义的事件处理程序,以便找到一个其调用屏
蔽与CX寄存器相匹配的处理程序,一旦找到了一个这样的处理程序,功能
18h就会通过BX返回该程序的段,并通过DX返回它的偏移值。
鼠标
Int 33h           功能1Ah                                       版本2
                  设置鼠标的灵敏度
设置鼠标的速度和双速阀值。
调用寄存器: AX              001Ah
              BX            水平方向上的米基数(1-100,缺省值为8)
              CX            垂直方向上的米基数(1-100,缺省值为16)
              DX            双速阀值(缺省值为64)
返回寄存器:无
注释:该功能把功能0Fh和13h组合成了一个调用。在这里,速度值和双速
阀值不是通过调用功能00h来重新设置的,而是由该功能自身设置的。其中,
BX和CX的最大值都是100。
鼠标
Int 33h           功能1Bh                                       版本2
                  获取鼠标灵敏度
返回由功能1Ah设置的灵敏度值。
调用寄存器: AX              001Bh
返回寄存器: BX             每象素的水平米基数
665页
                CX          每象素的垂直米基数
                DX            双速阀值
注释:该功能返回鼠标的灵敏度值,以米基数(水平方向和垂直方向的米基
数)表示,表明在屏幕上每移动光标一个象素,鼠标必须移动多少米基数。
鼠标
Int 33h           功能1Ch                                       版本2
                  设置中断频率
设置鼠标驱动程序轮询鼠标状态的速率。
调用寄存器: AX              001Ch
              BX            中断率代码
                            1,无轮询
                            2,每秒种轮询30次
                            4,每秒钟轮徇50次
                            8,每秒钟轮询100次
                            16,每秒钟轮询200次
注释:该功能仅适用于Microsoft InPort鼠标。如果放入BX的值不是上述所
列出的值中的任何一个,那么系统会把最低的位加给这个值(例如,3=无轮
询,因为它保存着用于1的位)
鼠标
Int 33h           功能1Dh                                   版本2
                  设置CRT页号
设置显示鼠标光标的页
调用寄存器: AX                001Dh
                BX          CRT页号
返回寄存器:无
注释:该功能可用来设置显示鼠标光标的屏幕页面。页号是否有效由所安装
的视频硬件和显示模式共同决定;关于有效组合的细节可参见对中断10h,功
能05h的讨论。
鼠标
Int 33h             功能1Eh                                   版本2
                    获取CRT页号
获取显示鼠标光标的CRT页号。
666页
调用寄存器: AX              001Eh
返回寄存器: BX              CRT页号
注释:该功能可用来确定显示鼠标的屏蔽页。CRT页号是否有效要根据所安
装的视频硬件和显示模式来定;关于有效组合的具体情况可参见对中断10h,
功能05h的介绍。
鼠标
Int 33h           功能1Fh                                   版本2
                  禁止鼠标驱动程序
通过恢复鼠标驱动程序所使用的中断向量来禁止鼠标驱动程序
调用寄存器: AX            001Fh
返回寄存器: AX            001F,成功
                          FFFFh,未成功
                ES:BX    以前用于Int 33h的向量(仅在成功时才有可能)
注释:该功能通过恢复用于中断10h和Int 71h(8086处理机系统)或Int 74h
    (80286或80386型系统)的中断向量来禁止鼠标操作。调用该功能虽不能直
接对Int 33h(鼠标功能中断)起作用,但可通过ES:BX寄存器对返回Int 33h
    向量的初始值。这样,系统就能使用这个值来把Int 33h恢复到
它的初始值,从而达到禁止鼠标处理程序的目的。
      禁止任何中断处理程序都需要有一定的技巧。因为当鼠标处理程序安装
    了它自己之后,我们无法知道别的处理程序是否也把它们加到了这个中断上。
而被恢复的中断向量是根据首次安装鼠标驱动程序时,该向量所拥有的初始
值来恢复的。这样,如果别的处理程序也在此之后把它自己加到了这些中断
    上,那么调用该功能还会禁止其它的处理程序。这便意味着有可能导致系统冲
    毁或出错。
鼠标
Int 33h           功能20h                                   版本2
                  允许鼠标驱动程序
重新安装鼠标驱动程序以供系统使用。
调用寄存器: AX              0020h
返回寄存器:无
注释:如果中断33h向量被禁止,那么调用该功能便能恢复Int 10h和71h的
中断向量(这些中断向量是先前通过调用功能1Fh而被删除的)。
667页
鼠标
Int 33h         功能21h                           版本2
                软件复位
复位鼠标软件(而不是鼠标)。
调用寄存器: AX              0021h
返回寄存器: AX              FFFFh,已安装鼠标驱动程序
                            0021h,未安装鼠标驱动程序。
              BX            鼠标拥有的按钮数(2表示为Microsoft鼠标,3
                            表示其它生产厂商的鼠标)。
注释:除了不复位鼠标硬件外,该功能的作用与功能00h相同。
鼠标
Int 33h           功能22h                                 版本2
                  设置信息语言
    选择鼠标驱动程序用于提示和显示出错信息的语言(不是所有的版本都可
    以)。
    调用寄存器: AX        0022h
                BX        语言号
                          0,英语
                          1,法语
                          2,荷兰语
                          3,德语
                          4,瑞士语
                          5,芬兰语
                          6,西班牙语
                          7,葡萄牙语
                          8,意大利语
    返回寄存器:无
    注释:该功能只能用于鼠标驱动程序的国际版本中。
鼠标
Int 33h           功能23h                                 版本2
                  获取信息语言
返回鼠标驱动程序用于提示和显示出错信息的语言(不是所有的版本都可
以)。
调用寄存器: AX            0023h
 
668页
   返回寄存器: BX           语言号
                              0,英语
                              1,法语
                              2,荷兰语
                              3,德语
                              4,瑞士语
                              5,芬兰语
                              6,西班牙语
                              7,葡萄牙语
                            8,意大利语
    注释:该功能只能用于鼠标驱动程序的国际版本中。
鼠标
Int 33h           功能24h                                   版本2
                  获取鼠标信息
返回系统当前正使用的驱动程序版本号,鼠标类型和IRQ号。
调用寄存器: AX            0024h
返回寄存器: BH           主版本号(例如,6代表6.11)
              BL        次版本号(例如,11代表6.11)
              CH            鼠标类型
                          1,总线鼠标
                          2,串行鼠标
                          3,InPort鼠标
                          4,PS/2鼠标
                          5,HP鼠标
              CL          正在使用的IRQ
                          0,PS/2系统
                          2-7,IRQ号
注释:该功能返回驱动程序的版本号,鼠标类型以及标准的Microsoft驱动程
序当前正在使用的中断请求线。其它信息则通过功能25h返回。其它公司的
驱动程序有可能不支持这种功能,或虽支持这种功能但却返回不同的结果。
鼠标
Int 33h           功能25h                                   版本2
                    获取通用的驱动程序信息
返回鼠标正在其内行使功能的环境的有关信息。
669页
调用寄存器: AH              0025h
返回寄存器: AX             驱动程序信息
注释:在功能24h的基础上再使用该功能便能更为详尽地获取鼠标环境的有
关信息。通过AX返回的不同位值有着不同的含义。表17.7列出了这些特定
的位含义。
                      表17.7功能25h返回的位含义
        位设置
                                          含    义
FEDCBA98   76543210
            xxxxxxxx                  当前现有的MDD计数(仅仅当位14为1
                                      时才使用)
    xxxx                              鼠标驱动程序中断频率
    00                                软件文本光标是活动的
    01                                硬件文本光标是活动的
    10                                图形光标是活动的
    11                                图形光标是活动的
    1                                 集成鼠标显示驱动程序(MDD)
   0                                 非集成鼠标驱动程序
1                                     作为SYS文件而装入的驱动程序
 0                                    作为COM文件而装入的驱动程序
鼠标
Int 33h           功能26h                               版本2
                  获取最大的虚拟坐标
返回驱动程序的状态信息和可用的最大坐标范围。
调用寄存器: AX            0026h
返回寄存器: BX           鼠标驱动程序状态
                          0,被允许
                          非0,通过功能1Fh禁止了鼠标驱动程序
              CX          最大的横坐标
              DX          最大的纵坐标
注释:该功能可返回两条有用的信息。其一是:通过BX返回的值表明系统是
否已启用鼠标驱动程序。其二是:通过CX和DX返回的值表示出了现有的显
示模式可使用的最大横坐标和最大纵坐标。该功能指定的最小坐标为0,0。
系统
Int 33h           功能27h                               版本2
                  获取光标屏蔽和米基计数
670页
返回文本屏幕屏蔽、光标屏蔽和已累加起来的米基计数。
调用寄存器: AX            0027h
返回寄存器: AX           屏幕屏蔽或起始扫描行
              BX          光标屏蔽或终止扫描行
              CX          横向米基计数
              DX          纵向米基计数
注释:如果是在使用硬件文本光标的话,该功能可返回文本光标和屏幕屏蔽。
如果是在使用软件文本光标,那么该功能就会返回一起始扫描行。可用功能
0Ah来设置这些扫描行或屏蔽。
      除了光标信息外,CX和DX的值还可指示出自上次用该功能读出米基计
数以来系统已累加起来的米基数。
鼠标
Int 33h           功能28h                                 版本2
                  设置视频模式
设置供视频插件和鼠标驱动程序使用的视频模式。
调用寄存器: AX          0028h
            CX          视频模式
            DX          字体大小
返回寄存器: CX         状态(0表示成功,其它值表示未改变)
注释:该功能允许指定鼠标驱动程序必须使用的视频模式。由于该功能会改
变视频模式,因此,在CX中所指定的值必须是视频插件支持的模式值。使用
功能29h即可确定系统到底支持哪些视频模式,此外,如果视频插件支持设置
的模式所使用的字体定义,这时就能在DX中指定字体的大小。
鼠标
Int 33h           功能29h                                 版本2
                  获取受支持的视频模式
返回鼠标驱动程序所支持的视频模式信息。
调用寄存器: AX            0029h
              CX          搜索标志
                          0,搜索第一个标志
                          非0,搜索下一个标志
返回寄存器: BX           用于描述的段
              CX          模式号(0表示成功)
              DX          描述的偏移值
671页
注释:如果驱动程序支持的话,该功能便可返回可用的视频模式信息。因为此
时它可以搜索要支持的视频模式内部列表(由鼠标驱动程序维持)。
      通过BX:DX返回的地址表明了视频模式的任选ASCIIZ描述。如果无可
用的描述,那么BX和DX的值都为0。
鼠标
Int 33h             功能2Ah
                    获取光标热点
返回热点坐标,显示标志和鼠标类型。
调用寄存器: AX              002Ah
返回寄存器: AX             显示标志
                            0,显示光标
                            非0,隐藏光标
                BX          横向热点坐标
                CX          纵向热点坐标
                DX            鼠标类型
                            1,总线鼠标
                            2,串行鼠标
                              3,InPort鼠标
                              4,PS/2鼠标
                              5,HP鼠标
注释:该功能可用来获取最初通过功能09h所设置的信息。通过BX和CX
返回的值表示相对于图形光标屏蔽左上角的象素偏移值。该偏移值处就是当
你掀击按钮时定位光标的位置;并且,当使用某种指示鼠标光标位置的功能
时,那么此功能也会返回这样一个偏移值。
鼠标
Int 33h             功能2Bh                                  版本2
                    设置加速曲线
设置加速度曲线表的地址。
调用寄存器: AX            002Bh
              BX          曲线号
              ES:SI       缓冲区地址
返回寄存器: AX           状态
                          0,已成功
                          非0,未成功
672页
注释:鼠标驱动程序利用加速度曲线来控制程序怎样把原始的鼠标移动数据
转换成实际的鼠标移动。该功能可用来设置加速度曲线。ES:SI指向一个32
位字节的缓冲区,其内保存着加速度表(参见表17.8)。该功能通过BX指示,
在装入了加速度表之后应使用哪一个曲线。下表定义了四种可能的加速度曲
线(1至4),既可从中选择一条加速度曲线,或者干脆把BX设置成-1,以便
让曲线选择程序保持不变。
                        表17.8加速度曲线表的布局
偏移值            长度        含    义
    00h              1字节      曲线1计数和因子
    01h              1字节      曲线2计数和因子
    02h              1字节      曲线3计数和因子
    03h              1字节      曲线4计数和因子
    04h            20h字节      曲线1鼠标计数阀值数组
    24h            20h字节      曲线2鼠标计数阀值数组
    44h            20h字节      曲线3鼠标计数阀值数组
    64h            20h字节      曲线4鼠标计数阀值数组
    84h            20h字节      曲线1比例因子数组
    A4h            20h字节      曲线2比例因子数组
    C4h            20h字节      曲线3比例因子数组
    E4h            20h字节      曲线4比例因子数组
    104h           10h字节      曲线1名称(右边未尾以ASCIII补齐)
    114h           10h字节      曲线2名称(右边末尾以ASCIIZ补空)
    124h           10h字节      曲线3名称(右侧末尾以ASCIIZ补空)
    134h           10h字节      曲线4名称(右侧末尾以ASCIIZ补空)
      为了便于更好地理解如何使用加速度曲线,设计者们人为地规定必须使
    用曲线2。这样当鼠标驱动程序到达光标在屏幕上的位置时,它就会看到位于
    偏移量01h处的字节。此处的值表明,在另外两个数组表中的项数是用于曲线
    2的。此时,驱动程序便开始搜索偏移量24h处的数组,直到找到一个比移动
    的米基数更大的值。相应的值是从偏移值A4h处的数组中装入的,并且系统
    会将此值乘以原始的移动数据,来确定光标的显示位置。
鼠标
Int 33h             功能2Ch                                 版本2
                    获取加速度曲线
    返回加速度曲线表地址。
    调用寄存器: AX          002Ch
返回寄存器: AX             当前状态
                            0,已成功
673页
                                非0,未成功
                  BX            当前曲线
                  ES:SI        曲线表地址
    注释:该功能可用来获取鼠标驱动程序当前正使用的加速度曲线的地址。如
    果打算改变加速度,曲线表(功能2Bh),则首先必须找到曲线表的地址,以便
    把该表传送到某个缓冲区内保存起来,这样,一旦程序终止了,你便能立即重
    新设置加速度曲线表。
鼠标
Int 33h           功能2Dh                                   版本2
                  设置或获取现行的加速度曲线
    设置和返回现行加速度曲线的号和名字。
    调用寄存器: AX          2Dh
                BX          动作标志
                            1-4,设置加速度曲线
                            -1,获取加速度曲线
    返回寄存器: AX         状态
                            0,已成功
                            非0,未成功
                BX          当前曲线
                ES:SI      曲线名地址
    注释:如果想弄清楚系统当前正使用的是哪一种加速度曲线,或者只想设置
    某个使用的加速度曲线但不想设置加速度曲线时,即可使用该功能。该功能通
    过ES:SI返回的地址是包含在加速度曲线表内的一个16字节名字的地址。
鼠标
Int 33h           功能2Fh                                 版本2
                  鼠标硬件复位
把所有与硬件相关的鼠标驱动程序信息设置回缺省状态。
调用寄存器: AX            002Fh
返回寄存器: AX           状态
                          -1,已成功
                          0,未成功
注释:除了少数由鼠标驱动程序维持的变量被复位,以及物理鼠标的复位外,
该功能的操作方式与功能00h是类似的。该功能必须复位的唯一两变量是
CRT页号的光笔仿真。而其余所有由鼠标驱动程序维持的变量都被看作是软
 
674页
件变量,并且可通过使用功能21h来复位。
鼠标
Int 33h           功能30h                                   版本2
                  设置或获取BallPoint信息
设置或返回用于配置BallPoint Mouse(轨迹球)的信息。
调用寄存器: AX              0030h
调用寄存器: AX              0030h
                BX          旋转角度
                CX          命令
                            0,读取鼠标状态
                            非0,设置屏蔽值
返回寄存器: AX             状态
                            -1,未成功
                            其它值,按钮状态
                BX          旋转角度
                CX          按钮屏蔽
    注释: Microsoft最近推出了一种新型鼠标,称作BallPoint Mouse(轨迹球鼠
    标)。它主要用于膝上型(Laptop)和便携机上,使用时,它能附着在计算机的左
    边或右边。紧挨着键盘。它看起来就像是一个颠倒过来的鼠标,并且用户可通
    过用姆指触动鼠标来操纵鼠标光标。Ballpoint鼠标共有四个按钮,但每次都只
    有两个按钮是活动的。
      根据CX中所设置的值,该功能允许要么读出Ballpoint鼠标的状态,或者
    可改变由鼠标驱动程序维持的内部旋转指针和按钮状态。
鼠标
Int 33h           功能31h                                   版本2
                  获取虚拟坐标
    返回鼠标可在屏幕上移动的上下限。
    调用寄存器: AX          0031h
    返回寄存器: AX         最小的X范围
                BX          最小的Y范围
                CX          最大的X范围
                DX          最大的Y范围
    注释:该功能允许确定通过功能07h和08h所设置的最小和最大的虚拟范
围。关于虚拟范围的详情可参见功能07h和08h。
675页
鼠标
Int 33h           功能32h                               版本2
                  获取活动的高级功能
返回一些标志,表示某些高级功能是可用的。
调用寄存器: AX            0032h
返回寄存器: AX           功能标志
注释:该功能可用来确定鼠标驱动程序可使用哪些高级功能。通过AX返回
的每一个不同值的位都表明了某个指定的功能是否可用。表17.9给出了每个
位的含义。(如果某个位置位,表明相关的功能可用)
      功能32h通过AX返回的值的位含义
表17.9
            位设置
                                                        含    义
FEDCBA9876543210
                                  x               功能34h可用吗?
                                x                 功能33h可用吗?
                              X                   功能32h可用吗?
                            x                     功能31h可用吗?
                        x                         功能30h可用吗?
                      x                           功能2Fh可用吗?
                    x                             功能2Eh可用吗?
                  x                               功能2Dh可用吗?
                x                                 功能2Ch可用吗?
              x                                   功能2Bh可用吗?
            x                                     功能2Ah可用吗?
          x                                       功能29h可用吗?
        x                                         功能28h可用吗?
      x                                           功能27h可用吗?
    x                                             功能26h可用吗?
x                                                 功能25h可用吗?
鼠标
Int 33h             功能33h
                    获取开关设置
返回由鼠标驱动程序维持的开关设置缓冲区的地址。
调用寄存器: AX            0033h
              CX          缓冲区长度
676页
              ES:DX      缓冲区地址
返回寄存器: CX           缓冲区中的实际字节数
              ES:DX      缓冲区地址
注释:在以命令行中启动鼠标驱动程序时,可以使用命令行开关来选择驱动
程序的操作方式。该功能允许你检查这些开关的设置情况。在调用过程中,
ES:DX必须指向一个340字节的缓冲区。如果所使用缓冲小于340字节,该
功能就不能返回所有的开关值。在返回时,位于ES:DX处的缓冲区所包含的
信息如表17.10所示。
                    表17.10功能33h返回的缓冲信息
位设置              长度                含  义
00h                    1 byte               鼠标类型端口
01h                    1 byte               语言
02h                    1 byte               横向灵敏度
03h                    1 byte             纵向灵敏度
04h                    1 byte               双速阀值
05h                    1 byte               弹导曲线
06h                    1 byte               中断率
07h                    1 byte               光标屏蔽
08h                    1 byte               掌上机调整
09H                    1 byte               内存类型
0Ah                    1 byte                SUPerVGA标志
0Bh                  2 bytes                旋转角度
0Dh                    1 byte               主按钮
0Eh                    1 byte               次按钮
0Fh                    1 byte               允许上锁
10h                    324 bytes            加速曲线表
鼠标
Int 33h         功能34h                           版本2
                获取MOUSE.INI路径
返回在配置制鼠标时所使用的MOUSE.INI文件的完整路径。
调用寄存器: AX          0034h
返回寄存器: ES:DX     路径地址
注释:该功能通过ES:DX返回一个缓冲区的地址,该缓冲区内保存着
MOUSE.INI文件的完整路径名。其中,MOUSE.INI文件可用来设置鼠标驱
动程序的配置缺省值。
677页
        17.2   鼠标驱动程序的EGA寄存器接口
      与EGA的早期和近期硬件不一样,鼠标驱动程序的大部分EGA硬件只
能通过只写寄存器来控制。这使得控制视频极其困难。为了简化跟踪EGA硬
件,程序员们可通过一种新的Video BIOS功能(中断10h)来获取鼠标驱动程
序的虚拟EGA控制器的接口-EGA寄存器接口。如果应用程序也在使用
鼠标并打算操纵EGA或VGA寄存器。那么它必须通过这一接口来操纵这两
个寄存器。
显示
Int 10h           功能F0h                                   版本2
                  读取一个寄存器
从指定的EGA寄存器中返回数据
调用寄存器: AH                F0h
                BX            用于指针/数据芯片的索引
                BH            0
                BL            索引(这种寄存器不能用作以下的各种
                              单个寄存器)
                DX            端口号(参见表17.11)
返回寄存器: BL               数据
注释:不是出自于Microsoft生产的驱动程序可能不支持这一功能。
                          表17.11 EGA寄存器值
    端口号                  EGA寄存器
    00h                   CRT控制器
    08h                   定序器
    10h                   图形控制器
    18h                   属性控制器
    20h                   其它输出寄存器
    28h                   功能控制寄存器
    30h                   图形1控制寄存器
    38h                   图形2控制寄存器
系统
Int 10h           功能F1h                                 版本2
                  写一个寄存器
678页
把数据写入某个指定的寄存器。
调用寄存器: AH            F1h
              BL          指针/数据芯片的索引或寄存器的数据
              BH          用于指针/数据芯片的数据(不能用作寄存器)
              DX          端口号(参见表17.11)
返回寄存器: BH           修改后的内容
              DX          修改后的内容
注释:不是Microsoft生产的驱动程序可能不支持这一功能。“由于该功能并
不检查所使用的值,因此,在调用该功能之前,必须确保所使用值的正确性的
同时,还应注意有些寄存器值的组合能够造成对EGA接口卡或监视器的物
理毁坏。”此外,调用该功能将不会保留BH和DX寄存器的内容。
显示
Int 10h           功能F2h                                 版本2
                  读取寄存器范围
从指定范围的EGA寄存器内返回数据(在单个芯片上有连续索引的几个寄
存器)。
调用寄存器: AH            F2h
              CH          起始索引
              CL          寄存器数(必须大于1)
              DX          端口号
                          00h,CRT控制器
                          08h,定序器
                          10h,图形控制器
                          18h,属性控制器
              ES:BX      指向1字节项表的指针,表的长度为CL的值
返回寄存器: CX           修改后的内容。
注释:不是Microsoft设计的驱动程序可能不支持该功能。同时,调用该功能
将不会保留CX寄存器的内容。
显示
Int 10h           功能F3h                               版本2
                  写给寄存器范围
把数据写到指定的寄存器范围(在单个芯片上具有连续索引的寄存器)。
调用寄存器: AH            F3h
              CH          起始索引
679页
                  CL          寄存器数(必须大于1)
                  CX          端口号
                              00h,CRT控制器
                              08h,定序器
                              10h,图形控制器
                              18h,属性控制器
                  ES:BX      指向1字节项组成的表的指针,其中表的长度
                              为CL的值
    返回寄存器: BX           修改后的内容
                  CX          修改后内容
                  DX          修改后内容
    注释:不是Microsoft设计的驱动程序有可能不支持该功能。“由于该功能不
    检查所使用的值,因此,在调用该功能之前,必须确保所有的值都是正确的。
    同时,还应注意,有几种寄存器值的组合还能对EGA接口卡或监视器造成物
    理性的毁坏。”此外,调用该功能将不会保留BX、CX和DX寄存器的内容。
显示
Int 10h             功能F4h                                   版本2
                    读取寄存器集
    从指定的EGA寄存器集中返回数据(可以是不在同一个芯片上的几个寄存
    器,并且,如果它们在同一芯片上,它们也可能没有连续索引。)
    调用寄存器: AH            F4h
                CX            寄存器数(必须大于1)
                ES:BX        指向记录表的指针,格式如下:
                              字节0端口号(参见17.11)
                              字节1必须为0
                              字节2用于指针寄存器的索引值,0为单个
                              寄存器的索引值
                              字节3写数据的地方
    返回寄存器:CX            修改后的内容。
    注释:不是Microsoft的驱动程序有可能不支持该功能。并且,调用该功能将
    不会保留CX寄存器的内容。
显示
Int 10h             功能F5h                                 版本2
                    写寄存器集
    把数据写入指定的EGA寄存器集(可以是不在同一芯片上的几个寄存器,并
 
680页
且即使它们是在同一芯片上,它们也可能没有连续索引)。
调用寄存器: AH              F5h
                CX          寄存器数(必须大于1)
                ES:BX      指向记录表的指针,其格式如下:
                            字节0端口号(参见表17.11)
                            字节1必须为0
                            字节2用于指针寄存器的索引值。0为单个
                            寄存器的索引值。
                            字节3要写入的数据
返回寄存器: CX             修改后的内容。
注释:不是Microsoft的驱动程序有可能不支持该功能。“由于该功能不检查
所使用的值,因此,在调用该功能之前必须确保所有的值都是正确的。”同时,
还应注意,有几种寄存器值的组合能对EGA接口卡和监视器造成物理性的
破坏。此外,调用该功能将意味着不保留CX寄存器的值。
显示
Int 10h         功能F6h                                   版本2
                回复到缺省寄存器
把通过EGA寄存器接口改变的任何寄存器恢复到缺省设置。缺省值可通过
调用功能F7h来设置。
调用寄存器: AH            F6h
返回寄存器:无
注释:不是Microsoft的驱动程序有可能不支持该功能。如果用Int10h功能
00h来设置显示模式,那么缺省寄存器值就是用于被选择模式的BIOS值。
显示
Int 10h          功能F7h                                   版本2
                定义缺省寄存器表
定义某个指针/数据芯片中的单个寄存器或全部寄存器的缺省设置。
调用寄存器: AH            F7h
              CX           VGA彩色选择标志5448h:
              ES:BX      所指的表中的高字节偏移值14h是VGA
                          彩色选择寄存器的值
              DX          端口号(参见表17.11)
              ES:BX      指向1字节项组成的表的指针;其中,该表必须
                          含有某个指针/数据芯片中所有寄存器的值。
681页
    返回寄存器: BX         已修改的内容
                DX          已修改的内容
    注释:不是Microsoft的驱动程序有可能不支持该功能。“由于该功能不检查
    所使用的值,因此,在调用该功能之前,必须确保输入的值是正确的。同时,还
    应注意,有几种寄存器值的组合还能对EGA接口卡或监视器造成物理上的
    破坏。”此外,调用该功能将意味着不会保留BH和DX寄存器的内容。
显示
Int 10h           功能FAh                               版本2
                  询问驱动程序
询问鼠标程序,以确定EGA寄存器接口号是否存在。
调用寄存器: AH            FAh
                    BX                0
返回寄存器: BX           若EGA寄存器接口不存在则为0
              ES:BX      指向EGA寄存器接口的版本号。
                          其格式如下:
                          字节0  主版本号
                          字节1   次版本号(采用百分数)
注释:不是Microsoft的驱动程序有可能不支持该功能。
 
第18章EMS参考手册
        扩充(expanded)内存(简称EMS内存,第2章曾介绍过)允许你通过使用一种称
为“块(bank)转换”的技术,以便访问多达8兆字节的RAM。
      在使用这一技术时,可先把一小段额外内存区域(EMS内存)指定为能被切换到处理
机的物理地址区域中。这样的一个内存段即称为一个“块”。然后,通过EMS内存,我们就
能把16K的块(EMS文档中称之为页)转换成指定页框中的常规内存(关于EMS内存操
作的详细情况见第2章“DOS系统的结构”和第10章“程序和内存管理”)。
      可装入一种特殊的驱动程序以允许程序访问EMS内存。这样,你就能像访问文件一
样来访问EMS内存。通过Int 67h,功能43h打开了对EMS内存的访问之后,便可通知插
件板(通过Int 67h,功能44),哪些内存页是可访问的。由于内存页是可访问的,这样,便能
从中读出内存或把内存写给该页。完成这些之后,可使用Int 67h,功能45h来关闭句柄。
      EMS标准的版本3.0(早期的版本从未在市场上出现过)是由Lotus、Intel和Mi-
crosoft共同合作而开发出来的(因而称之为LIM内存)。版本3.2中增加了面向多任务操
作系统,如Windows和DESQiew的支持。随后,市场上还出现了版本4.0。在新的版本
(版本4.0)中,用户可通过保存在扩充内存中的信息来运行程序。这篇参考手册主要介绍
如何使用出现在LIM版本4.0中的信息;同时,还在每一段描述的前面通过(LIM Speci-
fication Version”(LIM规范版本)这一行来介绍早期版本中所使用的功能。
      扩充内存的唯一缺陷是程序员们必须跟踪事件被定位在扩充内存的什么地方。为此,
它们投入了大量的努力以创建能隐藏内存工作方式的编程语言。例如,程序员没有必要去
记住变量被保存哪个内存块中。甚至于在采用汇编语言时,如果使用标号方式来引用变量
的话,那么汇编程序会跟踪所处理的是哪个变量。
      但是,在使用扩充内存时,程序员必须记住哪些扩充内存块是在页框内,并且哪些内
存块保存着数据。当想获得某件东西,可这件东西又不在页框中时,就必须把正确的内存
块移进页框。换句话说,必须知道所使用的内存块是否为正确的内存块。而对于使用多个
数据段的汇编语言的程序员们来说,这类问题同样存在,只是高级语言程序员才不会遇到
这样的问题而已。
      如果对本章介绍的功能的表现方式有疑问的话,可参考本书前面“参考概述”一章。
683页
系统
Int 67h     功能40h                          LIM Spec版本3.0
            获取管理程序状态
检验扩充内存硬件(如果已安装)是否起作用。
调用寄存器: AH            40h
返回寄存器: AH            00h,未出错
                          80h,在EMS软件内部出错
                          81h,EMS硬件内部出现了故障
                          84h,未定义所请求的功能
注释:当确信已安装了扩充内存插件板时,该功能可检测它能否起作用(第
10章介绍了几种可用来确定是否安装了扩充内存插件板的技术)。
系统
Int 67h     功能41h                          LIM Spec版本3.0
            获取页框段
获取EMS所使用的页框的段地址。
调用寄存器: AH              41h
返回寄存器:如果成功
              AH            00h
              BX            页框的段
              如果未成功
              AH             80h,EMS软件的内部出错
                            81h,EMS硬件出故障
                            84h,未定义功能
注释:当确定已安装了插件板,且其具有功能性之后,就必须确定它在内存
中的位置。插件板能把4个16K的页(总共为64K)映射到一个介于640K(段
A000h)和1M(段10000h)之间的内存区域中。正如第2章所介绍的,从PC机
上多达1M的内存映象中,我们可以看出,这一块中的绝大部分空间被视频显
示和ROM占用了,并且,余下的一点点自由空间在任何一种系统中都未得到
使用。而安装了扩充内存插件板后,我们就能把开关打到该插件板上,以选择
EMS窗口的地址。不过,在选择其它程序不使用的内存时,我们得细心一点。
      该功能返回的段地址是第一个16K页的基地址。所有其它的页面都与这
一位置保持着一定的偏移值。
 
684页
系统
Int 67h    功能42h                     LIM spec版本3.0
              获取页计数
    获取系统内存EMS内存的总页数和可用的页数
    调用寄存器: AH      42h
    返回寄存器:如果成功
                    AH          00h
                    BX            未分配的页数
                    DX            系统内的总页数
                    如果未成功
                    AH             80h,EMS软件的内部出错
                                  81h,EMS硬件出故障
                                  84h,未定义功能
    注释:使用该功能可确定是否有足够供4个应用程序使用的内存(或按
    比例把应用程序换算成内存)。通过调用该功能就能知道有多少内存和多少可
    用的内存。例如,不管DX返回的页数是多少,只要BX等于0,那么就意味着
    所有扩充内存都被分配,并且没有扩充内存可供其它程序使用。
    注意,当该功能在DOS版本4.x中运行时,它可能会返回不准确的结果,其原
    因是,一旦把/X(EMS)开关用于任何CONFIG.SYS命令时,操作系统就有可
    能占用EMS和页面,并在它们注上已分配的标记,以保护它们不致于为常规
    程序所使用。这样,当其它程序使用这种EMS页面时,如果这些页面正好已
    被磁盘缓冲区占用,并且保存有硬盘的部分FAT,那么数据就会被丢失。出于
    这个原因,我们必须避免在DOS版本4中使用/x开关。
系统
Int 67h   功能43h                        LIMSpec 版本3.0
          获取句柄和分配内存
打开EMS句柄以供使用,并且把指定的页数分配给进程
调用寄存器: AH          43h
          BX          要分配的逻辑页数
返回寄存器:如果成功
                AH            00h
                DX              句柄(0001h到00FEh)
                如果未成功
                AH               80h,EMS软件的内部出错
685页
                            81h, EMS硬件出现了故障
                            84h,未定义功能
                            85h,无更多的句柄可用
                              87h,要求分配的页数大于物理上可用的页数,
                                  没有分配页面
                              88h,指定的逻辑页数大于实际可用的页数;没
                                  有分配页面
                              89h,所请求的页数为0
    注释:可将该功能用作EMS内存的文件打开功能。虽然该功能不能实现与
    正规的文件打开调用相同的功能,但它确实能为内存提供与文件相类似的接
    口。
        调用该功能所返回的句柄用来访问扩充内存插件板。该调用能把句柄与
    指定数据目的EMS内存页(可用功能44h来控制)联系在一起。
        在操作过程中,虽然能把不止一个EMS句柄指定给一个进程,但进程却
    必须通过调用功能45h来一一正确地关闭每个句柄。否则,已指定给句柄的内
    存就会消失,并且不能再使用,直到重新启动系统。
        句柄0000h是留给操作系统使用的,并且该功能永远都不可能返回该句
    柄。
系统
Int 67h     功能44h                              LIM spec版本3.0
            映射/不映射内存
把指定给句柄的EMS页映射到调用进程页框中的四个物理页面之一中;或
者通过把某个页面的逻辑页设置为FFFFh,从而不映射该页面,并使得它成
为不可访问的页面
调用寄存器: AH              44h
              AL            物理页号(0-3)
              BX            逻辑页号(以零为基数,FFFFh表示
                            不映射物理页)
              DX            句柄
返回寄存器:如果成功
              AH          00h
              如果未成功
              AH             80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            83h,无效句柄
                            84h,未定义功能
 
686页
                             8Ah,未把逻辑页指定给句柄
                            88h,物理页号无效
注释:逻辑页是通过功能调用43h指定给EMS内存的页面。逻辑页的号为0
至n-1,其中n为所请求的页数。特殊的逻辑页号FFFFh用来指定非映射的
页。
      为0至n-1,其中n为所请求的页数。特殊的逻辑页号FFFFh用来指定
非映射的页。
      在EMS插件板上,程序不能访问页面,因为它们位于计算机的物理地址
空间之外。该功能可把一个逻辑页映射到计算机的物理地址空间内,这样,我
们就可用内存指令来操纵该页区域内的信息。从一个扩充内存插件板中,可以
映射出多达4个物理页(号0-3)。
系统
Int 67h     功能45h                            LIM Spec版本3.0
            解除对句柄和内存的分配
关闭指定句柄,并返回其内存以供其它进程使用。
调用寄存器: AH            45h
              DX          EMS句柄
返回寄存器:如果已成功
              AH          00h
              如果未成功
              AH           80h,EMS软件的内部出错
                          81h,EMS硬件出现了故障
                          83h,无效句柄
                          84h,未定义功能
                          86h,在保存或恢复映射上下文时出错
注释:作为文件关闭操作后EMS内存代名词,这种简单的功能显得极
为重要。由于EMS内存管理程序充当着操作系统的扩充驱动程序的角色,因
此,当程序终止时,操作系统并不关闭打开的EMS句柄。故在终止之前,程序
必须关闭所有已分配给它的EMS句柄。如果它没有这样做的话,则它已分配
的内存将继续保持被分配状态,并且其它的程序不能使用这部分内存。此时,
唯一的释放内存方法是重新引导系统。
      在执行关闭功能时,分配给句柄的内存返回到可用的公共EMS内存中。
如果该功能未能成功地完成,那么这一内存也就没有被返回到公共内存区,必
须继续执行关闭功能。
      大多数程序只是简单地关闭文件而不检查该功能是否成功了。一般来说,
687页
这不会给文件(无论如何都不会对句柄文件造成任何影响,因为在程序终止
时,DOS会关闭文件。但是,使用EMS内存时就必须保证退出代码是正确的,
并且,当该功能未成功时,还必须重试。
系统
Int 67h     功能46h                              LIM Spec版本3.0
            获取EMM版本
返回软件的版本号。
调用寄存器: AH              46h
返回寄存器:如果成功
                AH        00h
                AL           EMM版本号
                如果未成功
                AH           80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            84h,未定义功能
注释:该功能可返回(通过BCB)EMM(扩充内存管理)软件的版本号。AL寄
存器的高4位代表主版本号(十进制小数点左侧部分);低4位则代表次版本
号(十进制小数点右侧部分)。例如,版本3.2通过AL返回32h,版本4.0通过
AL返回40h。必须一直让程序作好准备以接受比已指定给它的更大的版本
号,因为EMS规格要求驱动程序具有向上兼容性。
系统
Int 67h     功能47h                              LIM Spec版本3.0
            保存页面映象
保存EMS硬件映象的当前状态
调用寄存器: AH                47h
                DX            句柄
返回寄存器:如果成功
                AH          00h
                如果未成功
                AH             80h,EMS软件的内部出错
                              81h,EMS硬件出现了故障
                              83h,无效句柄
                              84h,未定义功能
                              8Ch,页映象硬件状态保存区已满
                              8Dh,映象上下文的保存失败,因为它与指定的
 
688页
                                    句柄联系在一起。
      注释:如果正在写常驻程序(TSR)、中断服务例程或使用EMS内存的
    设备驱动程序,那么必须在进行任何EMS操作之前保存好映象硬件的状态,
    这样,其它程序不会干涉对内存的使用。而该功能的作用正是保存映象硬件的
      状态。此外,若想恢复硬件映象,可使用Int67h功能48h。
          该功能只能为LIM规范中的版本3.x所定义的64K页框保存映象寄存
      器状态。因此那些位于LIM-3.x页框之外,且使用可映射的内存区域的应用
      程序,必须使用功能4Eh和4Fh来保存和恢复映象寄存器的状态。
系统
Int 67h     功能48h                              LIM Spec版本3.0
            恢复页面映象
恢复与指定文件句柄相关的EMS硬件映象。
调用寄存器: AH              48h
              DX            句柄
返回寄存器:如果已成功
              AH          00h
返回寄存器:如果未成功
              AH             80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            83h,无效句柄
                            84h,未定义功能
                            8Eh,恢复操作失败,保存区域没有用于
                            句柄的上下文
注释:如果在写常驻程序(TSR),中断服务例程或使用EMS内存的设备驱动
程序,那么在程序终止时,必须恢复映象硬件的状态。如果恢复操作没有成功
就会导致不可预测的结果。例如,在软件执行过程中,使用EMS的应用程序
可能正运行并希望EMS映象寄存器保持不变。而该功能正好恢复映象硬件
的状态。同时,若想保存硬件映象的状态可使用Int 67h,功能47h。
      该功能只能恢复LIM规格的版本3.x所定义的64K页框的映象寄存器
状态。这样,在LIM-3.x页框之外、且使用可映射内存区域的应用程序必须使
用4Eh和4Fh来保存和恢复映象寄存器的状态。
系统
Int 67h     功能49h                              LIM Spec版本3.0
            保留
689页
在EMS标准的版本3.2以及更高的版本中未定义
注释:在早期的LIM/EMS版本中,该功能被用于从EMS硬件中获取页映象
寄存器I/O数组。该功能现在作为保留功能。新的软件不能使用它。
      设计者们已将功能49h和4Ah从EMS规范中删除掉了,因为它们只是
某些Intel EMS插件板上的硬件的特有功能,并且不能保证它们一定能与其
它公司生产的插件板一起工作。在LIM规范的版本4中增加了一些使用新功
能的程序,它们不能使用这两种功能。而那些使用这两种功能的程序将不能与
IBM MicroChannel Architecture(微通道结构)兼容,而只能用于其它的硬件。
系统
Int 67h     功能4Ah                          LIM spec版本3.0
            保留
在EMS标准的版本3.2以及更高的版本中未定义
注释:在早期的LIM/EMS版本中,该功能被用于从EMS硬件中获取逻辑至
物理页的转换数组。该功能现在作为保留功能。新的软件不能使用它。
    如今,功能49h和4Ah已被从EMS规范中删除掉了,因为它们只是某
Intel EMS插件板上的硬件的特有功能,人们无法保证它能与其它公司生产
的插件板一起工作。在LIM规范的版本4中增加了一些使用新功能的程序,
它们不能使用这两种功能。而那些确实在使用这两种功能的程序将不能与
IBM MicroChannel Architecture(微通道结构)兼容,而只能用于其它的硬件。
系统
Int 67h     功能4Bh                          LIM Spec版本3.0
获取句柄计数
返回现用的EMS句柄数
调用寄存器: AH              4Bh
返回寄存器:如果成功
              AH            00h
              BX            现有的EMS句柄数(0-255)
返回寄存器:如果未成功
              AH             80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            84h,未定义功能
注释:该功能可在任意时间返回当前正使用的句柄数是多少。如果BX=0,表
明没有使用扩展内存。 BX的范围为0至255(最大的EMS句柄数)。
      程序对句柄数的解释不是十分清晰的。因为对现有句柄数的需要不如对
 
690页
    使用扩展内存的程序数的需要那么迫切。事实上,不仅没有任何限定条件不允
    许程序使用一个以上的EMS句柄去访问扩展内存,而且,使用1个以上的句
    柄还可以帮助一些程序简化用于数据的管理操作。至于使用该功能是如何确
    定仍然可用的句柄数,一个更为合理的解释为,它是从255中减去BX中的值
    而推算出这个数字的,这样,一个知道它需要多少EMS句柄才能正确地行使
    功能的程序能根据EMS中剩下的句柄数而迅速地判断出它能否行使功能。
系统
Int 67h     功能4Ch                              LIM Spec版本3.0
            获取句柄拥有的页数
确定与指定句柄联系在一起的页数。
调用寄存器: AH              4Ch
              DX            句柄
返回寄存器:如果成功
              AH          00h
              BX            逻辑页数(1-2048)
返回寄存器:如果未成功
              AH             80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            83h,无效句柄
                            84h,未定义功能
注释:任何一个句柄都可引用1至2048个(在LIM4之前为512个)扩
展内存页。由于每个页面代表着16K的内存,因而,一个句柄能访问16K至
32M(LIM4之前为8M)的内存。该功能不可能返回0页,因为扩充内存管理
程序至少必为一个句柄指定一个页。
系统
Int 67h     功能4Dh                              LIM Spec版本3.0
            获取用于所有句柄的页数
返回句柄和用于所有句柄的逻辑页数。
调用寄存器: AH            4Dh
              ES:DI     指向要保存信息的数组(可能需要1020个字节
                          的大小)的指针
返回寄存器:如果成功
              AH        00h
              BX          现有的EMS句柄数组的指针
              如果未成功
691页
                AH          80h,EMS软件的内部出错
                            81h, EMS硬件出现了故障
                            84h,未定义功能
    注释:该功能返回一组数值以指示当前句柄和指定给每个句柄的页数。 EMS
    句柄表是由2个字的项构成的变量号而组成的,每个变量号的排列如下:
字                                    含    义
0                                     EMS句柄
1                                     页数
用于确定EMS句柄表所要求的内存量的公式可表示为4*BX。由于句柄数
最多可达255个,因此,可分配给句柄表的最大内存量为4*255(或1020个
字节)。在这里BX中的数字为有效的表项数,在LIM4系统中,BX不能小于
1,因为其中一直保留着特殊的操作系统句柄;而在早期版本中,如果BX为0,
则表明EMS管理程序处于空闲状态。
      在设置句柄表(为ES:DI所指定的表)时应小心,以免在把表传送给内
存时引起段回绕。若出现了这种情况,其结果自然会引起出错。
系统
Int 67h       功能4Eh   子功能00h                  LIM Spec版本3.0
              获取页映象寄存器
在不使用句柄的前提下把EMS页映象寄存器保存到局部数组中。
调用寄存器: AH            4Eh
                    AL               00h
                    ES:DI          指向要接受信息的数据组的指针
    返回寄存器:    如果成功
                    AH              00h
                    ES:DI          指向已填充了信息的数组的指针
                    如果未成功
                    AH                 80h,EMS软件的内部出错
                                      81h,EMS硬件出现了故障
                                      84h,未定义功能
                                      8Fh,子功能参数无效
    注释: EMM软件的版本3.2中加进了这种功能以支持多任务操作系统如
    Windows和DESQview。功能4Eh允许程序直接访问供EMS插件板内部使用
的页映象信息——一种与硬件密切相关的信息。其中,是数组保存着页映象寄
存器的有关信息和其它控制信息。
 
692页
      多任务操作系统是唯一的一类必须使用页映象信息的程序,没有这类信
    息它们就不能工作。此外,任何单个程序都不能使用这类信息。
      在设置EMS句柄(为ES:DI指定的表)时应小心,以免在把该表传送到
    内存时引起段缠绕。因为出现了这种情况后,其结果是导致出错。
系统
Int 67h       功能4Eh   子功能01h                LIM Spec版本3.2
            设置页映象寄存器
从局部数组中设置出EMS页映象寄存器,而不使用句柄。
调用寄存器: AH              4Eh
                AL          01h
                DS:SI     指向要从中设置出信息的数组的指针
返回寄存器:如果成功
                AH        00h
                如果未成功
                AH           80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            84h,未定义功能
                            8Fh,子功能参数无效
注释: EMM软件的版本3.2中加进了这种功能以支持多任务操作系统如
Windows和DESQview。功能4Eh允许程序直接访问供EMS插件板内部使用
的页映象信息——一种与硬件密切相关的信息。其中是数组保存着页映象寄
存器的有关信息和其它控制信息。
系统
Int 67h     功能4Eh     子功能02h                LIM Spec版本3.0
            获取并设置页映象寄存器
从局部数组中获取EMS页映象寄存器,并同时从另一个数组中设置它们,而
且不使用句柄。
调用寄存器: AH            4Eh
              AL          02h
              DS:SI    指向从中设置信息的数组的指针
              ES:DI    指向要接收信息的数组的指针
返回寄存器:如果成功
              AH          00h
              ES:DI    指向被填充的数组的指针
              如果未成功
693页
                AH           80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            84h,未定义功能
                             8Fh,子功能参数无效
注释: EMM软件的版本3.2中加进了这一功能以支持多任务操作系统如
Windows和DESQview。功能4Eh允许程序直接访问供EMS插件板内部使用
的页映象信息——一种与硬件密切相关的信息。其中,页映象寄存器的有关信
息和其它控制信息都保存在数组中。
系统
Int 67h     功能4Eh   子功能03h                LIM Spec版本3.0
            获取用于页映象数组的大小
获取需要多大的局部数组以保存EMS页映象寄存器。
调用寄存器: AH              4Eh
              AL            03h
返回寄存器:如果成功
              AH            00h
              AL            在页映象数组中的字节数
              如果未成功
              AH             80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            84h,未定义功能
                            8Fh,子功能参数无效
注释: EMM软件的版本3.2中增加了这种功能以支持多任务操作系统,如
Windows和DESQview。功能4Eh允许程序直接访问供EMS插件板内部使用
的页映象信息——一种与硬件密切相关的信息。其中,页映象寄存器的有关信
息和其它控制信息都保存在局部数组中。
      在使用子功能00h、01h或02h以在某个操作过程中交换寄存器时,可先
使用子功能03h来获取所需要的数组大小。
系统
Int 67h     功能4Fh   子功能00h              LIM Spec版本4.0
            获取部分页映象
仅仅保存指定的可交换内存区域部分映象上下文;它比处理所有可交换内存
的功能4E要快得多。
694页
      调用寄存器: AH            4Fh
                  AL           00h
                  DS:SI      指向页列表的指针
                  ES:DI      指向目标数组的指针
      返回寄存器:如果成功
                  AH          00h
                  ES:DI      指向被填充的数组的指针
                  如果未成功
                  AH             80h,EMS软件的内部出错
                                81h,EMS硬件出现了故障
                                84h,未定义功能
                                8Bh, 指定的段之一是不可映射的段
                                8Fh,子功能参数无效
                                A3h,部分页映象结构出错
      注释:调用该功能时,系统会传送给它两个指针,一个指向将被映象的段列
      表,另一个指向将保存映象的数组。页列表是由一个保存着列表内页数计数的
      字后加许多其它的字组成的,在这些其它的字中,每个字都保存着一个将被映
      射页的号。
          目标数组必须至少保存有子功能03h(获取部分页映象大小)所返回的字
      节数。其格式并不是LIM 4指定的,因为这个数组的唯一用途是为子功能01h
      (设置部分页映象)提供输入。
系统
Int 67h     功能4Fh     子功能01h                LIM Spec版本4.0
            设置部分页映象
恢复由子功能00h保存的部分映象上下文;其速度比处理所有可映射内存的
功能4E要快得多。
调用寄存器: AH            4Fh
                    AL              01h
                    DS:SI          指向源数组
返回寄存器:        如果成功
                    AH                00h
                    如果未成功
                    AH                 80h,EMS软件的内部出错
                                      81h,EMS硬件出现了故障
                                      84h,未定义功能
                                      8Fh,子功能参数无效
695页
注释:在调用该功能时,系统只传送给它一个指向数组的指针,其中,该数组
的映象是由子功能00h保存的。该数组的格式不是由LIM 4指定的,因为它
的唯一用途是为这一子功能提供输入信息。有了这些输入内容后,该子功能就
能恢复保存在这一数组中的每个页面映象。
系统
Int 67h       功能4Fh   子功能02h                  LIM Spec版本4.0
              获取部分页映象大小
返回一个字节计数,表明使用子功能00h而要求用来保存页映象的数组有多
大。
调用寄存器: AH              4Fh
              AL           02h
              BX            页列表中的页数
返回寄存器:如果成功
              AH            00H
              AL          子功能00h和01h请求用于数组的字节数
              如果未成功
              AH             80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            84h,未定义功能
                            8Bh,在系统中除开物理页以外的指定页数
                           8Fh,子功能参数无效
注释:该功能指示要想实现部分页映象得要求多大的数组。必须在设置部分
页映象功能之前调用该功能以检查传送给前者的数组在大小上是否足够。
系统
Int 67h       功能50h   子功能00h                  LIM Spec版本4.0
              映射/不映射多个句柄页(物理页号模式)
通过使用物理页号的方法把逻辑页映射或不映射成物理页。
调用寄存器: AH              50h
              AL          00h
              CX            要处理的页数
              DX            EMM句柄
              DS:SI      指向逻辑页/物理页对应表
返回寄存器:如果成功
              AH          00h
696页
                  如果未成功
                  AH           80h,EMS软件的内部出错
                              81h,EMS硬件出现了故障
                              83h,不能找到指定的EMM句柄
                              84h,未定义功能
                              8Ah,逻辑页不在指定范围内
                              8Bh,指定段之一是不可映射的
                              8Fh,子功能参数无效
    注释:该功能是LIM 3.2(映射句柄的单个页面)的扩展功能,能在一次调
    用过程中处理多个页面。由DS:SI指定的通信列表是由每个将被映射或不
    映射页的字对组成的;每个字对中的第一个字可以是指定的逻辑页号或者在
    不映射页时可为FFFFh;第二个字为对应的物理页号。两个字的值都以0为
    基数。
系统
Int 67h     功能50h     子功能01h                LIM Spec版本4.0
            映射/不映射多个句柄页(段地址模式)
通过使用段地址方法,把逻辑页映射或不映射成物理页
调用寄存器: AH                50h
                AL            01h
                CX            要处理的页数
                DX            EMM句柄
                DS:SI      指向逻辑页/段地址对照表
返回寄存器:如果成功
                AH          00h
                如果未成功
                AH             80h,EMS软件的内部出错
                              81h,EMS硬件出现了故障
                              83h,未能找到指定的EMM句柄
                              84h,未定义功能
                              8Ah,逻辑页不在指定范围内
                              8Bh,指定段之一是不可映射的
                              8Fh,子功能参数无效
注释:该功能是子功能00h的备用功能,两者的结果相同,只是该功能有
时更易于使用。由DS:SI指定的通信列表是由每个将被映射或不映射页的
字对组成的,每个字对中的第一个字可以是指定的逻辑页号,或者在不映射页
时,可为FFFFh;第二个字为将被映射或不映射的页所处于的段地址。逻辑值
697页
是以0为基数的,但段地址是那些通过功能58h(获取可映射的物理地址数
组)获取的地址,必须将它们一一对应好。
系统
Int 67h     功能51h                          LIM Spec版本4.0
            重新分配页
    允许应用程序增加或减少已分配给EMM句柄的页数。
    调用寄存器: AH        51h
              BX          所期望的逻辑页数
              DX          EMM句柄
    返回寄存器:如果成功
                    AH            00h
                    BX              已分配的逻辑页数
                    如果未成功
                    AH               80h,EMS软件的内部出错
                                    81h,EMS硬件出现了故障
                                    83h,未能找到指定的EMM句柄
                                    84h,未定义功能
                                    87h,系统内没有足够的页数
                                    88h,可用的页数不够
    注释:该功能允许出现下列四种情况之一,即:新的页计数可以为0;可以比
    初始计数小;等于初始计数或大于初始页计数。如果页计数为0,那么句柄虽
    然还是打开的,但其所有的页都被返回到可用的公共区。在其余三种情况下,
    所有在完成该功能之后而分配的页数形成了一个以0为基数的连续页数序
    列。
      句柄确定将分配哪种类型的逻辑页;如果当初是用功能43h或功能5Ah,
    子功能00h来分配页面的话,它们就是16K标准页。如果是通过功能5Ah,子
    功能01h来分配的话,那么这类页应为原始页,并且它们的大小由EMS软件
    指定。
系统
Int 67h     功能52h   子功能00h              LIM Spec 版本4.0
            获取句柄属性
返回与句柄有关的属性。
调用寄存器: AH              52h
              AL          00h
              DX            EMM句柄
698页
    返回寄存器:如果成功
                AH         00h
                AL            与指定的EMM句柄相关的属性
                              0,易丢失属性
                              1,不易丢失属性
                如果未成功
                AH            80h,EMS软件的内部出错
                              81h,EMS硬件出现了故障
                              83h,未能找到指定的EMM句柄
                              84h,未定义功能
                              8Fh,子功能参数无效
                              91h,系统不支持功能
    注释:该功能是一种备选功能,大多系统可能不支持它,原因在于硬件会防止
    热引导操作遗留下任何内存内容。如果该功能不可用,它将返回AH=91h。
        如果该功能可用,子功能00h会通过AL返回与指定句柄有关的当前属
    性。易丢失(AL=0)表明句柄的内容将在热引导操作中丢失,而不易丢失(AL
    =1),表明这一内容不会在热引导操作中丢失。
系统
Int 67h       功能52h   子功能01h                  LIM Spec版本4.0
              设置句柄属性
设置与句柄有关的属性。
调用寄存器: AH                52h
                AL           01h
                BL          指定的EMM句柄的新属性
                              0,易丢失
                              1,不易丢失
                DX          EMM句柄
返回寄存器:如果成功
                AH          00h
                如果未成功
                AH             80h,EMS软件的内部出错
                              81h,EMS硬件出现了故障
                               83h,未能找到指定的EMM句柄
                              84h,未定义功能
                              8Fh,子功能参数无效
                              90h,非0或1属性
699页
                          91h,系统不支持功能
注释:该功能是一种备选功能,大多系统可能不支持它,原因在于硬件会防止
热引导操作遗留下任何内存内容。如果该功能不可用,它将返回AH=91h。
    如果该功能可用,子功能00h会通过AL返回与指定句柄有关的当前属
性。易丢失(AL=0)表明句柄的内容将在热引导操作中丢失,而不易丢失(AL
=1),表明这一内容不会在热引导操作中丢失。
系统
Int 67h    功能52h  子功能02h           LIM Spec 版本4.0
          获取属性功能
返回系统的属性功能。
调用寄存器: AH            52h
              AL          02h
返回寄存器:如果成功
              AH        00h
              ES:DI    指向填有内容的数组的指针
              AL        EMS软件和硬件的属性功能
                          0,只支持易丢的句柄
                          1,支持易丢失和不易丢失的句柄
              如果未成功
              AH           80h,EMS软件的内部出错
                          81h,EMS硬件出现了故障
                          83h,未能找到指定的EMM句柄
                          84h,未定义功能
                          8Fh,子功能参数无效
注释:子功能02h通过AL返回EMS软件和硬件的属性功能。若AL的值为
0,表明系统只支持易丢失的句柄;值为1表明既支持易丢失句柄也支持不易
丢失的句柄。
系统
Int 67h     功能53h 子功能00h              LIM Spec 版本 4.0
            获取句柄名
获取与指定的EMM句柄相关的8字符名字。
调用寄存器: AH          53h
                  AL             00h
                  DX              EMM句柄
700页
                ES:DI     指向将接收句柄名的8字节缓冲区
    返回寄存器:如果成功
                AH        00h
                如果未成功
                AH           80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            83h,未能找到指定的EMM句柄
                            84h,未定义功能
                            8Fh,子功能参数无效
    注释:该功能可获取与指定句柄相关的名字。该句柄的长度总是为8个字符,
    并且每个字符可以为任意的8位值;该名字并没有规定要使用ASCII字符集
    中的哪些字符。当分配或重新分配某个句柄时,系统会将该句柄名初始化为8
    个NUL(00h)字符;根据定义,与这种字符串相关的句柄没有名字。当把某个
    名字指定给一个句柄时,至少要求8个字节中必须有1个是非0字节,以便与
    “无名”情况区别开来。
系统
Int 67h     功能53h   子功能01h                LIM Spec版本4.0
            设置句柄名
    设置与指定的EMM句柄相关的8字符名字
    调用寄存器: AH          53h
                AL          01h
                DX          EMM句柄
                ES:DI    指向8字节的句柄名
    返回寄存器:如果成功
                AH        006
                如果未成功
                AH           80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            83h,未能找到指定的EMM句柄
                            84h,未定义功能
                            8Fh,子功能参数无效
                            A1h,复制现有的名字
    注释:该功能可获取与指定句柄相关的名字。该句柄名的长度为8个字符,并
    且每个字符可以为任意的8位值;也就是说,出现在句柄名中的字符可以是
    ASCII字符集中的任何一个字符。当分配或重新分配某个句柄时,系统会将该
 
701页
句柄名初始化为8个NUL(00h)字符;根据定义,与这种字符串相关的句柄没
有名字。因此,若某个名字指定给一个句柄时,至少要求8个字节中必须有1
个不是0,以便与“无名”情况区别开来。
系统
Int 67h     功能54h     子功能00h                LIM Spec版本4.0
            获取句柄目录
复制一份用于所有打开的EMM句柄的局部句柄目录拷贝。
调用寄存器: AH            54h
                  AL              00h
                  ES:DI           指向目标数组
返回寄存器:        如果成功
                    AH            00h
                    AL              数组中的项数(与打开的句柄数相同)
                    ES:DI         指向已填充内容的数组的指针
                    如果未成功
                    AH               80h,EMS软件的内部出错
                                    81h,EMS硬件出现了故障
                                    83h,未能找到指定的EMM句柄
                                    84h,未定义功能
                                    8Fh,子功能参数无效
注释:子功能00h能把所有现用的句柄及其相关的名字拷贝到一到一个数组
中(一个EMM句柄至名称目录的拷贝)。该数组中每一项的格式为:前面是一
个保存着EMM句柄的字,随后为保存着句柄名的8个字节。在调用子功能
00h时,数组的大小按字节计算为打开的句柄数的10倍。
系统
Int 67h     功能54h     子功能01h                LIM spec版本4.0
            找到有名句柄
给定一个句柄名,该功能就会返回句柄值。
调用寄存器: AH           54h
              AL          01h
              ES:DI     指向句柄名的指针
返回寄存器:如果成功
              AH        00h
              DX          与指定名字相关的EMM句柄
              如果未成功
 
702页
                AH            80h,EMS软件的内部出错
                              81h,EMS硬件出现了故障
                              84h,未定义功能
                              8Fh,子功能参数无效
                              A0h,未能找到句柄
                              A1h,句柄没有名字
    注释:子功能01h将搜索句柄名目录以寻找指定的句柄名,并且,如果找
    到了,它将返回相关的句柄值。在调用该功能时,DS:SI所指定的一个8字节
    字符串就是该功能要搜索的名字。
系统
Int 67h       功能54h   子功能02h                  LIM Spec版本4.0
              获取句柄计数
返回内存管理程序系统所支持的总句柄数。
调用寄存器: AH             54h
                AL         02h
返回寄存器:如果成功
                AH        00h
                BX            所支持的句柄数
                如果未成功
                AH             80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            84h,未定义功能
                              8Fh,子功能参数无效
注释:子功能02h能返回系统所能分配的最多的句柄数,包括保留的操
作系统句柄0。该功能还可用来确定支持子功能00h(获取句柄目录)所需要的
最大数组大小。
系统
Int 67h     功能55h                              LIM Spec版本4.0
            改变页映象并跳转
永久性地改变页映象,并传送控制
调用寄存器: AH              55h
              AL           物理/段选择符
                            0,使用的物理页数
                            1,使用的段地址
              DX            EMM句柄
703页
                ES:DI       指向映象/跳转结构的指针
    返回寄存器:如果成功
                AH          00h
                如果未成功
                AH            80h,EMS软件的内部出错
                              81h,EMS硬件出现了故障
                              83h,未能找到指定的EMM句柄
                              84h,未定义功能
                              8Ah,逻辑页不在指定范围内
                              8Bh,物理页不在指定范围内
                              8Fh,子功能参数无效
        注释:该功能通过改变页映象并把控制传送到映象区域内,以允许
    应用程序从EMS内存中运行。其效果与汇编语言FAR JUMP的操作相同。
    在此过程中,在调用该功能之前就存在的内存映象上下文将会被丢失。
        在输入功能55h时,DX保存着EMM句柄,并且DS:SI指向一种映象/
    跳转结构,该结构的布局如下表所示:
字节偏移值        字段长度            含    义
00h             双字            指向系统将把控制权传送给它的地址的指针
04h             字节            映象数组中字对的数目
05h             双字            指向映象数组的远指针
映象数组是一个可根据传送给AL的值而把逻辑页映射成物理页或段地址的
字对集,其大小是可改变的。该数组的排列如下表所示:
字节偏移值      字段长度            含    义
00h             字              将被映射的逻辑页号
04h             字              根据AL值的不同,分别为物理页号或地址
在所有不含所需参数的寄存器中的值能在跳转过程中保持不变,各种标志寄
存器的值也不会改变。
系统
Int 67h     功能56h                            LIM Spec版本4.0
            改变页映象和调用
暂时改变页映象并传送控制权;在该功能返回时系统会恢复页映象。
调用寄存器: AH            56h
              AL          物理页/段选择开关
 
704页
                              0,所使用的物理页号
                              1,所使用的段地址
                DX            EMM句柄
                DS:SI      指向映象/跳转结构
返回寄存器:如果成功
                AH          00h
                如果未成功
                AH             80h,EMS软件的内部出错
                              81h,EMS硬件出现了故障
                              83h,未能找到指定的EMM句柄
                              84h,未定义功能
                              8Ah,逻辑页不在指定范围内
                              8Bh,物理页不在指定范围内
                              8Fh,子功能参数无效
    注释:该功能通过改变页映象并接着把控制权传送到映象区域内便能允许应
    用程序从EMS内存中运行。其效果与汇编语言FARCALL操作相同。不过,
    在使用该功能之前就存在的内存映象上下文却得到了保存;并且在从调用进
    程中返回时,系统可通过一种普通的RETF(RET FAR)操作来恢复这一内存
    映象上下文。
        在输入该功能时,DX保存着EMM句柄,DS:SI则指向一种映象/跳转
    结构,该结构的布局如下:
字节偏移值      字段长度            含    义
00h             双字            指向系统将把控制权传送给它的地址的远指针
04h             字节            新的映象数组中字对的数目
05h             双字            指向映象数组的远指针
09h             字节            旧映象数组字对的数目
0Ah             双字            指向旧映象数组的远指针
0Eh              4字            保留;供EMS软件使用
根据传送给AL的值的不同,每个映象数组都是一个可把逻辑页映射成物理
页号或段地址的字对集,并且字对集的大小各不相同。其中,新映象数组指定
其上下文将用于对该功能的调用中,并且旧映象数组保留着初始化的上下文,
以便在调用完毕后,系统能恢复原有的上下文。这些数组的排列如下:
字节偏移值      字段长度            含    义
00h             字              将被映象的逻辑页号
04h             字              根据AL的值,要么为物理页号,或者是段地址
705页
    对所有不含所需参数的寄存器来说,他们的值不会因跳转改变,同样地,标志
    寄存器的值也不会改变。
系统
Int 67h       功能56h   子功能02h                  LIM Spec版本4.0
              获取堆栈空间大小
返回功能56h的另一个子功能所需的堆栈空间的字节数。
调用寄存器: AH              56h
              AL           02h
返回寄存器:如果成功
              AH          00h
              BX            改变映象和调用的子功能所请求的堆栈
                            空间的字节数
              如果未成功
              AH            80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            83h,未能找到指定的EMM句柄
                            84h,未定义功能
                            8Fh,子功能参数无效
注释:该功能通过BX返回一个必须加给堆栈指针的值以便从该堆栈中删除
所有被保存的元素的堆栈大小字节数。必须在使用“改变页映象和调用”功能
之前调用该功能,以便根据其返回值来改正SP的值。
系统
Int 67h     功能57h     子功能00h                LIM Spec版本4.0
            移动内存区域
移动内存区域
调用寄存器: AH                57h
                AL          00h
                DS:SI      指向要移动的参数块
返回寄存器:如果成功
                AH            00h,未遇到任何问题
                              92h,覆盖,源已遭破坏
                如果未成功
                AH             80h,EMS软件的内部出错
706页
                            81h,EMS硬件出现了故障
                            83h,未能找到指定的EMM句柄
                            84h,未定义功能
                            8Ah,逻辑页不在指定范围内
                            8Fh,子功能参数无效
                            93h,用于句柄的区域太大
                            94h,常规和扩展内存区域重叠
                            95h,逻辑页中的偏移值超出了逻辑页
                            96h,长度超过了1M字节
                            98h,未定义源和目标类型
                            A2h,出现了1M环绕情况,未移动数据
注释:该功能可把一个内存区域的内容移动到另一个内存区域中,并重写最
初定位在目标区域的内容。移动操作可以是常规内存区域和扩展内存区域的
任意组合,即可以为“常规至常规、常规至扩展、扩展至常规或扩展至扩展”。
      实现该功能不要求改变页映象;在该功能的操作过程中,页映象的当前语
境可从头至尾保持不变。移动区域的长度可以为0至1M字节,不过通常为
16K字节的倍数。
      如果源句柄和目标句柄相同,那么在开始移动操作之前,系统将检查源区
域和目标区域是否重叠。如果存在重叠现象,那么移动的方式就会是这样:即
目标区域接收源的完整拷贝,而源会在处理过程中遭到破坏。并且,如果情况
是这样的话,系统会返回一个状态代码,以指明出现了重叠。
      该功能的操作是由DS:SI指定的参数块控制的。该参数块的布局如下:
字节偏移值      字段长度            含    义
00h             双字              要移动的字节数
04h             字节              源内存类型(0=常规、1=扩展,其余未定义)
05h             字                源句柄
07h             字                源初始偏移值
09h             字                源段或页;如果源内存为常规内存;该字为段地
                                  址;如果为扩展内存,则该字为逻辑页号
0Bh            字节              目的内存类型(0=常规、1=扩展,其余未定义
0Ch             字                目的句柄
0Eh             字                目的初始偏移值
10h             字                目的段或页;如果目的内存为常规内存,该字为
                                  段地址;如果为扩展内存,则该字为逻辑页号
707页
系统
Int 67h     功能57h     子功能01h              LIM Spec版本4.0
            交换内存区域
互换两个内存区域
调用寄存器: AH              57h
              AL            01h
              DS:SI      指向要移动的参数块
返回寄存器:如果成功
              AH             00h,未遇到任何问题
              如果未成功
              AH             80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            83h,未能找到指定的EMM句柄
                            84h,未定义功能
                            8Ah,逻辑页不在指定范围内
                            8Fh,子功能参数无效
                            93h,用于句柄的区域太大
                            94h,常规和扩展内存区域重叠
                            95h,逻辑页中的偏移值超出了逻辑页
                            96h,长度超过了1M字节
                            97h,源和目的区域重叠
                            98h,未定义源和目标类型
                            A2h,出现了1M环绕情况,未移动数据
注释:该功能可把一个内存区域的内容与另一个内存区域中的内容进行对
换。对换的对象可以由常规内存和扩充内存按任意方式组成,即可以为“常规
至常规、常规至扩充、扩充至常规或扩充至扩充”。
      实现该功能不要求改变页映象;在该功能的操作过程中,页映象的当前语
境可从头至尾保持不变。移动区域的长度可以为0至1M字节,不过通常为
16K字节的倍数。
      如果源和目标句柄相同,那么在开始移动操作之前,系统将检查源区域和
目标区域是否重叠。如果存在重叠现象,则无交换行为发生,并且系统会返回
一种错误状态。
      该功能的操作是由DS:SI指定的参数块控制的。该参数块的布局如下:
708页
字节偏移值      字段长度            含    义
00h               双字            要移动的字节数
04h               字节            源内存类型(0=常规、1=扩展,其余未定义)
05h               字              源句柄
07h               字              源初始偏移值
09h               字              源段或页;如果源内存为常规内存;该字为段地
                                  址;如果为扩展内存,则该字为逻辑页号
0Bh               字节              目的内存类型(0=常规、1=扩展,其余未定义
0Ch               字                目的句柄
0Eh               字                目的初始偏移值
10h               字                目的段或页;如果目的内存为常规内存,该字为
                                  段地址;如果为扩展内存,则该字为逻辑页号
系统
Int 67h     功能58h     子功能00h                  LIM Spec版本4.0
            获取可映射的物理地址数组
返回一个数组,该数组保存着系统内每个可映射物理页的物理页号和段地址。
调用寄存器: AH            58h
              AL        00h
              ES:DI     指向目的数组
返回寄存器:如果成功
              AH        00h
              CX          数组中的项数
              ES:DI    指向已填充内容的数组的指针
              如果未成功
              AH          80h,EMS软件的内部出错
                          81h,EMS硬件出现了故障
                          84h,未定义功能
                          8Fh,子功能参数无效
注释:该功能可把由段地址与物理页号组成的相关字对填充到用户指定的数
组中。该数组是按段顺序排列而成的,不能将它简化为物理页号顺序。该数组
中的每个字对都具有如下结构:
字节偏移值      字段长度            含    义
00h             字                可映射物理页的段地址
02h             字                与页有关的逻辑页号
709页
系统
Int 67h     功能58h     子功能01h                LIM Spec版本4.0
            获取可映射的物理页地址数组的大小
返回调用于功能00h将会返回的项数。
调用寄存器: AH              58h
              AL            01h
返回寄存器:如果成功
              AH            00h
              CX            数组中的项数
              如果未成功
              AH             80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            84h,未定义功能
                            8Fh,子功能参数无效
注释:该功能通过CX返回数组中的项数,该项数与调用子功能00h所返回
的项数相同。将这一返回值乘上4即可得出指定给子功能00h的数组所需的
字节数。
系统
Int 67h     功能59h     子功能00h                LIM Spec版本4.0
            获取扩充内存硬件信息
返回硬件配置数组
调用寄存器: AH                59h
                AL          00h
                ES:DI      指向目的数组
返回寄存器:如果成功
                AH            00h
                如果未成功
                AH             80h,EMS软件的内部出错
                              81h,EMS硬件出现了故障
                              84h,未定义功能
                              8Fh,子功能参数无效
                              A4h,操作系统禁止了对该功能的访问
注释:该功能可把系统的硬件配置信息填入一个5字数组。在输入该功能时,
ES:DI所指定的目的数组的布局如下表所示:
 
710页
字节偏移值    字段长度        含    义
00h             字          按节(16字节)计算可映射物理页的原始大小
02h             字          可用的备用映象寄存器集合数
04h             字          保存映象上下文所需的字节数
06h             字          能指定给DMA通道的寄存器集合数
08h             字          如果DMA寄存器集合是按功能5Bh所介绍的方式来
                            工作的话,则该字为0;若硬件只有一个DMA寄存器集
                            合,该字为1. LIM标准插件板在此处有一个0值。
系统
Int 67h     功能59h   子功能01h                  LIM Spec版本4.0
            获取未分配的原始页计数
返回未分配的原始可映射页数和原始页总数
调用寄存器: AH                59h
                AL            01h
返回寄存器:如果成功
                AH          00h
                BX            可使用的原始页数
                DX             EMS中原始页的总数
                如果未成功
                AH             80h,EMS软件的内部出错
                              81h,EMS硬件出现了故障
                              84h,未定义功能
                              8Fh,子功能参数无效
注释:一些EMS硬件所拥有的页大小为标准16K字节的若干分之一。可用
一个术语“原始页”来描述这类非标准的页大小。该功能能返回可供使用的原
始页计数。而当硬件使用标准页大小时,该功能的作用便与功能42h(获取页
计数)相同。
系统
Int 67h     功能5Ah     子功能00h                LIM Spec版本4.0
            分配标准页
在把所需的标准页数分配给进程之后,该功能将返回句柄。
调用寄存器: AH            5Ah
              AL        00h
              BX          所期望的页数
711页
返回寄存器:如果成功
              AH            00h
              DX            EMM句柄
              如果未成功
              AH             80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            83h,未能找到指定的EMM句柄
                            84h,未定义功能
                            85h,所有的EMM句柄都已投入使用
                            87h,系统中没有足够的页数
                            88h,可用的页数不够
                            8Fh,子功能参数无效
注释:该功能可把所需的标准(16K)页数分配给调用进程使用,并返回该进
程用于引用指定内存的唯一句柄,这一过程与文件打开过程相似。
系统
Int 67h     功能5Ah   子功能01h              LIM spec版本4.0
            分配原始页
在把所需的原始页数分配给进程之后返回句柄。
调用寄存器: AH              5Ah
              AL            01h
              BX          所期望的页数
返回寄存器:如果成功
              AH            00h
              DX          EMM句柄
              如果未成功
              AH           80h,EMS软件的内部出错
                          81h,EMS硬件出现了故障
                          84h,未定义功能
                          85h,所有的EMM句柄都已投入使用
                          87h,系统中没有足够的页数
                          88h,可用的页数不够
                          8Fh,子功能参数无效
注释:该功能可把所需的原始(非标准的)页数分配给调用进程使用,并返回
该进程用于引用指定内存的唯一句柄,这一过程与文件打开过程相似。而应用
 
712页
程序却不能使用这一子功能,原因在于不同的EMS插件板可能有不相同的
原始页大小;因此,只能使用标准页来调用应用程序。
系统
Int 67h     功能5Bh    子功能00h                LIM Spec版本4.0
            获取备用的映象寄存器
只能用于操作系统以控制EMS硬件的使用。可获取备用的映象寄存器集
调用寄存器: AH            5Bh
            AL        00h
返回寄存器:如果成功
            AH        00h
            BL            如果为非零值,则为当前备用的映象寄存器集
                          号,并且该功能未使用ES:DI。如果为0,则
                        ES:DI的设置如下:
            ES:DI     指向操作系统指定的上下文保存区域,
                        该区域保存着系统所有插件板的全部映象
                          寄存器和用于恢复该插件板的初始状态所
                          需的任何其它数据
            如果未成功
            AH            80h,EMS软件的内部出错
                          81h,EMS硬件出现了故障
                          84h,未定义功能
                          8Fh,子功能参数无效
                        A4h,操作系统禁止了对该功能的访问
注释:该功能只能由操作系统使用,并且操作系统可在任意时间里通过
调用功能5Dh-OS/E功能来禁止该功能。子功能00h的操作细节极其复
杂,因此,在使用时用户应参照正式的LIM 4说明书。
系统
Int 67h     功能5Bh    子功能01h                LIM Spec版本4.0
            设置备用的映象寄存器
一种只能供操作系统用于控制对EMS硬件的使用的功能;能设置备用的映
象。
调用寄存器: AH              5Bh
              AL            01h
              BL            若新的备用映象寄存器集合号为0,则ES:DI
713页
                          保存有指向保存区域的指针,该保存区域保存
                          着全部所需的信息。若集合号为<>0,则指定
                          要激活的备用映象寄存器;并且如果可能,激活
                          该寄存器子功能01h就会作出响应。此时,系
                          统未改变并忽视了ES:DI的内容。
返回寄存器:如果成功
                    AH                00h
                    如果未成功
                    AH                 80h,EMS软件的内部出错
                                    81h,EMS硬件出现了故障
                                      84h,未定义功能
                                      8Fh,子功能参数无效
                            9Ah,系统支持所请求的寄存器
                            9Ch,系统不支持所有备用寄存器,并且
                            BL的值不是0。
                            9Dh,未定义或/和未分配所请求的寄存器集
                            A3h,恢复数组,或指针指定的数组出错
                            A4h,操作系统禁止了对该功能的访问
注释:该功能只能由操作系统使用,并且操作系统可在任意时间通过调用功
能5Dh(一种OS/E功能)来废除它。该功能的具体操作方法极其复杂,因此,
在使用时,用户应以正式的LIM4说明书作为参照。
系统
Int 67h     功能5Bh   子功能02h              LIM spec版本4.0
            获取备用的映象寄存器集合的大小
一种只能供操作系统用于控制使用EMS硬件的功能;能获取备用的映象的
保存数组
调用寄存器: AH          5Bh
                  AL             02h
返回寄存器:如果成功
                  AH              00h
                  DX              将被传送到指定内存区域的字节数,该内存区
                                  域是在调用获取、设置或获取并设置子功能
                                  时,由操作系统指定的。
                  如果未成功
                  AH               80h,EMS软件的内部出错
                                  81h,EMS硬件出现了故障
 
714页
                            84h,未定义功能
                            8Fh,子功能参数无效
                            A4h,操作系统禁止了对该功能的访问
注释:该功能只能由操作系统使用,并且操作系统可在任意时间通过调用功
能5Dh(一种OS/E功能)来废除它。该功能的具体操作方法极其复杂,因此,
在实际使用时,用户应以正式的LIM 4说明书作为参照。
系统
Int 67h     功能5Bh     子功能03h                LIM Spec版本4.0
            分配备用的映象寄存集
只能供操作系统用来控制使用EMS硬件;可分配备用的映象寄存器集。
调用寄存器: AH            5Bh
              AL          03h
返回寄存器:如果成功
              AH          00h
              BL          备用映象寄存器集合号;如果为可用的寄存器
                          集合,则BL值为0
              如果未成功
              AH           80h,EMS软件的内部出错
                          81h,EMS硬件出现了故障
                          84h,未定义功能
                          8Fh,子功能参数无效
                          9Bh,所有备用的映象寄存器集合都已经被
                          分配完毕
                          A4h,操作系统禁止了对该功能的访问
注释:该功能只能由操作系统使用,并且操作系统可在任意时间通过调用功
能5Dh(一种OS/E功能)来禁止它。该功能的具体操作方法极其复杂,因此,
在实际使用时,用户应以正式的LIM 4说明书作为参照。
系统
Int 67h       功能5Bh  子功能04h                LIM Spec版本4.0
              解除对备用的映象寄存器的分配
只能供操作系统用于控制对EMS软件的使用;可解除对备用的映象寄存器
集合的分配
调用寄存器: AH            5Bh
              AL          04h
715页
              BL            要重新分配的备用映象寄存器数目,不能为0
返回寄存器:如果成功
              AH          00h
              如果未成功
              AH             80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            84h,未定义功能
                            8Fh,子功能参数无效
                            9Ch,系统不支持所有备用寄存器,并且
                            BL的值不是0。
                            9Dh,未定义或未分配所请求的寄存器集
                            A4h,操作系统禁止了对该功能的访问
注释:该功能只能由操作系统使用,并且操作系统可以随时使用功能5Dh(一
种OS/E功能)来禁止它。该功能的具体操作方法极其复杂,因此,在实际使用
时,用户应以正式出版的LIM 4说明书为参照。
系统
Int 67h     功能5Bh    子功能05h                LIM Spec版本4.0
            分配DMA寄存器集合
只能供操作系统用来控制对EMS硬件的使用;可分配DMA寄存器集合
调用寄存器: AH            5Bh
                    AL               05h
    返回寄存器:    如果成功
                    AH             00h
              BL            已分配的DMA寄存器集合号。如果没有可用
                          的集合则BL的值为0
              如果未成功
              AH           80h,EMS软件的内部出错
                          81h, EMS硬件出现了故障
                          84h,未定义功能
                          8Fh,子功能参数无效
                          9Bh,所有DMA寄存器均被分配了
                          94h,操作系统禁止了对该功能的访问
注释:该功能只能由操作系统使用,并且操作系统可在任意时间通过功能
5Dh(一种OS/E功能)来禁止它。该功能的具体操作方法极其复杂,因此,在
实际操作中,用户应参照正式出版的LIM 4的使用说明。
 
716页
系统
Int 67h     功能5Bh    子功能06h              LIM Spec版本4.0
            允许DMA寄存器集
    一种只能供操作系统用于控制对EMS硬件的使用的功能;可允许DMA使用
    备用的寄存器集。
    调用寄存器: AH          5Bh
                      AL              06h
                BL          将被允许的DMA寄存器集合号;如果为0,表
                            明在指定通道上未对DMA采取任何特殊的措
                            施
                DL          与指定集相关的DMA通道号
    返回寄存器:如果成功
                      AH                00h
                      如果未成功
                      AH                 80h,EMS软件的内部出错
                                        81h,EMS硬件出现了故障
                                        84h,未定义功能
                                        8Fh,子功能参数无效
                            9Ah,系统不支持指定的备用DMA寄存器
                            集合
                            9Ch,系统不支持所有的备用寄存器集合,并且
                            BL的值不是0。
                            9Dh,要么未定义或者未分配所请求的
                            DMA寄存器集合
                            9Eh,系统不支持专用的DMA通道
                            9Fh,系统不支持指定的DMA通道
                            A4h,操作系统禁止了对该功能的访问
    注释:该功能只能由操作系统使用,并且操作系统可随时通过调用功能5Dh
    (一种OS/E功能)来禁止它。该功能的具体操作方法极其复杂,因此,在实际
    操作中用户最好以正式出版的LIM 4说明书作为参照。
系统
Int 67h     功能5Bh  子功能07h                LIM Spec版本4.0
            禁止DMA寄存器集
只能供操作系统用来控制对EMS硬件的使用;它能禁止DMA使用备用寄存
717页
调用寄存器: AH              5Bh
                AL         07h
                BL          要禁止的DMA寄存器集合号;如果为0,表明
                            未采取禁止操作
返回寄存器:如果成功
                AH        00h
                如果未成功
                AH           80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            84h,未定义功能
                            8Fh,子功能参数无效
                            9Ah,系统不支持指定备用DMA寄存器集
                            9Ch,系统不支持备用的DMA寄存器集
                            9Dh,要么未定义或者未分配所请求的
                            DMA寄存器集
                            9Eh,系统不支持专用的DMA通道
                            9Fh,系统不支持指定的DMA通道
                            A4h,操作系统禁止了对该功能的访问
注释:该功能只能由操作系统使用,并且操作系统可随时通过调用功能5Dh
(一种OS/E功能)来禁止它。该功能的具体操作方法极其复杂,因此,在操作
中,用户应以正式出版的LIM 4说明书作为参照。
系统
Int 67h     功能5Bh    子功能08h                LIM Spec版本4.0
            解除对DMA寄存器集的分配
只能供操作系统用来控制对EMS硬件的使用;可解除对DMA寄存器的分
配。
调用寄存器: AH            5Bh
              AL         08h
              BL          将被解除分配的DMA寄存器集合号
返回寄存器:如果成功
                  AH              00h
                  如果未成功
                  AH                 80h,EMS软件的内部出错
                                    81h,EMS硬件出现了故障
                                    84h,未定义功能
                                    8Fh,子功能参数无效
 
718页
                            9Ch,系统不支持DMA寄存器集,并且
                          BL的值不是0。
                            9Dh,要么未分配或者未定义所请求的
                          DMA寄存器集
                          A4h,操作系统禁止了对该功能的访问
    注释:该功能只能由操作系统使用,并且操作系统可随时通过调用功能5Dh
    (一种OS/E功能)来禁止它。该功能的具体操作方法极其复杂,因此,在实际
    操作中,用户应以正式出版的LIM 4说明书作为参照。
系统
Int 67h     功能5Ch                        LIM spec版本4.0
            为热引导准备硬件
为进行热引导操作而准备EMS系统。
调用寄存器: AH            5Ch
返回寄存器:如果成功
                  AH            00h
                  如果未成功
                  AH               80h,EMS软件的内部出错
                                  81h,EMS硬件出现了故障
                                  84h,未定义功能
注释:该功能可为即将进行的热引导操作而准备EMS硬件。在此过程
中,当前映象语境、投入使用的备用寄存器集和要求初始化的任何信息一般都
会受到影响。任何映象内存低于640K的应用程序都必须捕获一切有可能导
致热引导的情况,并且应在实现热引导前调用本功能。
系统
Int 67h    功能5Dh  子功能00h            LIM Spec版本4.0
          允许OS/E功能
一种只能用于操作系统的功能,它允许访问某些操作系统功能
调用寄存器: AH        5Dh
                  AL              00h
              BX/CX     32位的访问键(该功能的第一用法除外)
返回寄存器:如果成功
                  AH              00h
              BX/CX        32位访问键(仅用于该功能的第一用法)
              如果未成功
719页
              AH             80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            84h,未能找到指定的EMM句柄
                            8Fh,未定义功能
                          A4h,操作系统禁止了对该功能的访问
注释:该功能只供操作系统使用,并且操作系统可随时禁止它。子功能00h允
许使用功能59h、5Bh和5Dh。
系统
Int 67h     功能5Dh     子功能01h                LIM Spec版本4.0
            允许OS/E功能
一种只能用于操作系统的功能,其作用是禁止访问操作系统功能
调用寄存器: AH              5Dh
              AL            01h
              BX/CX          32位的访问键(不能用于该功能的第一用法)
返回寄存器:如果成功
              AH            00h
              BX/CX          32位访问键(仅用于该功能的第一用法)
              如果未成功
              AH             80h,EMS软件的内部出错
                            81h,EMS硬件出现了故障
                            84h,未能找到指定的EMM句柄
                            8Fh,未定义功能
                          A4h,操作系统禁止了对该功能的访问
注释:该功能只供操作系统使用,并且操作系统可随时禁止它。子功能01h禁
止使用功能59h、5Bh和5Dh。使用子功能02h可重新获得对上述三种功能的
访问权。
系统
Int 67h     功能5Dh     子功能02h                LIM Spec版本4.0
            EMS的OS/E访问键代码
一种只能用于操作系统的功能,其作用是控制对其它操作系统功能的访问
调用寄存器: AH              5Dh
                AL         02h
720页
                BX/CX          32位的访问键
    返回寄存器:如果成功
                AH          00h
                如果未成功
                AH             80h,EMS软件的内部出错
                              81h,EMS硬件出现了故障
                              84h,未能找到指定的EMM句柄
                              8Fh,未定义功能
                              A4h,操作系统禁止了对该功能的访问
    注释:该功能只供操作系统使用,并且操作系统可随时禁止它。子功能02h可
    返回对EMS的访问键代码,并将操作系统返回到其初始状态;此时,系统将
    启用OS/E功能(如果它们已被禁止),并且下一次对该功能的任何子功能的
    调用都会返回一个新的访问键代码。
 
第19章XMS参考手册
    XMS功能是通过一种已安装的设备驱动程序来操作的,其操作方式在很大的程度上
与鼠标和EMS功能相同。它们能访问在大小上为标准的640K至1M之间的内存组成的
上位内存块(UMB)、以及高端内存区域(HMA)和扩展内存(extended memory)。
    通过使用Int 2Fh,功能4300h就可检查出系统中是否装入了XMS功能。如果已装入
XMS功能,则功能4300h会通过AL返回80h,如果未安装XMS功能,则AL的值不改
变。
      确定了系统中已安装XMS驱动程序之后,可用Int 2Fh,功能4310h来访问驱动程
序,以确定它的入口点。入口点地址是通过ES:BX返回的,找到这一地址后,必须将它保
存起来,以便以后在每次XMS驱动程序功能进行访问时可用到这一地址。在调用XMS
驱动程序功能时,应先通过AH输入希望使用的功能,然后调用该入口点地址就行了。
      如果对本章如何介绍功能有疑问的话,可参见本书前面“参考手册概述”一章的内容。
系统
功能00h          XMS                         spec 版本  2.0
                获取XMS版本号
确定所使用的是哪一个版本的XMS并返回HMA是否存在的有关信息。
调用寄存器: AH        00h
返回寄存器: AX        XMS版本号
            BX         XMS驱动程序修订版本号
            DX         HMA存在标志
                      00000h,HMA不存在
                      00001h,HMA存在
注释:  该功能返回的版本号是一个16位的BCD值。因此,若AX的值为
01234h,则意味着驱动程序实现的XMS版本号为12.34。驱动程序修订版本
号的值主要用于调试。同时HMA的存在没有削弱该功能的可用性。
系统
功能01h          XMs                         Spec 版本 2.0
                请求高端内存区域
把65520个字节的HMA分配给调用者。
722页
    调用寄存器: AH          01h
                DX          按字节计算的请求空间大小
    返回寄存器: AX         状态
                            00000h,失败
                BX          出错代码
                            080h,未实现功能
                            081h,检测到了VDISK设备
                            090h,HMA不存在
                            091h,HMA已投入使用
                            092h,所请求的字节数小于/HMAMIN=参数
    注释:如果调用者是应用程序,则出现在AX中的值必须为0FFFFh,否则,
    就会同设备驱动程序或TSR一样,该值必须反映出所需的字节数。对HMA
    的分配只存在两种情况,即要么全分配,要么一点也不分配,并且,该功能可通
    过/HMAMIN=参数告诉XMS驱动程序,在该驱动程序能把HMA交给调用
    者之前,它必须请求多大的上位内存区。
系统
功能02h            XMS                           Spec版本2.0
                  释放上位内存区
释放HMA。
调用寄存器: AH              02h
返回寄存器: AX             状态
                            00000h,失败
                            00001h,成功
              BL            出错代码
                           080h,未实现功能
                            081h,检测到了VDISK设备
                            090h,HMA不存在
                            093h,未分配HMA
注释:分配HMA的程序必须在退出系统之前释放出HMA。此时,保存在
HMA中的代码可使数据无效,并且不能访问它们。
系统
功能03h            XMS                             Spec版本2.0
                  全局允许A20
允许A20地址线
723页
调用寄存器: AH              02h
返回寄存器: AX             状态
                            00000h,失败
                            00001h,成功
                BL            出错代码
                            080h,未实现功能
                            081h,检测到了VDISK设备
                            082h,A20出错
注释:只有那些控制着HMA的程序才必须调用该功能。在退出之前,必须调
用功能04h。同时,还应认识到,在许多机器上,翻转A20线是一种相对较缓慢
的操作。
系统
功能04h             XMS                            Spec版本2.0
                    全局禁止A20
    禁止A20地址线
    调用寄存器: AH           04h
    返回寄存器: AX           状态
                              00000h,失败
                              00001h,成功
                  BL            出错代码
                              080h,未实现功能
                              081h,检测到了VDISK设备
                              082h,A20出现了错误
                              094h,仍然允许A20线
    注释:只有那些控制着HMA的程序才有必要调用该功能。在许多机器上,切
    换A20线是一种相对较缓慢的操作。
系统
功能05h            XMS                             Spec版本2.0
                  局部允许A20
允许A20地址线
调用寄存器: AH              05h
返回寄存器: AX             状态
                            00000h,失败
724页
                            00001h,成功
              BL            出错代码
                            080h,未实现功能
                            081h,检测到了VDISK设备
                            082h,A20出现了错误
注释:只有那些需要直接访问扩展内存的程序才必须调用此功能。在退出之
前,该程序必须调用功能06h。此外,在许多机器上,切换A20线是一种相对较
缓慢的操作。
系统
功能06h              XMS                             Spec版本2.0
                    局部禁止A20
    禁止A20地址线
    调用寄存器: AH            06h
    返回寄存器: AX           状态
                              00000h,失败
                              00001h,成功
                BL            出错代码
                              080h,未实现功能
                              081h,检测到了VDISK设备
                              082h,A20出现了错误
                              094h,仍然允许A20线
    注释:只有那些需要直接访问扩展内存的程序才必须调用该功能。在许多机
    器上,切换A20线是一种相对较缓慢的操作。
系统
功能07h              XMS                             Spec版本2.0
                    询问A20
检查A20线的状态
调用寄存器: AH              07h
返回寄存器: AX             状态
                            00000h,失败
                            00001h,成功
                BL          出错代码
                            000h,没有错误
725页
                              080h,未实现功能
                              081h,检测到了VDISK设备
注释:就像由Microsoft HIMEM.SYS驱动程序所实现的一样,该功能是通
过检查内存回绕情况而采取一种与硬件无关的方式来实现的。
系统
功能08h              XMS                             Spec版本2.0
                    询问自由的扩展内存数量
检查扩展内存是否可用。
调用寄存器: AH              08h
返回寄存器: AX             以千字节计算的最大扩展内存大小
              DX            以千字节计算的扩展内存总量
              BL            出错代码
                            080h,未实现功能
                            081h,检测到了VDISK设备
                            0A0h,所有的扩展内存都已被分配了
注释:该功能返回值不包括HMA,即使它是未分配的HMA。
系统
功能09h              XMS                               Spec版本2.0
                    分配扩展内存块
从公共的自由扩展内存中分配出指定大小的块。
调用寄存器: AH            09h
              DX          以千字节计算的内存块大小
返回寄存器: AX           状态
                          00000h,失败
                          00001h,成功
              BL          出错代码
                          080h,未实现功能
                          081h,检测到了VDISK设备
                          0A0h,所有扩展内存均被分配了
                          0A1h,所有扩展内存均被占用
注释:在随后进行的所有扩展内存调用中,系统必须使用通过DX返回的句
柄。如果未分配扩展内存,则返回的句柄为空,同时,在该功能退出之前,系统
必须调用功能0Ah来释放已分配的扩展内存。
 
726页
系统
功能0Ah            XMS                             spec版本2.0
                  释放扩展内存块
解除对扩展内存块的分配(释放)。
调用寄存器: AH            0Ah
              DX          要释放的内存块的句柄
返回寄存器: AX           状态
                          00000h,失败
                          00001h,成功
              BL          出错代码
                          080h,未实现功能
                          081h,检测到了VDISK设备
                          0A2h,句柄无效
                          0ABh,句柄被锁定
注释:释放了扩充内存块后,该块的句柄和保存在块内的所有数据都变得无
效,并且不能访问它们。
系统
功能0Bh          XMS                              Spec版本2.0
                  移动扩展内存块
把数据从一个内存位置传送到另一个内存位置。
调用寄存器: AH            0Bh
            DS:SI      指向扩展内存块移动结构的指针(参见
                          表19.1)
返回寄存器: AX           状态
                          00000h,失败
                          00001h,成功
            BL            出错代码
                          080h,未实现功能
                          081h,检测到了VDISK设备
                          082h,A20出现了错误
                          0A3h,源句柄无效
                          0A4h,源偏移值无效
                          0A5h,目的句柄无效
                          0A6h,目的偏移值无效
                          0A7h,长度无效
727页
                            0A8h,移动中出现了无效的覆盖
                            0A9h,出现了奇偶错误
注释:尽管该功能是用来在常规DOS内存和扩展内存之间移动数据块的,但
是它也能在DOS常规内存和扩展内存内移动数据块。
      在使用该功能时,无论是源句柄还是目的句柄都不能锁定。
      移动的块长度必须为偶数。在80386和80486机器上,如果扩展内存块是
字边界对齐的或双字边界对齐的,那么其性能会有所改进。如果块是重叠的,
则只有向前移动(源基小于目的基)才能保证顺利进行。
      在调用该功能之前,调用者切不要企图操纵A20线。因为该功能将保留
A20的状态。
      在长时间的传送期间,应保证有一个合理的中断窗口数。
                        表19.1扩展内存块结构的布局
偏移值                                  含    义
000h-003h                             要传送的32位字节数
004h-005h                            源块句柄
006h-009h                             32位的源偏移值
00Ah-00Bh                            目的块句柄
00Ch-00Fh                             32位的目的偏移值
系统
功能0Ch              XMS                             Spec版本2.0
                    锁定扩充内存块
防止移动内存块并返回它的物理地址
调用寄存器: AH              0Ch
              DX            要锁定的块的句柄
返回寄存器: AX             状态
                            00000h,失败
                            00001h,成功
              DX:BX       块的32位线性地址
              BL            出错代码
                            080h,未实现功能
                            081h,检测到了VDISK设备
                            0A2h,句柄无效
                            0ACh,块的锁定计数溢出
                            0ADh,锁定失败
注释:只有在锁定了块的时候,该功能返回的指针才是有效的。对锁定的块必
 
728页
须尽快地将其解锁。锁定计数是为扩展内存块而保留的。
系统
功能0Dh              XMS                             Spec版本2.0
                    解锁扩展内存块
    解除对内存块的锁定
    调用寄存器: AH            0Dh
                DX            要解锁的块的句柄
    返回寄存器: AX           状态
                              00000h,失败
                              00001h,成功
                BL            出错代码
                              080h,未实现功能
                              081h,检测到了VDISK设备
                              0A2h,句柄无效
                              0AAh,未曾锁定块
    注释:在解除对内存块的锁定后,用于访问该块的任何32位指针都不再有
    效。
        该功能可减少块的锁定计数。同时,为了解锁内存块,必须发出一个与锁
    定调用相同的解锁调用号。
系统
功能0Eh            XMS                               Spec版本2.0
                  获取EMB句柄信息
获取扩展内存块的其它信息。
调用寄存器: AH              0Eh
              DX            块的句柄
返回寄存器: AX             状态
                            00000h,失败
                            00001h,成功
              BH            块的锁定计数
              BL            如果成功,则为系统内自由的EMS句柄数
              DX            块大小(如果AX=0)(以千字节计算)
              在未成功时所出现的出错代码
                            080h,未实现功能
                            081h,检测到了VDISK设备
                            0A2h,句柄无效
729页
注释:要想获取块的基地址,可使用功能0Ch。
系统
功能0Fh         XMS                       Spec  版本 2.0
                重新分配扩展内存块
改变扩展内存块的大小。
调用寄存器: AH              0Fh
              BX            按千字节计算的新的大小
              DX            要重新规定其大小的块的句柄
返回寄存器: AX           状态
                          00000h,失败
                          00001h,成功
              BL            出错代码
                          080h,未实现功能
                          081h,检测到了VDISK设备
                          0A0h,所有扩展内存均被分配
                          0A1h,所有可用的扩展内存句柄均被占用
                          0A2h,句柄无效
                          0ABh,块被锁定
注释:如果新块的大小小于原来块的大小,那么原来块上端的所有数据都会
丢失。
系统
功能10h         XMS                       Spec 版本 2.0
                    请求上位内存块
分配上位内存块。
调用寄存器: AH              10h
              DX          按节计算的块大小(每节16字节)
返回寄存器: AX             状态
                            00000h,失败
                            00001h,成功
              BX            如果成功,则为UMB的段号
              BL            只有当AX=0000时,才会出现的出错代码
                            080h,未实现功能
                            0B0h,可用的UMB大小不够
                            0B1h,无可用的UMBs
 
730页
              DX          成功时,为按节计算的分配块的实际大小;未成
                          功时,为按节计算的最大的可用UMB大小
注释:上位内存块(UMBs)在大小上不超过1M地址界限,它控制着系统对
A20线的需求。UMBs总是逐节排列而成的。为了便于确定最大的可用UMB
大小,可分配一个0FFFFh大小给某个内存块。
系统
功能11h            XMS                           Spec版本2.0
                  释放上位内存块
释放上位内存块
调用寄存器: AH              11h
              DX             UMB的段号
返回寄存器: AX             状态
                            00000h,失败
                            00001h,成功
              BL            出错代码
                            080h,未实现功能
                           0B2h,UMB段号无效
注释:释放了上位内存块(UMB)之后,其代码和保存其内的数据都会变得无
效,并且不能访问它们。
      如果块为扩展内存块,那么,调用功能09h所获取的块句柄是有效句柄。
如果块为常规内存块,则系统会将块句柄置为0,并且其偏移值为标准的段:
偏移值对。
 

第20章DPMI参考手册

            随着Inter不断地生产出功能越来越强大的微处理器,并且随着这些处理器相

    应地找到了各自进入DOS系统的方法,仅有1M内存和16位代码的限制越来越令人难

    以忍受。正因为如此,围绕着克服这一限制条件的大量系统纷纷涌向市场。这些系统采用

    80286、80386和80486结构,以提供对1M以上内存(EMS和XMS内存管理程序)的访

    问,多任务操作环境(Windows、 OS/2、DESQview)和称为DOS扩展,以运行保护模式程序

    的环境。

        DOS扩展环境提供给保护模式以访问16位DOS功能和BIOS功能的能力。它们还典

    型地允许访问超过1M的内存。其中一个广为流行的DOS扩展就是DOS保护模式接口

    (DPMI)。

        DPMI是一种DOS扩展规范,是由Borland、International、ErgOComputer Inc. 、In-

    telligent Graphics  Corporation、 IBM Corporation、Intel Corporation、Locus、lotus Develop-

    ment Corporation、Microsoft Corporation、Phar Lap software , Inc. 、Phoenix Technologles

    Ltd.、Quarterdeck Office Systems和Rational Systems,Inc,开发出来的。 DPMI可在任何

    支持80286保护模式执行的CPU上得以实现。但是,DPMI的充分利用要求具有80386

    或80486。

        DPMI版本0.9是Windows 3.0支持结构中的一部分。版本1在此基础上进行了进

    一步的增强,以便能更好地支持多任务操作。

        在DPMI中,当实模式程序调用DPMI接口以请求向保护模式进行初始切换时,系

    统便会创建出“DPMI客户”。我们把一种DOS环境和1个或多个从中创建出的保护模式

    DPMI客户统称为DPMI虚拟机器。一个多任务宿主可同时运行几个DPMI虚拟机器。因

    此,DPMI客户切不可要求它拥有整个机器的资源,这是个很关键的问题。在80386或

    80486上的DPMI实用程序,可以选择使用硬件保护,以虚拟化I/O和中断,并可限制

    DPMI客户使用超级用户权限模式;固此,DPMI客户不能对其权限层提出任何要求。

        如果对本章内功能的介绍方式有疑问的话,可参照本书前面“参考手册概述”一章的

    内容。

系统

Int 2Fh       功能1680h                              DPMI版本1.0

              释放当前虚拟机器的时间片

732页

    允许操作系统把控制权切换给其它客户或在便携机和笔记本计算机上进行电

    源功耗测量

    调用寄存器: AX            1680h

    返回寄存器: AL           如果宿主支持为00h

                              如果宿主不支持则为80h

    注释:只能在程序处于空闲的时候(如在等待键盘输入时才能调用该功能。由

    于程序可随时重新获得控制权,因此,只要它是空闲的,它就必须继续调用该

    功能。

系统

Int 2Fh       功能1686h                              DPMI版本0.9

              获取CPU模式

返回当前CPU模式的有关信息。

调用寄存器: AX                1686h

返回寄存器: AX               如果是在保护模式下则为00h

                              如果是在实模式或虚拟86模式下则为非零

                              值

注释:有些环境能支持那些既能在实模式下又能在保护模式(双模式代码)下

执行的程序或库。该调用允许程序确定在运行时间里,它们是在哪一个CPU

模式中运行,并采用哪些相应的系统功能。那些只能在保护模式下执行的程序

不需要调用该功能。

只有在确定了DPMI宿主确实存在之后,才能调用该功能,否则,调用结果无

效。

系统

Int 2Fh         功能1687h                            DPMI版本0.9

                获取实模式向保护模式切换的入口点

检验DPMI宿主是否存在并获取模式切换例程(调用该例程便可开始在保护

模式下执行)的地址;只能在实模式下调用该功能

调用寄存器: AX              1687h

返回寄存器: AX             状态

                            00,成功

                            非零值,失败

              如果成功

              BX            标志

                            位0置位,表明系统支持32位的程序;否则,

733页

                                系统不支持32位程序

                                位1-15未使用

                CL              处理器类型

                               02h,80286

                               03h,80386

                                04h,80486

                                05h-FFh保留供将来的Intel处理器使用

                DH              十进制的DPMI主版本号(二进制形式)

                DL              十进制的DPMI次版本号(二进制形式)

                SI              请求用于DPMI宿主专用数据的节数(可

                                以为0)

                ES:DI         调用以进入保护模式的进程的段:偏移值

    注释:只能在第一次进入保护模式之前调用该功能。要想进入程序保护模式,

    调用者必须分配所请求的专用内存(按节计算的大小,是通过SI返回的),并

    且必须通过让AX保存着一个指明应用程序是16位(位0为0)还是32位(位

    0为1)的标志,以及把保存着DPMI专用数据的实模式段保存在ES中来对

    该功能进行一次远调用(如果SI为0,ES会被忽略)。

    返回时,如果进位标志置位,则表明模式切换已经失败,客户仍然处于实模式

    下,并且AX的值要么为8011h(描述符不可用;不能为CS、DS、ES、SS、PSP

    和环境指针分配描述符),或者为8021h(指定了32位的程序,但系统不支持

    它)。

    返回时,如果进位标志清除,则表明切换操作成功。此时,CS、DS和SS都是其

    基址,分别为实模式CS、DS和SS的16位选择符,且具有64K限制。而选择

    符ES的基地址则为程序的PSP,且其限制为100h。一般情况下不存在FS和

    GS选择符,即使存在的话,也是空选择符。在此过程中,保存在程序的PSP中

    的环境指针也被转换成了选择符;并且,如果客户希望释放环境空间的话,那

    么在进入保护模式之前,它也必须这样做,并且还必须清除位于PSP:2Ch

    (环境段地址)处的字。程序可释放或修改CS、DS或SS描述符;并且在进入保

    护模式后,该程序还可改变保存在PSP中的环境指针,不过,退出之前,它必

    须恢复该指针。然而,在任何时间里,程序都不能修改或释放PSP或环境描述

    符。

系统

Int 2Fh         功能168Ah                              DPMI版本1.0

                获取厂商指定的API入口点

返回能访问厂商指定的DPMI扩展部分的地址

734页

    调用寄存器: AX            168Ah

                DS:(E)SI   标识着DPMI宿主厂商的ASCIIZ

                              字符串的选择符:偏移值

    返回寄存器: AL           如果成功为00h

                              如果失败则为8Ah

                ES:(E)DI  扩展的API入口点

    注释:只能在保护模式中调用该功能。该功能取代了与其作用相等的Int

    31h,功能0A00h。DPMI 1.0客户必须使用这一功能。它还能在版本0.9下工

    作,尽管目前尚无资料表明这一点。

    客户必须对入口点采用远调用。所传送的字符串要求不能改变大小写。

系统

Int 31h       功能0000h                              DPMI版本0.9

              分配LDT描述符

    从指定任务的局部描述符表(LDT)中分配出一个或多个描述符

    调用寄存器: AX            0000h

                CX            要分配的描述符个数

    返回寄存器:如果成功

                进位标志清除

                AX            基选择符

                如果未成功

                进位标志置位

                AX             8011h,描述符不可用

    注释:该功能将要分配的描述符初始化为“数据”,该数据位拥有存在位被置

    位,且基地址和界限都为0的值。在这里,特权级与调用者的代码段特特权级

    是相匹配的。如果该功能分配多个选择开关,则AX将引用描述符的相连数组

    中的第一个数组。在该数组中,后继描述符的选择符值可以计算出来,计算方

    法为将Int 31h功能0003h返回的值加上前面的选择符值。

系统

Int 31h       功能0001h                              DPMI版本0.9

              释放LDT描述符

释放LDT描述符

调用寄存器: AX                0001h

              BX              用于要释放的描述符的选择符

返回寄存器:如果成功

735页

                进位标志清除

                如果未成功

                进位标志置位

                AX             8022h,无效选择符

    注释: Int 31h,功能0000h所分配的每个描述符必须被单独释放,即使它是

作为描述符的相连数组之一部分而分配的。

    在版本1.0中,该功能将把要释放的,且其中保存着选择符的所有段寄存器都

    设置为0。

系统

Int 31h       功能0002h                          DPMI版本0.9

              段至描述符转换

    把实模式段地址转换成可被保护模式程序用来访问同一内存的LDT描述符。

    调用寄存器: AX          0002h

              BX            实模式段地址

    返回寄存器:如果成功

              进位标志清除

              AX            用于实模式段的选择符

              如果未成功

              进位标志置位

              AX             8011h,描述符不可用

    注释:该功能可以轻易地访问那些通常由实模式使用的段,如位于段0400h

    处的BIOS数据区和位于A000h、B000h或B800h处的视频内存。但是,不能

    修改或释放通过调用该功能所创建的描述符。如果用户想用同一个选择开关

    来访问各种实模式地址,那么他们可调用Int 31h、功能0000h来分配一个描

    述符,并通过调用Int 31h,功能0007h来改变该描述符的基地址。

    在该功能内,描述符的限定被设置为64K。同时,在对该功能的多次调用中,如

    果段地址未变,则返回的选择符亦是相同的。

系统

Int 31h       功能0003h                            DPMI版本0.9

              获取选择符增量值

    返回用于成功地访问了描述符连续数组的元素,如那些通过调用Int 31h,功

    能0000h或Int 31h,功能0100h所创建的元素的选择符增量值。

    调用寄存器: AX          0003h

    返回寄存器:进位标志清除

 

736页

              AX              选择符增量值

注释:该功能返回的值总是以2的整次幂的形式出现。

系统

Int 31h       功能0006h                            DPMI版本0.9

              获取段基地址

从指定段的LDT描述符中返回32位线性基地址。

调用寄存器: AX              0006h

              BX            选择符

返回寄存器:如果成功

              进位标志清除

              CX:DX       段的32位线性基地址

              如果未成功

              进位标志置位

              AX             8022h,无效选择符

注释:客户程序必须用LSL指令来询问描述符的界限。在80386或80486机

器上,如果段大小超过了64K,则这一线性基地址必定是32位的值。

系统

Int 31h       功能0007h                            DPMI版本0.9

              设置段基地址

在指定段的LDT描述符内设置32位线性基地址

调用寄存器: AX              0007h

              BX            选择符

              CS:DX       段的32位线性基地址

返回寄存器:如果成功

              进位标志清除

              如果未成功

              进位标志置位

              AX            出错代码

                            8022h,无效选择符

                            8025h,无效线性地址

注释: DPMI 1.0会自动地通过BX寄存器重新装入任何含有指定选择符的

段寄存器。而DPMI 0.9宿主有的会这样做,有的则不会。

737页

系统

Int 31h       功能0008h                        DPMI版本0.9

              设置段限定值

在LDT描述符中,设置指定段的限定值

调用寄存器: AX            0008h

              BX          选择符

            CX:DX        32位段限定值

返回寄存器:如果成功

              进位标志清除

              如果未成功

              进位标志置位

            AX            出错代码

                          8021h,无效值

                          8022h,无效选择符

                          8025h,无效线性地址

注释: CX:DX的值必须为段的长度减1。如果段限定值大于或等于1M,那

么它必须是页面边界对齐的(至少得设置12个位)。

根据请求,DPMI宿主可设置或清除描述符的粒度位。

DPMI 1.0可以通过BX寄存器重新装入含有指定选择符的段寄存器。

系统

Int 31h       功能0009h                        DPMI版本0.9

              设置描述符访问权限

在指定段的LDT描述符中修改访问权限和类型

调用寄存器: AX            0009h

            BX            选择符

            CX            访问权限类型字节

            CH             80386扩展访问权限类型字节

返回寄存器:如果成功

            进位标志清除

            如果未成功

            进位标志置位

            AX            出错代码

                          8021h,无效值

                          8022h,无效选择符

 

738页

                                8025h,无效线性地址

    注释:在CL寄存器中的访问权限定字节具有如下格式:

        位                                        含      义

0                                             0=未访问,1=已访问

1                                             数据:0=读,1=读/写

                                              代码:必须为1(可读的)

2                                             数据:0=向上扩展,1=向下扩展

                                              代码:必须为0(不一致)

3                                             0=数据,1=代码

4                                             必须为1

5-6                                          必须等于调用者CPL

7                                             0=不存在,1=存在

在CH寄存器中的扩展访问权限类型字节的格式如下:

位                                          含    义

0-3                                      被忽略

4                                         可以为0或1

5                                         必须为0

6                                         0=16位,1=32位

7                                         0=字节粒度,1=页粒度

客户程序必须使用LAR指令来检查描述符的访问权限。

DPMI 1.0可再装入任何引用受到影响的描述符的段寄存器。

系统

Int 31h         功能000Ah                                DPMI版本0.9

                创建别名描述符

创建新的LDT描述符,但其基地址和限定值与指定的描述符相同

调用寄存器: AX                000Ah

              BX              选择符

返回寄存器:如果成功

              进位标志清除

              AX              数据选择符(别名)

              如果未成功

              进位标志置位

              AX              出错代码

                              8011h,无效值

739页

                             8022h,无效选择符

注释:选择符可以是数据或代码选择符。已出版的DPMI 0.9规格说明书指

出,如果选择符为数据选择符,那么系统将会出错;这一点是不正确的。

该功能返回的描述符别名没有改变初始描述符的磁道。因此,如果创建出一个

别名之后,初始段的基地址和界限被修改,那么该段和其别名将不再映射相同

的内存。

系统

Int 31h       功能000Bh                        DPMI版本0.9

              获取描述符

把指定选择符的LDT项拷贝到8字节的缓冲区中

调用寄存器: AX            000Bh

            BX            选择符

            ES:(E)DI   8字节缓冲区的选择符:偏移值

返回寄存器:如果成功

            进位标志清除

            ES:(E)DI  指定的缓冲区保存着描述符

            如果未成功

            进位标志置位

            AX             8022h,无效选择符

注释: 16位代码必须使用ES:DI;而32位程序必须使用ES:EDI。

系统

Int 31h       功能000Ch                          DPMI版本0.9

              设置描述符

将8字节缓冲区中的内容拷贝到用于指定选择符的LDT描述符中

调用寄存器: AX            000Ch

            BX            选择符

            ES:(E)DI    保存着描述符的8字节缓冲区的

                          选择符:偏移值

返回寄存器:如果成功

            进位标志清除

            如果未成功

            进位标志置位

            AX            出错代码

                           8021h,无效值

                          8022h,无效选择符

740页

                              8025h,无效线性地址

    注释: 32位的程序必须使用ES:EDI;而16位的程序则必须使用ES:DI。DP-

    MI 1.0可重新装载那些含有指定选择符的段。

系统

Int 31h         功能000Dh                                DPMI版本0.9

                分配指定的LDT描述符

分配一个指定的LDT描述符

调用寄存器: AX                000Dh

              BX              选择符

返回寄存器:如果成功

                进位标志清除

                如果未成功

                进位标志置位

                AX            出错代码

                              8011h,描述符不可用

                              8022h,无效选择符

注释:对该功能来说,头16个描述符是保留的。在DPMI 0.9中,可能已装入

了其它的应用程序,并分配了其中的一些描述符,使得它们变为不可用。而在

DPMI 1.0中,每个客户都有它自己的LDT,并且可访问全部16个描述符。

提供常驻服务的程序(保护模式TSRS)不能使用该功能。

系统

Int 31h         功能000Eh                            DPMI版本0.9

                获取多个描述符

把一个或多个LDT项复制到客户缓冲区中

调用寄存器: AX              000Eh

              CX            要拷贝的描述符数

              ES:(E)DI  缓冲区的选择符偏移值,格式如下:

偏移值        长度          内    容

0000h            2          #1选择符(客户设置的)

0002h            8          #1描述符(宿主返回的)

000Ah            2           #2选择符(客户设置的)

000Ch            8          #2描述符(宿主返回的)

741页

    返回寄存器:如果成功

                  进位标志清除

                  缓冲区保存有指定选择符的描述符拷贝

                  如果未成功

                  进位标志置位

                  Ax            8022h,无效选择符

                  CX            已成功拷贝的描述符数

      注释:如果系统检测到了无效选择符,那么在复制操作失败之前拷贝的所有

      描述符仍然是有效的。

      32位程序必须使用ES:EDI;而16位程序则必须使用ES:DI。

系统

Int 31h         功能000Fh                                DPMI版本0.9

                设置多个描述符

    从客户缓冲区中把1个或多个描述符复制到LDT中。

    调用寄存器: AX              000Fh

                Cx              要复制的描述符数

                ES:(E)DI      缓冲区的选择符偏移值,格式如下:

偏移值        长度            内容

0000h          2               #1选择符

0002h          8              #1描述符

000Ah          2               #2选择符

000Ch          8              #2描述符

返回寄存器:如果成功

                进位标志清除

                缓冲器保存有指定选择符的描述符拷贝

                如果未成功

                进位标志置位

                AX            出错代码

                              8021h,无效值

                              8022h,无效选择符

                              8025h,无效线性地址

                CX            已成功拷贝的描述符数

    注释:如果是由于无效选择符或描述符而引起出错,则系统可通过CX返回

    已成功复制的描述符个数。并且在操作失败之前复制出的所有描述符都是有

 

742页

效的。余下的描述符则不会得到更新。

32位程序必须使用ES:EDI;而16位程序则必须使用ES:DI。

所有含有数据结构中指定的选择符的段寄存器都会被再次装入。

系统

Int 31h       功能0100h                            DPMI版本0.9

              分配DOS内存块

从低于1M界限的内存中分配出内存块

调用寄存器: AX              0100h

              BX            所期望的节数

返回寄存器:如果成功

              进位标志清除

              AX            被分配块的实模式段基地址

              DX            用于被分配块的选择符

              如果未成功

              AX            出错代码

                            0007h,内存控制块被毁坏

                            0008h,内存不够

                            8011h,描述符不可用

              BX            按节计算的最大块大小

注释:如果要分配的块大小大于64K,且客户程序为16位的程序,则系统会

分配相连描述并返回基选择符。随后的选择符可使用Int31h、功能0003h的

返回值计算出来。所有选择符都有一个64K的界限,唯一例外的是最后一个

选择符,它的限定值为块大小MOD 64K。如果宿主程序是32位的程序,则第

一个描述符的限定为整个块大小;如果宿主为16位的程序,则第一个描述符

的限定为64K,即使是在80386上运行时,其限定依然为64K。

如果客户程序为32位程序,那么系统只为它分配一个描述符。

客户程序绝对不可修改或释放由该功能分配的任何描述符。这些描述符只能

通过调用Int 31h、功能0101h来解除分配(释放)。

DOS分配功能(Int 21h、功能48h)可用来分配DOS内存。

系统

Int 31h       功能0101h                            DPMI版本0.9

              释放DOS内存块

释放先前由Int 31h、功能0100h分配的内存块

743页

    调用寄存器: AX              0101h

                  DX            要释放的块的选择符

    返回寄存器:如果成功

                  进位标志清除

                  AX            被分配块的实模式段基地址

                  DX            用于被分配块的选择符

                  如果未成功

                  AX              出错代码

                                0007h,内存控制块被毁坏

                                0009h,指定的内存块不正确

                                8022h,选择符无效

    注释:系统会自动地释放所有曾分配给内存块的描述符,并且这些描述符将

    随之失效。

    在DPMI 1.0中,系统会将含有被释放的选择符的段寄存器清空为0。

系统

Int 31h         功能0102h                            DPMI版本0.9

              重新规定DOS内存块的大小

改变先前由Int 31h、功能0100h分配的内存块的大小

调用寄存器: AX              0102h

              BX            按节计算的新块大小

              DX            要修改的块的选择符

返回寄存器:如果成功

              进位标志清除

              如果未成功

              AX            出错代码

                            0007h,内存控制块被毁坏

                            0008h,内存不够

                            0009h,指定了不正确的存储段

                            8011h,描述符不可用

                            8022h,选择符无效

              BX            最大可能的块大小

注释:当提出增加块大小的请求时,下述几种情况会使操作失败,即如果

DOS内存已成碎片;如果DOS内存不够,或者请求的块大小超过了64K界限

以及LDT中的下一个描述符不能用。

增加块大小的请求可以释放一些描述符,并减少最新描述符的界限。

(加油加油!未完待续)

原文地址:https://www.cnblogs.com/Chaobs/p/3838557.html