章节 – 6
计算机基础概论
介绍
有时,在某些情况下,当您尝试恢复数据或执行任何数据和磁盘故障排除任务(或者可能是任何其他系统相关任务)时,使用 DOC 的 DEBUG 命令非常方便。
此外,在某些特定情况下,您可能会觉得在 DEBUG 的帮助下然后通过编程很容易完成该特定任务。让我们举个例子。以下调试代码足以备份 DBR。只需键入以下行:
DEBUG BKDBR.BIN
L 100 2 0 1
R CX
200
W
Q
在这里您可以看到,只有键入以上几行,您才能避免编写程序。让我们看另一个将 DBR 的备份副本加载到磁盘的编码示例
永远记住!不要在没有完整知识的情况下尝试此操作。确定你要做什么。不小心使用以下指令可能会导致大量数据丢失,因为滥用指令可能会导致您的所有磁盘信息无法访问。
DEBUG BKDBR.BIN
W 100 2 0 1
Q
通过查看此示例的代码,您可以很容易地猜出它在您最需要的时候对您有多大帮助。此外,不可能在每种情况下都进行编程。然而,在问题的简单案例的范围内,使用汇编指令, 您只需复制启动盘中的 debug.exe/debug.com 并开始编写代码。
T本章和本书中的功能和描述的示例仅与 x86 英特尔处理器家族架构兼容。
首先,我们需要了解一点计算机体系结构的基础知识,以理解接下来的部分中使用的术语,同时描述不同步骤中的功能和示例。让我们了解一些计算机体系结构的基础知识:
基本概念
中央处理器
这部分也称为中央处理器或CPU,它又由控制单元和算术逻辑单元组成。它的功能包括读取和写入存储单元的内容,在存储单元和特殊寄存器之间转发数据,以及解码和执行程序指令。处理器有一系列经常使用的内存单元,因此是 CPU 的一部分。
这些单元以寄存器的名称而闻名。一个处理器可能有一个或两个几十个这样的寄存器。 CPU的算术和逻辑单元实现与数值和符号计算相关的操作。
通常,这些单元只能执行非常基本的操作,例如两个整数的加减法、整数乘法和除法、寄存器位的处理以及两个寄存器内容的比较。个人计算机可以按所谓的字长进行分类,即处理器一次可以处理的位数。
中央记忆
它是一组用半导体制造的单元,用于一般过程,例如程序的执行和操作信息的存储。这些单元格中的每一个都可能包含一个数值,并且它们具有可定向的特性。这是因为它们可以通过每个单元的唯一编号或地址来区分彼此。 这些存储器的通用名称是随机存取存储器或 RAM。
这种存储器的主要缺点是当电流中断时集成电路会丢失它们存储的信息。这就是创建在系统关闭时信息不会丢失的记忆的原因。 这些存储器的名称为只读存储器或 ROM。
为了让 PC 处理信息,这些信息必须位于称为寄存器的特殊单元中。寄存器是一组 8 或 16 个触发器。
触发器是一种能够存储两级电压的设备,一个低电平,通常为 0.5 伏,另一个通常为 5 伏。触发器中的低电平能量被解释为关闭或 0,高电平被解释为开启或
一组 16 位称为字; 一个字可以分为 8 位一组称为字节,而 4 位一组称为半字节。
CPU 寄存器
CPU内部有4个寄存器,每个16位。前四个AX、BX、CX、DX是通用寄存器,也可以作为8位寄存器使用,如果以这种方式使用,有必要将它们称为:AH 和 AL,它们是 AX 寄存器的高字节和低字节。此命名法也适用于 BX、CX 和 DX 寄存器。
以其特定名称而闻名的寄存器:
Register |
Specific Name |
AX |
Accumulator |
BX |
Base register |
CX |
Counting register |
DX |
Data register |
DS |
Data segment register |
ES |
Extra segment register |
SS |
Battery segment register |
CS |
Code segment register |
BP |
Base pointers register |
SI |
Source index register |
DI |
Destination index register |
SP |
Battery pointer register |
IP |
Next Instruction pointer register |
F |
Flag register |
然而,我们将在接下来的章节中详细使用这些寄存器通过 C 进行中断编程,但在这里学习汇编语言的基础知识将是一个很好的理想选择,它将帮助我们完成磁盘操作等的编程。
可以使用 Debug 程序可视化 CPU 内部寄存器的值。要开始使用 Debug,请在您的计算机中键入以下提示:
C:/>Debug <Enter>
在下一行会出现一个破折号,这是Debug的指示器,此时可以使用以下命令引入Debug指令:
- r <Enter>
显示 CPU 内部寄存器的所有内容。查看它们的另一种方法是使用“r”。命令使用要查看其值的寄存器的名称作为参数。例如:
-rbx <Enter>
该指令将仅显示 BX 寄存器的内容,并且 Debug 指示器从“-”变为“-”。到“:”
当出现这样的提示时,可以通过输入新值和 <Enter> 来更改所看到的寄存器的值,或者可以通过按 Enter 保留旧值而不输入任何其他值。
可以更改标志寄存器的值,并将其用作我们程序中的控制结构,我们将在后面看到。寄存器的每一位都有一个特殊的名称和含义,下面的列表描述了每一位的值,开或关以及它与处理器操作的关系:
Overflow
NV = there is no overflow
OV = there is an overflow
Direction
UP = forward
DN = backward
Interrupts
DI = deactivated
EI = activated
Sign
PL = positive
NG = negative
Zero
NZ = it is not zero
ZR = it is zero
Auxiliary Carry
NA = there is no auxiliary carry
AC = there is auxiliary carry
Parity
PO = uneven parity
PE = even parity
Carry
NC = there is no carry
CY = there is carry
汇编器结构
汇编语言中的代码行有两部分,第一部分是要执行的指令的名称,第二部分是命令的参数。例如:
ADD ah, bh
这里“添加”是要执行的命令;在这种情况下,一个加法,和“啊”以及“bh”是参数。
说明书的语言名称由两个、三个或四个字母组成。这些指令也称为助记符名称或操作代码,因为它们代表处理器将执行的功能。有些命令的操作不需要参数,还有一些只需要一个参数。
有时使用指令如下:
ADD al,[170]
第二个参数中的括号向我们表明,我们将使用编号为 170 的存储单元的内容,而不是使用 170 的值;这称为直接方向。
现在我们准备在调试的帮助下为我们的第一个程序编写代码。我们将创建一个程序来说明我们所看到的,我们要做的是添加两个我们将直接引入程序的值。
第一步是启动Debug,这一步只需要输入debug <Enter>在操作系统提示符下。
要在 Debug 上汇编程序,“a”; (汇编)命令被使用。使用该命令时,可以将要开始汇编的地址作为参数给出,如果省略该参数,则汇编将在 CS:IP 指定的位置开始,通常为 0100h,即程序所在的位置必须启动带有 .COM 扩展名的文件。这将是我们将使用的地方,因为只有 Debug 才能创建这种特定类型的程序。
即使此时没有必要给出“a”。命令一个参数,建议这样做以避免使用 CS:IP 寄存器后出现问题,因此我们键入:
-a0100 <Enter>
完成后屏幕上会出现类似这样的信息:0C1B:0100 并且光标位于这些数字的右侧,注意前四位(十六进制)可以不同,但后四位必须是 0100 ,因为它是我们作为开始指定的地址。现在我们可以介绍指令:
0C1B:0100 mov ax,0002; puts the 0002 value on the ax register
0C1B:0103 mov bx,0004; puts the 0004 value on the bx register
0C1B:0106 add ax,bx; the content of bx is added to the content of ax
0C1B:0108 int 20; provoques the termination of the program.
0C1B:010A
没有必要写在“;”之后的评论。输入最后一个命令后,int 20, <Enter>按下而不写任何东西,再次看到调试器提示。
最后写的那行不是汇编指令,而是操作系统中断的调用,这些中断为我们节省了大量的行,并且对于访问操作系统功能非常有用。
要执行我们编写的程序,“g”使用命令,使用时我们会看到一条消息:
“程序正常终止”。自然地,对于这样的消息,我们不能确定程序是否完成了添加,但是有一种简单的方法可以验证它,通过使用“r”; Debug命令我们可以看到处理器所有寄存器的内容,只需输入:
-r <Enter>
每个寄存器及其各自的实际值将显示在屏幕上,如下所示:
AX=0006 BX=0004 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1B ES=0C1B SS=0C1B CS=0C1B IP=010A NV UP EI PL NZ NA PO NC
0C1B:010A OF DB
寄存器包含不同值的可能性是存在的,但是 AX 和 BX 必须相同,因为它们是我们刚刚修改的。
在程序执行时查看值的另一种方法是使用我们希望执行结束的地址并将寄存器的值显示为“g”的参数,在这种情况下它将是: g108,这条指令执行程序,停在108地址,显示寄存器的内容。
可以通过使用“t”来跟踪寄存器中发生的事情。命令(trace),该命令的作用是逐行执行汇编的内容,每次显示寄存器的内容。
To exit Debug use the "q" (quit) command.
汇编器的优点
使用 assembler 的第一个原因是它提供了更多了解 PC 操作的机会,从而可以以更一致的方式开发软件。
第二个原因是计算机的完全控制,您可以通过使用汇编程序来控制。另一个原因是基于汇编的程序更快,在某些情况下它们更小,并且比使用其他语言创建的程序具有更大的容量。
让我信守诺言!!
在本章的前面部分,我们使用了一些指令作为示例,对 DBR 进行备份,并在需要时将 DBR 的备份加载到其原始位置。首先,我们检查进行备份的指令。
C:\>DEBUG A:\BKDBR.BIN <Enter>
File not found
- L 100 2 0 1 <Enter>
- R CX <Enter>
CX 0000
: 200 <Enter>
- W <Enter>
Writing 00200 bytes
- Q <Enter>
在这个例子中,让我们从第一行开始学习。命令 DEBUG A:\BKDBR.BIN 通过在 A: 软盘驱动器中创建一个名为 BKDBR.BIN 的文件来初始化调试命令,如果它不存在于那里。这就是为什么我们在开始时收到“找不到文件”的消息。
在我们的第二条指令 L 100 2 0 1 中,L(加载)命令是加载被指示驱动器的 DBR。让我们学习如何?在本指令中,数字 100 是缓冲区的地址,将存储 DBR,下一个数字 2 用于驱动器 C(C :)。驱动器编号如下所示:
Drive Letter |
Number Used |
A: |
0 |
B: |
1 |
C: |
2 |
D: |
3 |
. |
. |
. |
. |
and so on |
. |
下一个数字 0 是要读取的扇区数的起始扇区号。这里我们使用 0 来读取第一个扇区,即 DBR 扇区。下一个数字 1 用于通知要读取的扇区数。
这里我们给出了 1,因为我们只想读取一个扇区。但是,我们可以根据需要在不同类型的其他操作中使用开始和结束扇区的数量和位置。因此,它将从驱动器 C: 的第一个扇区开始加载一个扇区到内存位置 100。
而 R CX 指令用于改变或定义我们要写入 BKDBR.BIN 文件中的数据的长度。该指令将显示 CX 寄存器的当前值并允许您进行任何更改。我们在此处输入 200 是因为 DEBUG 命令使用十六进制,而 DBR 的十六进制大小为 200(h) 字节,在十进制中为 512 字节。
W 命令告诉 DEBUG 将位置 100 的 200(h) 字节写入 BKDBR.BIN 文件。最后我们使用指令 Q 退出 DEBUG 并返回 DOS 提示符。
警告!!!警告!!!警告!!!
强烈建议您在恢复任何磁盘的 DBR 的过程中应该知道自己在做什么以及如何做。如果您不小心存储了任何其他磁盘的非法或 DBR,则在大多数情况下,该磁盘的完整数据可能会变得无法访问。
当您键入编码的第一条指令时:
DEBUG A:\BKDBR.BIN <Enter>
文件必须位于您启动 DEBUG 程序的给定位置。现在,如果您在 DEBUG 提示之前收到错误消息“找不到文件”,请立即使用 Q(退出)命令停止该进程。因为这意味着 BKDBR.BIN 文件无法被 DEBUG 程序找到或打开,如果继续此过程,一些垃圾信息将被写入 DBR,这将使整个分区无法访问。 |
现在让我们看看我们在从我们制作的名为 BKDBR.BIN 的备份文件中恢复 DBR 的说明的编码中做了什么。 DEBUG 恢复备份的命令如下:
C:\> DEBUG A:\BKDBR.BIN <Enter>
- W 100 2 0 1 <Enter>
- Q <Enter>
|
该指令将在内存位置 100 的软盘驱动器 (a:) 中的 BKDBR.BIN 文件中写入 1 个扇区信息到第 2 个驱动器 (C:) 的第 0 个扇区的第一个扇区。
存储和加载程序
每次需要时都键入整个程序似乎不切实际,为了避免这种情况,可以将程序存储在磁盘上,其巨大的优势是通过已经组装,无需运行再次调试执行。
保存已存储在内存中的程序的步骤如下:
- 得到程序的长度,从初始地址减去最终地址,自然是十六进制。
- 为程序命名和扩展名。
- 将程序的长度放在 CX 寄存器中。
- 命令 Debug 将程序写入磁盘。
以下面的程序为例,我们将更清楚地了解如何采取这些步骤。当程序最终组装完成时,它看起来像这样:
0C1B:0100 mov ax,0002
0C1B:0103 mov bx,0004
0C1B:0106 add ax,bx
0C1B:0108 int 20
0C1B:010 A
-h 10a 100
020a 000a
-n test.com
-rcx
CX 0000
:000a
-w
写入 000A 字节
要获得程序的长度,“h”;使用命令,因为它会向我们显示十六进制的两个数字的加法和减法。为了获得我们的长度,我们将程序的最终地址(10A)和程序的初始地址(100)作为参数。命令显示的第一个结果是参数相加,第二个结果是减法。
“n”命令允许我们命名程序。 “rcx”命令允许我们将 CX 寄存器的内容更改为我们从带有“h”的文件大小中获得的值,在本例中为 000a,因为从初始地址减去最终地址的结果。
最后,“w”命令将我们的程序写入磁盘,指示它写入了多少字节。此外,要保存已加载的文件,需要两个步骤:
- 给出要加载的文件的名称。
- 使用“l”加载它。 (加载)命令。
要获得以下步骤的正确结果,上述程序必须已经创建。
在 Debug 中,我们编写以下代码:
-n test.com
-l
-u 100 109
0C3D:0100 B80200 MOV AX,0002
0C3D:0103 BB0400 MOV BX,0004
0C3D:0106 01D8 ADD AX,BX
0C3D:0108 CD20 INT 20
最后一个“u”命令用于验证程序是否已加载到内存中。它所做的是反汇编代码并显示它已反汇编。参数向 DEBUG 指示从何处以及到何处进行反汇编。 DEBUG 总是将程序加载到地址 100H 上的内存中,否则会指出。
细分
x86 处理器的架构强制使用内存段来管理信息,这些段的大小为 64kb。
存在这些段的原因是,考虑到处理器可以管理的数字的最大大小是由 16 位的字或寄存器给出的,因此不可能访问超过 65536 个内存位置只使用这些寄存器中的一个,但是现在,如果将内存分成组或段,每个 65536 个位置,我们使用独占寄存器上的地址来查找每个段,然后我们将每个地址设为特定插槽有两个寄存器,我们可以访问4294967296字节的内存。
为了使汇编器能够管理数据,有必要在与其各自段对应的区域中找到每条信息或指令。汇编器访问此信息时会考虑到段的本地化,由 DS、ES、SS 和 CS 寄存器给出,并在寄存器内部给出指定信息片段的地址。正因为如此,当我们在汇编的每一行使用 Debug 创建程序时,会出现如下内容:
1CB0:0102 MOV AX,BX
其中第一个数字 1CB0 对应于正在使用的内存段,第二个数字指的是该段内的地址,接下来是将从该地址存储的指令。
汇编器以每个汇编指令所需的字节数为基础调整段的大小,因为使用整个段会浪费内存。例如,如果一个程序只需要 10kb 来存储数据,那么数据段将只有 10kb,而不是它可以处理的 64kb。
数据移动
为了您的知识和方便,我在这里列出了一些数据操作的汇编语言指令,当我们在中断和其他 BIOS 操作的帮助下进行编程时,我们将需要它的基础知识。
汇编语言的详细介绍和深入研究超出了本书的范围。虽然在接下来的重要编程章节中需要了解汇编基础知识,但如果您觉得难以理解所有指令,您不必担心,但建议您了解指令的基本概念。
在任何程序中,都需要在内存和 CPU 寄存器中移动数据,有几种方法可以做到这一点。它可以将内存中的数据复制到某个寄存器,从寄存器到寄存器,从寄存器到堆栈,从堆栈到寄存器,将数据传输到外部设备,反之亦然。
这种数据移动受规则和限制的约束。以下是其中一些:
- 不可能将数据从一个内存位置直接移动到另一个内存位置。需要先将源位置的数据移动到寄存器中,然后再从寄存器中移动到目的位置。
- 不能将常量直接移动到段寄存器;它首先必须被移动到 CPU 中的一个寄存器中。
- 可以通过 MOVS 指令移动数据块,该指令复制字节或字链。 MOCSB 将 n 个字节从一个位置复制到另一个位置,而 MOVSW 将 n 个字从一个位置复制到另一个位置。最后两条指令将 DS:SI 定义的地址中的值作为一组要移动的数据,ES:DI 作为数据的新本地化。
为了移动数据,还有一种称为电池的结构,其中数据通过 push 指令引入,并通过 pop 指令提取。在堆栈中,要引入的第一个数据是我们可以获取的最后一个数据,也就是说,如果在我们的程序中我们使用这些指令:
PUSH AX
PUSH BX
PUSH CX
要在从堆栈中取出每个寄存器时返回正确的值,必须按以下顺序执行:
POP CX
POP BX
POP AX
对于与外部设备的通信,out 命令用于向端口发送信息,in 命令用于读取从端口接收到的信息。
OUT 命令的语法是:
OUT DX,AX
其中 DX 包含将用于通信的端口的值,而 AX 包含将要发送的信息。
IN 命令的语法是:
IN AX,DX
其中 AX 是保存传入信息的寄存器,DX 包含信息到达的端口地址。
MOV指令
用于存储单元、寄存器和累加器之间的数据传输。语法如下:
MOV 目标、源
本指令允许的不同数据移动如下表所示:
S. No. |
Destination |
Source |
1. |
memory |
accumulator |
2. |
accumulator |
memory |
3. |
segment register |
memory/register |
4 |
memory/register |
segment register |
5. |
Register |
register |
6. |
Register |
memory |
7. |
memory |
register |
8. |
Register |
immediate data |
9. |
memory |
immediate data |
Let us see an example:
MOV AX,0006
MOV BX,AX
MOV AX,4C00
INT 21
该程序将 0006H 的值移动到 AX 寄存器,然后将 AX (0006h) 的内容移动到 BX 寄存器,最后将 4C00h 的值移动到 AX 寄存器,以 21h 中断的 4C 选项结束执行.后面我们会简单介绍中断13H和中断21H。
中断
中断是一种硬件设施,它使 CPU 暂停执行、保存其状态并转移到特定位置。传输位置指定了一个程序的地址,该程序旨在响应中断而采取行动。由于中断而执行的程序称为中断处理程序。
例如 : 如果 DOS 想向 BIOS 发送一些信息或 BIOS 想向计算机系统发送一些信息,DOS 或 BIOS 会产生中断。每当产生中断时,计算机都会暂停它正在执行的任何操作,并首先处理产生中断的操作。
每个能够产生中断的设备都被赋予一个唯一的中断号,以识别哪个设备正在产生这些中断。我们将在本书中讨论中断 13H 的所有函数和子函数、中断 13H 的扩展和中断 21H。
基本上,中断可能有以下三种类型:
- 内部硬件中断
- 外部硬件中断
- 软件中断
内部硬件中断
内部中断是由程序执行期间出现的某些事件产生的。这种类型的中断完全由硬件管理,无法修改。
这种中断的一个明显例子是实现计算机内部时钟的计数器,硬件在一秒钟内多次调用此中断以保持时间最新。
虽然我们不能直接管理这种中断,因为我们无法通过软件控制更新时间,但可以利用它对计算机的影响来为我们带来好处。
例如:要创建一个持续更新的虚拟时钟,我们只需要编写一个程序来读取计数器的实际值并将其转换为用户可以理解的格式。
外部硬件中断
外部中断由外围设备产生,例如键盘、打印机、通讯卡等。它们也由协处理器产生。无法停用外部中断。
这些中断不会直接发送到 CPU,而是发送到集成电路,其功能是专门处理此类中断
软件中断
软件中断可以直接由汇编程序通过 INT 指令调用所需中断的编号来激活。
使用中断有助于我们创建程序,并且通过使用它们,我们的程序会变得更短。更容易理解它们,它们通常具有更好的性能,主要是因为它们的尺寸更小。这种类型的中断可以分为两类:操作系统 DOS 中断和 BIOS 中断。
两者的区别在于操作系统中断更容易使用但它们也更慢,因为这些中断利用 BIOS 来实现它们的目标,另一方面 BIOS 中断更快但它们有缺点是因为它们是硬件的一部分,所以它们非常具体,甚至可能因电路的制造商品牌而异。
要使用的中断类型的选择将完全取决于您要赋予程序的特征。
由于我们将通过C语言的中断处理在C语言的帮助下使用中断进行数据恢复编程,因此我们将仅讨论中断13H,中断13H扩展和中断21H 例程特别。讨论所有其他中断及其函数并不那么重要,因为在 C 语言中,可以使用更简单的函数来执行大多数这些任务。但是,Interrupt 13H 及其扩展的知识对于数据恢复编程是必须的。 |
下面简单介绍一下Interrupt 20H和Interrupt 21H。括号中的值(如 0x20)表示,如何使用
INT 20H ( 0x20) --> Terminate process
Call with: CS = segment address of program segment prefix
Returns: Nothing
Comments:
它终止当前进程。这是程序可以用来执行最终退出的几种方法之一。您还可以使用 INT 21H 的函数(00H 或 31H 或 4CH)或简单地使用 INT 27H 来执行最终退出,其中通常首选 INT 21H 的函数 31H 和 4CH,因为它们允许将返回码传递给父进程。
建议如果你已经使用文件控制块(FCBs)写入任何文件,你应该先关闭文件,否则你可能会丢失数据,因为在最终退出的动作中,所有的内存都被进程占用被释放,文件缓冲区被刷新,进程拥有的文件或设备的所有打开句柄都被关闭。
因此,如果您有打开的文件句柄,您可能会丢失数据。
INT 21H (0x21)
Function 00H (0x00) --> Terminate process
Call with: AH = 00H
CS = segment address of program segment prefix
Returns: Nothing
评论:
此中断终止当前进程。这是程序可以用来执行最终退出的几种方法之一。有关更多信息,请参阅 INT 20H
INT 21H (0x21)
Function 01H (0x01) --> Character input with echo
Call with: AH = 01H
Returns: AL = 8-bit input data
评论:
此中断从标准输入设备(如键盘)读取字符并将其回显到标准输出设备。如果没有字符准备好,则等待直到有一个可用。
INT 21H (0x21)
Function 02H (0x02) --> Character output
Call with: AH = 02H
DL = 8-bit data for output
Returns: Nothing
评论:
它将一个字符输出到标准输出设备。输出可以重定向。如果输出被重定向,则无法检测磁盘已满。
如果输出没有被重定向,或者句柄获得逻辑设备 CON.
INT 21H (0x21)
Function 03H (0x03) --> Auxiliary input
Call with: AH = 03H
Returns: AL = 8-bit input data
评论:
它从标准辅助设备中读取一个字符。默认为第一个串行端口 (COM1)。
如果辅助设备发送数据的速度快于您的程序处理数据的速度,则字符可能会丢失。用户程序无法通过此函数调用读取辅助设备的状态或检测 I/O 错误(例如丢失字符)。
INT 21H (0x21)
Function 04H (0x04) --> Auxiliary output
Call with: AH = 04H
DL = 8-bit data for output
Returns: Nothing
评论:
INT 21H 的这个功能输出一个字符到标准辅助设备。默认为第一个串行端口 (COM1)。通过使用标准辅助设备的预定义句柄 (00034) 或使用通过打开逻辑设备 AUX 获得的句柄执行写入(INT 21H 功能 40H),字符串也可以发送到辅助设备。
INT 21H (0x21)
Function 05H (0x05) --> Printer output
Call with: AH = 05H
DL = 8-bit data for output
Returns: Nothing
评论:
此函数将一个字符发送到标准列表设备。默认设备是第一个并行端口 (LPT1) 上的打印机。字符串也可以通过使用标准打印机设备的预定义句柄 (0004H) 或使用通过打开逻辑设备 PRN 或 LPT1 获得的句柄执行写入 (INT 21H 函数 40H) 发送到打印机。
INT 21H (0x21)
Function 06H (0x06) --> Direct console I/O
Call with: AH = 06H
DL = function requested such that,
If output request, 00H-FEH
If input request, 0FFH
Returns: Nothing, If called with DL = 00H-0FEH
If called with DL = FFH and a character is ready
Zero flag = clear
AL = 8-bit input data
If called with DL = FFH and no character is ready
Zero flag = set
评论:
它从标准输入设备读取一个字符或将一个字符写入标准输出设备。 I/O 可能会被重定向,但如果 I/O 已被重定向,则无法检测 EOF 或磁盘已满。 INT 21H 的此功能用于需要在不受操作系统干扰的情况下读写所有可能的字符和控制代码的程序。
INT 21H (0x21)
Function 07H (0x07) --> Unfiltered character input
without Echo
Call with: AH = 07H
Returns: AL = 8-bit input data
评论:
此函数从标准输入设备读取一个字符,而不将其回显到标准输出设备。
INT 21H (0x21)
Function 08H (0x08) --> Character input without
echo
Call with: AH = 08H
Returns: AL = 8-bit input data
评论:
此函数从标准输入设备读取一个字符,而不将其回显到标准输出设备。
INT 21H (0x21)
Function 09H (0x09) --> Display string
Call with: AH = 09H
DS:DX = segment: offset of string
Returns: Nothing
评论:
它将字符串发送到标准输出设备。输出可能会被重定向。如果输出已被重定向,则无法检测磁盘已满。字符串也可以通过使用标准输出 (0001H) 的预定义句柄执行写入 (INT 21H 函数 40H) 发送到显示器,如果它没有被重定向,或者通过打开逻辑设备 CON 获得的句柄。
INT 21H (0x21)
Function 0AH (0x0A or 10) --> Buffered keyboard
input
Call with: AH = 0AH
DS:DX = segment: offset of buffer
Returns: Data placed in buffer, Returns Nothing
评论:
它从标准输入设备读取一串字节,直到并包括一个 ASCII 回车符 (0DH),并将它们放在用户指定的缓冲区中。字符回显到标准输出设备。该函数使用的缓冲区具有以下格式:
Byte |
Contents |
0 |
Maximum number of characters to read, set by program |
1 |
Number of characters actually read (excluding carriage return), set by MS-DOS |
2+ |
String read from keyboard or standard input, terminated by a carriage return (0DH) |
INT 21H (0x21)
Function 0BH (0x0B or 11) --> Check input status
Call with: AH = 0BH
Returns: AL = 00H (if no character is available)
FFH (if at least one character is available)
评论:
检查字符是否可从标准输入设备(如键盘)获得。该功能相当于 IOCTL INT 21H 功能 44H 子功能 06H。
INT 21H (0x21)
Function 0CH (0x0C or 12) --> Flush input buffer
and then Input
Call with: AH = 0CH
AL = number of input to be invoked after resetting
buffer (must be 01H, 06H, 07H, 08H or 0AH)
If AL = 0AH
DS: DX = segment: offset of input buffer
Returns: If called with AL = 01H, 06H, 07H, or 08H,
AL = 8-bit input data
If called with AL= 0AH,
Nothing (data placed in buffer)
评论:
清除标准输入缓冲区,然后调用字符输入函数之一。输入可以重定向。 AL 中除 01H、06H、07H、08H 或 0AH 之外的函数号会刷新输入缓冲区并将控制权返回给调用程序。
INT 21H (0x21)
Function 0DH (0x0D or 13) -> Disk reset
Call with: AH = 0DH
Returns:Nothing
评论:
此函数刷新所有文件缓冲区。该函数不会为任何仍然打开的文件更新磁盘目录。
INT 21H (0x21)
Function 0EH (0x0E or 14) -> Select disk
Call with: AH = 0EH
DL = drive code (0 = A, 1= B, etc.)
Returns: AL = number of logical drives in system
评论:
选择指定驱动器为当前或默认磁盘驱动器,并返回系统中逻辑驱动器的总数。
应用程序应将自身限制为驱动器号 A-Z(0 = A、1 = B 等)。逻辑驱动器是指软盘和硬盘驱动器等块设备的总数。通常将单个物理硬盘驱动器划分为两个或多个逻辑驱动器。
INT 21H (0x21)
Function 0FH (0x0F or 15) -> Open file
Call with: AH = 0FH
S: DX = segment: offset of file control block
Returns: If function successful and file found
AL = 00H
And FCB filled in by MS-DOS is as follows:
Drive field (offset 00H) =1 for drive A, 2 for drive B, etc. Current block field (offset 0CH) = 00H
Record size field (offset 0EH) = 0080H
Size field (offset 10H) = file size from directory
Data field (offset 14H) = date stamp from directory
Time field (offset 16H) = time stamp from directory
If function unsuccessful and file not found
AL = 0FFH
评论:
打开一个文件并使其可用于后续的读/写操作。如果程序要使用 128 字节以外的记录大小,则应在文件成功打开后和任何其他磁盘操作之前将记录大小字段设置为 FCB 偏移量 0EH。
INT 21H (0x21)
Function 10H (0x10 or 16) -> Close file
Call with: AH = 10H
DS: DX = segment: offset of file control block
Returns: If function successful (directory update successful)
AL = 00H
If function unsuccessful (file not found in directory)
AL = FFH
评论:
用于关闭文件。它关闭一个文件,将与该文件关联的所有 MS-DOS 内部磁盘缓冲区刷新到磁盘,如果文件已被修改或扩展,则更新磁盘目录。
INT 21H (0x21)
Function 11H (0x11 or 17) -> Find first file
Call with: AH = 11H
DS: DX = segment: offset of file control block
Returns: If function successful and matching file found
AL = 00H
并将当前磁盘传输区 (DTA) 地址处的缓冲区填充为未打开的普通 FCB 或扩展 FCB,具体取决于输入的 FCB 类型。
如果函数不成功(没有找到匹配的文件名)
AL = FFH
评论:
它在指定驱动器上的当前目录中搜索匹配的文件名。您可以使用通配符(? 和 *)。此函数返回第一个匹配的文件名。
INT 21H (0x21)
Function 12H (0x12 or 18) -> Find next file
Call with: AH = 12H
DS: DX = segment: offset of file control block
Returns: If function successful and matching filename found
AL = 00H
And buffer at current disk transfer area (DTA) address set up as an unopened normal FCB or extended FCB, depending on which type of FCB was originally input to INT21H function 11H
If function unsuccessful and matching filenames not found
AL = FFH
评论:
这是前一个函数的伴侣。如果 INT 21H 函数 11H 成功,则返回下一个匹配的文件名(如果有)。此函数假定用作输入的 FCB 已通过先前调用 INT 21H 函数 11H 和可能的后续调用 INT 21H 函数 12H 正确初始化,并且正在搜索的文件名或扩展名包含至少一个通配符。
INT 21H (0x21)
Function 13H (0x13 or 19) -> Delete file
Call with: AH = 13H
DS: DX = segment: offset of file control block
Returns: If function is successful and file or files deleted
AL = 00H
If function is unsuccessful and no matching files were found or at least one matching file was read-only,
AL = FFH
评论:
它从默认或指定磁盘驱动器上的当前目录中删除所有匹配的文件。您还可以使用通配符(? 和 *)。
INT 21H (0x21)
Function 14H (0x14 or 20) -> Sequential read
Call with: AH = 14H
DS: DX = segment: offset of previously opened
file control block
Returns: AL = 00H if read successful
01H if end of file
02H if segment wrap
03H if partial record read at end of
file
评论:
该函数从文件中读取下一个连续的数据块,然后适当地递增文件指针。要读取的数据字节数由文件控制块(FCB)的记录大小字段(偏移量 0EH)指定。
记录在当前磁盘传输区 (DTA) 地址处读入内存,该地址由最近调用的 INT 21H 函数 1AH 指定。如果记录的大小和缓冲区的位置会发生段溢出或回绕,则函数将失败并返回代码 02H。
INT 21H (0x21)
Function 15H (0x15 or 21) --> Sequential write
Call with: AH = 15H
DS: DX = segment: offset of previously opened file control block
Returns: AL = 00H, if write successful
01H, if disk is file
02H, if segment wrap
评论:
该函数将下一个连续的数据块写入文件,然后适当地递增文件指针。要写入的数据字节数由文件控制块 (FCB) 的记录大小字段(偏移量 0EH)指定。
INT 21H (0x21)
Function 16H (0x16 or 22) --> Create file
Call with: AH = 16H
DS: DX = segment: offset of unopened file control block
Returns: If function is successful and file was created or truncated
AL = 00H
And FCB filled in by MS-DOS as follows:
Drive field (offset 00H) = 1 for drive A, 2 for drive B, etc.
Current block field (offset0CH) = 00H
Record size field (offset 0EH) = 0080H
Size field (offset 10H) = file size from directory
Date field (offset 14H) = date stamp from directory
Time field (offset 16H = time stamp from directory
If function unsuccessful (directory full)
AL = FFH
评论:
此函数在当前目录中创建一个新的目录条目,或将任何现有的同名文件截断为零长度。还会打开文件以进行后续读/写操作。必须谨慎使用此函数,因为具有指定名称的现有文件将被截断为零长度,并且该文件中的所有数据都将无法挽回地丢失。
INT 21H (0x21)
Function 17H (0x17 or 23) --> Rename file
Call with: AH = 17H
DS: DX = segment: offset of special file control block
Returns: If function is successful and one or more files renamed
AL = 00H
If function is unsuccessful and no matching files, or new filename matched an existing file
AL = FFH
评论:
此函数更改指定驱动器中磁盘上当前目录中所有匹配文件的名称。
您也可以使用通配符。特殊文件控制块在通常的位置(字节 0 到 0BH)有一个驱动器代码、文件名和扩展名,以及在第一个文件名之后 6 个字节开始的第二个文件名(偏移量 11H)。
INT 21H
Function 18H (0x18 or 24) --> Reserved
INT 21H (0x21)
Function 19H (0x19 or 25) --> Get current disk
Call with: AH = 19H
Returns: AL = drive code (0 for A drive, 1 for B drive etc.)
评论:
此函数返回当前或默认磁盘驱动器的驱动器代码。
INT 21H (0x21)
Function 1AH (0x1A or 26) --> Set DTA address
Call with: AH = 1AH
DS: DX = segment: offset of disk transfer area.
Returns: Nothing
评论:
该函数指定用于后续FCB相关函数调用的磁盘传输区(DTA)的地址。
INT 21H (0x21)
Function 1BH (0x1B or 27) --> Get default drive
data
Call with: AH = 1BH
Returns: If function successful
AL = sectors per cluster
DS: DX = segment offset of media ID byte
CX = size of physical sector in bytes
DX = number of clusters for default drive
If function unsuccessful (invalid drive or critical error)
AL = FFH
评论:
此函数从其文件分配表中获取有关默认磁盘驱动器的选定信息和指向媒体标识字节的指针。
媒体ID字节的含义如下:
Media Descriptor ID |
Medium |
0F0H |
3.5-inch Floppy Disk, double-sided, 18 sectors (or other) |
0F8H |
fixed disk |
0F9H |
5.25-inch Floppy Disk, double-sided, 15 sectors |
0F9H |
3.5-inch Floppy Disk, double-sided, 9 sectors |
0FCH |
5.25-inch Floppy Disk, single-sided, 9 sectors |
0FDH |
5.25-inch Floppy Disk, double-sided, 9 sectors |
0FDH |
8-inch Floppy Disk, single sided, single density |
0FEH |
5.25-inch Floppy Disk, single-sided, 8 sectors |
0FEH |
8-inch Floppy Disk, Single Sided, Single Density |
0FEH |
8-inch Floppy Disk, Double Sided, Double Density |
0FFH |
5.25-inch Floppy Disk, double-sided, 8 sectors |
INT 21H (0x21)
Function 1CH (0x1C or 28) --> Get drive data
Call with: AH = 1CH
DL = Drive Code
Returns: If function is successful
AL = sectors per cluster
DS: BX = segment: offset of media ID byte
CX = size of physical sector in bytes
DX = number of clusters for default or specified drive
If function is unsuccessful and invalid drive or critical error
AL = FFH
评论:
此函数从其文件分配表中获取有关指定磁盘驱动器的分配信息和指向媒体标识字节的指针。有关媒体 ID 信息,请参阅 INT 21H 功能 1BH 中给出的媒体描述符 ID 字节表。
INT 21H (0x21)
Function 1DH (0x1D or 29) --> Reserved
INT 21H (0x21)
Function 1EH (0x1E or 30) --> Reserved
INT 21H (0x21)
Function 1FH (0x1F or 31) --> Reserved
INT 21H (0x21)
Function 20H (0x20 or 32) --> Reserved
INT 21H (0x21)
Function 21H (0x21 or 33) --> Random read
Call with: AH = 21H
DS: DX = segment: offset of previously opened
file control block
Returns: AL = 00H if read successful
01H if end of file
02H if segment wrap, read canceled
03H if partial record read at end of
file
评论:
此函数从文件中将选定的记录读入内存。记录在当前磁盘传输区域地址处读入内存,该地址由最近一次调用 INT 21H 函数 1AH 指定。
INT 21H (0x21)
Function 22H (0x22 or 34) --> Random write
Call with: AH = 22H
DS: DX = segment: offset of previously opened
file control block
Returns: AL = 00H if write successful
01H if disk full
02H if segment wrap, write canceled
评论:
此函数将内存中的数据写入文件中的选定记录。
INT 21H (0x21)
Function 23H (0x23 or 35) --> Get file size
Call with: AH = 23H
DS: DX = segment: offset of unopened file
control block
Returns: If function is successful and matching filename found
AL = 00H
And FCB relative-record field (offset 21H) set to the number of records in the file, rounded up if necessary to the next complete record
If function is unsuccessful and no matching file found
AL = FFH
评论:
该函数在当前目录中搜索匹配的文件;如果找到,则根据记录数使用文件大小更新 FCB。此函数没有默认记录大小,因此在调用此函数之前,必须在 FCB 记录大小字段(偏移量 0EH)中放置适当的值。
INT 21H (0x21)
Function 24H (0x24 or 36) --> Set relative record
number
Call with: AH = 24H
DS: DX = segment: offset of previously opened
file control block
Returns: AL is destroyed (other register not affected)
FCB relative-record field (offset 21H) updated
评论:
此函数设置文件控制块 (FCB) 的相对记录编号字段,以对应于记录在打开的 FCB 中的当前文件位置。
INT 21H (0x21)
Function 25H (0x25 or 37) --> Set interrupt vector
Call with: AH = 25H
AL = interrupt number
DS: DX = segment: offset of interrupt handling
routine
Returns: Nothing
评论:
此函数初始化 CPU 中断向量以指向中断处理例程。它应该优先用于直接编辑中断向量表由表现良好的应用程序。
INT 21H (0x21)
Function 26H (0x26 or 38) --> Create new Program
Segment Prefix (PSP)
Call with: AH = 26H
DX = segment: of new program segment
prefix (PSP)
Returns: Nothing
评论:
此函数将当前执行程序的程序段前缀(PSP)复制到空闲内存中的指定段地址,然后更新新的 PSP 以使其可供其他程序使用。
INT 21H (0x21)
Function 27H (0x27 or 39) --> Random block read
Call with: AH = 27H
CX = number of records to read
DS: DX = segment: offset of previously opened
file control block
Returns: AL = 00H if all requested records read
01H if end of file
02H if segment wrap
03H if partial record read at end of
file
CX = actual number of records read
评论:
这个函数从一个文件中读取一个或多个连续的记录到内存中,从一个指定的文件位置开始。如果缓冲区的大小和位置会发生段溢出或回绕,则函数将失败并返回代码 02H,并且如果在文件末尾读取部分记录,则用零填充记录的其余部分.
INT 21H (0x21)
Function 28H (0x28 or 40) --> Random block write
Call with: AH = 28H
CX = number of records to write
DS: DX = segment: offset of previously opened
file control block
Returns: AL = 00H if all requested records written
01H if disk full
02H if segment wrap
CX = actual number of records written
评论:
此函数将一个或多个连续记录从内存写入文件,从指定的文件位置开始。如果缓冲区的大小和位置会发生段溢出或回绕,则函数将失败并返回代码 02H。
INT 21H (0x21)
Function 29H (0x29 or 41) --> Parse filename
Call with: AH = 29H
AL = flags to control parsing
Bit 0 = 1, if leading separators will be
scanned off (ignored).
= 0, if leading separators will not be
scanned off
Bit 1 = 1, if drive ID byte in FCB will be
modified only if a drive was
specified in the string being parsed.
= 0, if the drive ID byte in FCB will be
modified regardless, if no drive
specifier is present in the parsed string, FCB drive code field is set to 0 (default)
Bit 2 = 1, if filename field in FCB will be
modified only if a filename is
specified in the string being parsed.
= 0, if filename field in FCB will be modified regardless, if no filename is presenting the parsed string, FCB filename is set to ASCIIZ blanks.
Bit 3 = 1, if extension field in FCB will be
modified, only if an Extension is
specified in the string being parsed.
= 0, if extension field in FCB will be
modified regardless, if no extension
is present in the parsed string, FCB
extension is set to ASCIIZ blanks
DS: SI = segment: offset of string
ES: DI = segment: offset of file control block
Returns: AL = 00H, if no wildcard characters
Encountered 01H, if parsed string
contained wildcard characters FFH,
if drive specifier invalid
DS: SI = segment: offset of first character
after parsed filename
ES: DI = segment: offset of formatted
unopened file control block
评论:
此函数将文本字符串解析为文件控制块 (FCB) 的各个字段。
此函数将字符(:. ; , = + tab space )视为分隔符,并将所有控制字符和字符(: . ; , = + tab space < > | / “ [ ])视为终止符.
INT 21H (0x21)
Function 2AH (0x2A or 42) --> Get day and date
Call with: AH = 2AH
Returns: CX = year (1980 through 2099)
DH = month (1 through 12)
DL = day (1 through 31)
AL = day of the week (0 = Sunday,
1= Monday, etc.)
评论:
该函数获取系统月份的日期、星期几、月份和年份。
INT 21H (0x21)
Function 2BH (0x2B or 43) --> Set date
Call with: AH = 2BH
CX = year (1980 through 2099)
DH = month (1 through 12)
DL = day (1 through 31)
Returns: AL = 00H if date set successfully
FFH if date not valid (ignored)
评论:
此函数将系统时钟驱动程序初始化为特定日期,但系统时间保持不变。
INT 21H (0x21)
Function 2CH (0x2C or 44) --> Get time
Call with: AH = 2CH
Returns: CH = hours (0 through 23)
CL = minutes (0 through 59)
DH = seconds (0 through 59)
DL = hundredths of seconds (0 through 99)
评论:
这用于从系统实时时钟驱动程序获取一天中的时间,转换为小时、分钟、秒和百分之一秒。
INT 21H (0x21)
Function 2DH (0x2D or 45) --> Set time
Call with: AH = 2DH
CH = hours (0 through 23)
CL = minutes (0 through 59)
DH = seconds (0 through 59)
DL = hundredths of seconds (0 through 99)
Returns: AL = 00H, if time set successfully
FFH, if time not valid (ignored)
评论:
该函数将系统实时时钟初始化为指定的时、分、秒和百分之一秒。系统日期不受影响。
INT 21H (0x21)
Function 2EH (0x2E or 46) --> Set verify flag
Call with: AH = 2EH
AL = 00H, if turning off verify flag
01H, if turning on verify flag
DL = 00H
Returns: Nothing
评论:
该函数关闭或打开操作系统标志,用于数据的自动读写验证。验证标志的默认设置为关闭,因为写入后读取验证会减慢磁盘操作。
INT 21H (0x21)
Function 2FH (0x2F or 47) --> Get DTA address
Call with: AH = 2FH
Returns:ES: BX = segment: offset of disk transfer area
评论:
该函数获取磁盘传输区(DTA)的当前地址,用于FCB文件读/写操作。
INT 21H (0x21)
Function 30H (0x30 or 48) --> Get MS-DOS
version number
Call with: AH = 30H
AL = 00H
Returns: AL = major version number (MS-DOS 3.10=3, etc.)
AH = minor version number (MS-DOS 3.10= 0AH, etc.)
BH = Original Equipment Manufacturer’s
(OEM’s) serial number (OEM-dependent-usually 00H for IBM’s
PC-DOS, 0FFH or other values for MS-DOS)
BL: CX = 24-bit user serial number (optional, OEM-dependent)
评论:
它返回主机 MS-DOS 操作系统的版本号。
INT 21H (0x21)
Function 31H (0x31 or 49) --> Terminate and Stay
Resident (TSR)
Call with: AH = 31H
AL = return code
DX = amount of memory in paragraphs, to reserve
Returns Nothing
评论:
此函数通过将返回码传递给父进程来终止当前正在执行的程序的执行,但保留程序的部分或全部内存,以便下一个要加载的临时程序覆盖它。该函数应优先使用 INT 27H,因为它支持 CS 包含程序段前缀的段。
INT 21H (0x21)
Function 32H (0x32 or 50) --> Reserved
INT 21H (0x21)
Function 33H (0x33 or 51) --> Get or set break flag, get boot Drive
Call with: If getting break flag
AH = 33H
AL = 00H
If setting break flag
AH = 33H
AL = 01H
DL = 00H if turning break flag OFF
01H if turning break flag ON
If getting boot drive
AH = 33H
AL = 05H
Returns: If called with AL = 00H or 01H
DL = 00H break flag is OFF
01H break flag is ON
If called with AL = 05H
DL = boot drive (1 = A, 2 = B, etc.)
评论:
该函数获取或改变操作系统中断标志的状态,影响函数调用过程中的Ctrl-C检查。
INT 21H (0x21)
Function 34H (0x34 or 52) --> Reserved
INT 21H (0x21)
Function 35H (0x35 or 53) --> Get interrupt vector
Call with: AH = 35H
AL = interrupt number
Returns: ES: BX = segment: offset of interrupt handler
评论:
此函数获取指定机器中断的当前中断处理程序的地址。
INT 21H (0x21)
Function 36H (0x36 or 54) --> Get drive allocation
Information
Call with: AH = 36H
DL = drive code (0 default, 1 = A, etc.)
Returns: If function successful
AX = sector per cluster
BX = number of available cluster
CX = bytes per sector
DX = cluster per drive
If function unsuccessful (drive invalid)
AX = FFFFH
评论:
此函数获取有关磁盘驱动器的选定信息。
此功能在数据恢复和磁盘故障排除编程中非常重要,可以从中计算驱动器的容量和剩余可用空间以及许多其他重要信息。
INT 21H (0x21)
Function 37H (0x37 or 55) --> Reserved
INT 21H (0x21)
Function 38H (0x38 or 56) --> Get or set country
information
Call with: If getting country information
AH = 38H
AL = 0, to get current country information
1-FEH, to get information for
countries with code <255
FFH, to get information for countries
with code >=255
BX = country code, if AL = FFH
DS:DX = segment: offset of buffer for returned information
If setting current country code
AH = 38H
AL = 1-FEH, country code for countries with code <255
FFH, for countries with code >=255
BX = country code, if AL = 0FFH
DX = FFFFH
Returns:
If function is successful
Carry flag = clear
And, if getting internationalization information
BX = country code
DS: DX = segment: offset of buffer holding internationalization Information.
If function is unsuccessful
Carry flag = set
AX = error code
评论:
该函数获取当前或指定国家的国际信息或设置当前国家代码。
INT 21H (0x21)
Function 39H (0x39 or 57) --> Create directory
Call with: AH = 39H
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
评论:
此函数使用指定的驱动器和路径创建目录。
ASCIIZ is known as the sequence of ASCII characters terminated be, Null or Zero, Byte. |
INT 21H (0x21)
Function 3AH (0x3A or 58) --> Delete directory
Call with: AH = 3AH
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
评论:
此函数使用指定的驱动器和路径删除目录。如果路径名的任何元素不存在或目录不为空或访问被拒绝或指定的目录也是当前目录,则删除目录的功能失败。
INT 21H (0x21)
Function 3BH (0x3B or 59) --> Set current
directory
Call with: AH = 3BH
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
评论:
此函数使用指定的驱动器和路径设置当前或默认目录。如果指定的路径或路径的任何元素不存在,则函数失败。
INT 21H (0x21)
Function 3CH (0x3C or 60) --> Create file
Call with: AH = 3CH
CX = file attribute, where attribute
significance bits may be Combined.
位的意义如下表所示:
Bit(s) |
Significance (if set) |
0 |
Read-only |
1 |
Hidden |
2 |
System |
3 |
Volume label |
4 |
Reserved (0) |
5 |
Archive |
6 – 15 |
Reserved (0) |
DS: DX = segment: offset of ASCIIZ
pathname
Returns: If function successful
Carry flag = clear
AX = handle
If function unsuccessful
Carry flag = set
AX = error code
评论:
如果给出了 ASCIIZ 路径名,则此函数在指定或默认磁盘驱动器上的指定或默认目录中创建一个新文件。如果指定的文件已存在,则将其截断为零长度。在任何一种情况下,都会打开文件并返回一个句柄,程序可以使用该句柄对文件进行后续访问。
如果路径名的任何元素不存在或正在根目录创建文件且根目录已满或访问被拒绝或具有只读属性的文件已在指定目录中,则创建文件功能失败.
INT 21H (0x21)
Function 3DH (0x3D or 61) --> Open file
Call with: AH = 3DH
AL = access mode
下表给出了访问模式位的意义:
Bits |
Significance |
0 – 2 |
Access Mode
000 = read access
001 = write access
010 = read/write access |
3 |
Reserved (0) |
4 – 6 |
Sharing Mode
000 = compatibility mode
001 = deny all
010 = deny write
011 = deny read
100 = deny none |
7 |
Inheritance flag
0 = child process inherits handle
1 = child does not inherit handle |
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
AX = handle
If function unsuccessful
Carry flag = set
AX = error code
评论:
如果给出了 ASCIIZ 路径名,则此函数打开指定或默认磁盘驱动器上指定或默认目录中的指定文件。返回一个句柄,程序可以使用该句柄对文件进行后续访问。
INT 21H (0x21)
Function 3EH (0x3E or 62) --> Close file
Call with: AH = 3EH
BX = handle
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
评论:
此函数将与文件关联的所有内部缓冲区刷新到磁盘,关闭文件,并释放句柄以供重用,以前打开或成功创建给定句柄。如果文件被修改,则在文件的目录条目中更新时间和日期戳以及文件大小。
INT 21H (0x21)
Function 3FH (0x3F or 63) --> Read file or device
Call with: AH = 3FH
BX = handle
CX = number of bytes to read
DS: DX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AX = byte transferred
If function unsuccessful
Carry flag = set
AX = error code
评论:
此函数将当前文件指针位置的数据从文件传输到缓冲区,然后根据先前的打开或创建操作更新给定有效文件句柄的文件指针位置、缓冲区地址和字节长度.
INT 21H (0x21)
Function 40H (0x40 or 64) --> Write file or device
Call with: AH = 40H
BX = handle
CX = number of bytes to write
DS: DX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AX = byte transferred
If function unsuccessful
Carry flag = set
AX = error code
评论:
此函数将数据从缓冲区传输到文件中,然后根据先前的打开或创建操作更新给定有效文件句柄的文件指针位置、缓冲区地址和字节长度。如果函数以 CX = 0 调用,则文件被截断或扩展至当前文件指针位置。
INT 21H (0x21)
Function 41H (0x41 or 65) --> Delete file
Call with: AH = 41H
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
评论:
此函数从默认或指定的磁盘和目录中删除文件。该函数通过将根目录中文件名的第一个字符替换为字符 E5H (0xE5) 来删除文件,并使文件的簇可用于文件分配表中的新数据。直到那时存储在这些集群中的实际数据不会被覆盖.
INT 21H (0x21)
Function 42H (0x42 or 66) --> Set file pointer
Call with: AH = 42H
AL = method code
00H absolute offset from start of file
01H signed offset from current file
pointer
02H signed offset from end of file
BX = handle
CX = most significant half of offset
DX = least significant half of offset
Returns: if function is successful
Carry flag = clear
DX = most significant half of resulting file
pointer
AX = least significant half of resulting file
pointer
If function is unsuccessful
Carry flag = set
AX = error code
评论:
此函数设置相对于文件开头、文件结尾或当前文件位置的文件指针位置。
INT 21H (0x21)
Function 43H (0x43 or 67) --> Get or set file
attributes
Call with: AH = 43H
AL = 00H to get attributes
01H to set attributes
CX = file attribute, if AL=01H. Bits can be combined
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
CX = file attribute
If function unsuccessful
Carry flag = set
AX = error code
评论:
此函数获取或更改文件(只读、隐藏、系统或存档)或目录的属性。对于不同属性的位的重要性,请参阅前面给出的位重要性表。
INT 21H (0x21)
Function 44H (0x44 or 68) --> Input/Output
Control (I/O Ctrl)
该函数提供了应用程序和设备驱动程序之间的直接通信路径。它允许程序获取硬件相关信息并请求其他 MS-DOS 函数调用不支持的操作。
输入输出控制的子功能如下表所示:
Sub function |
Operation Name |
00H |
Get Device Information |
01H |
Set Device Information |
02H |
Receive Control Data from Character Device Driver |
03H |
Send Control Data to Character Device Driver |
04H |
Receive Control Data from Block Device Driver |
05H |
Send Control Data to Block Device Driver |
06H |
Check Input Status |
07H |
Check Output Status |
08H |
Check If Block Device Is Removable |
09H |
Check If Block Device Is Remote |
0AH (10) |
Check If Handle Is Remote |
0BH (11) |
Change Sharing Retry Count |
0CH (12)
|
Generic I/O Control for Character Devices
Value |
Description |
CL = 45H |
Set Iteration Count |
CL = 4AH |
Select Code Page |
CL = 4CH |
Start Code Page Preparation |
CL = 4DH |
End Code Page Preparation |
CL = 5FH |
Set Display Information |
CL = 65H |
Get Iteration Count |
CL = 6AH |
Query Selected Code Page |
CL = 6BH |
Query Prepare List |
CL = 7FH |
Get Display Information |
|
0DH (13)
|
Generic I/O Control for Block Devices
Value |
Description |
CL = 40H |
Set Device Parameters |
CL = 41H |
Write Track |
CL = 42H |
Format and Verify Track |
CL = 47H |
Set Access Flag |
CL = 60H |
Get Device Parameters |
CL = 61H |
Read Track |
CL = 62H |
Verify Track |
CL = 67H |
Get Access Flag |
|
0EH (14) |
Get Logical Drive Map |
0FH (15) |
Set Logical Drive Map |
INT 21H (0x21)
Function 44H (0x44 or 68), sub function 00H (0x00)
I/O Ctrl --> get device information
Call with: AH = 44H
AL = 00H
BX = handle
Returns: If function successful
Carry flag = clear
DX = device information word
If function unsuccessful
Carry flag = set
AX = error code
评论:
此子函数返回与指定句柄关联的文件或设备的设备信息字。
INT 21H (0x21)
Function 44H (0x44 or 68), sub function 01H (0x01)
I/O Ctrl --> set device information
Call with: AH = 44H
AL = 01H
BX = handle
DX = device information word
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
评论:
INT 21H 的函数 44H 的这个子函数,为与字符设备关联的句柄设置某些标志。此子函数不能用于与文件关联的句柄。
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 02H (0x02)
I/O Ctrl --> read control data character device
driver
Call with: AH = 44H
AL = 02H
BX = handle
CX = number of bytes to read
DS: DX = segment: offset of buffer
Returns: If function is successful
Carry flag = clear
AX = bytes read
And buffer contains control data from driver
If function is unsuccessful
Carry flag = set
AX = error code
评论:
它从字符设备驱动程序中读取控制数据。数据的长度和内容由每个设备驱动程序指定,不遵循任何标准格式。此功能不一定会导致来自物理设备的任何输入。
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 03H (0x03)
I/O Ctrl --> write control data character-device
driver
Call with: AH = 44H
AL = 03H
BX = handle
CX = number of bytes to write
DS: DX = segment: offset of data
Returns: If function successful
Carry flag = clear
AX = bytes transferred
If function unsuccessful
Carry flag = set
AX = error code
评论:
此子函数将控制数据从应用程序传输到字符设备驱动程序。数据的长度和内容特定于每个设备驱动程序,不遵循任何标准格式。如果有任何输出到物理设备,则不一定会产生此功能。
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 04H (0x04)
I/O Ctrl --> Read control data block-device driver
Call with: AH = 44H
AL = 04H
BL = device code (0= default, 1=A, 2=B, etc.)
CX = number of bytes to read
DS: DX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AX = bytes transferred
And buffer contains control data from device driver
If function unsuccessful
Carry flag = set
AX = error code
评论:
此子函数将控制数据从块设备驱动程序直接传输到应用程序的缓冲区。数据的长度和内容特定于每个设备驱动程序,不遵循任何标准格式。此功能不一定会导致来自物理设备的输入。
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 05H (0x05)
I/O Ctrl --> write control data block-device driver
Call with: AH = 44H
AL = 05H
BL = device code (0= default, 1=A, 2=B, etc.)
CX = number of bytes to write
DS: DX = segment: offset of data
Returns: If function successful
Carry flag = clear
AX = bytes transferred
If function unsuccessful
Carry flag = set
AX = error code
评论:
此子函数将控制数据从应用程序直接传输到块设备驱动程序。控制数据的长度和内容特定于每个设备驱动程序,不遵循任何标准格式。此函数不一定会导致对物理设备的任何输出。
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 06H (0x06)
I/O Ctrl --> check input status
Call with: AH = 44H
AL = 06H
BX = handle
Returns: If function successful
Carry flag = clear
And for a device:
AL = 00H, if device not ready
FFH, if device ready
For a file:
AL = 00H, if file pointer at EOF
FFH, if file pointer not at EOF
If function unsuccessful
Carry flag = set
AX = error code
评论:
它返回一个代码,指示与句柄关联的设备或文件是否已准备好输入。
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 07H (0x07)
I/O Ctrl --> check output status
Call with: AH = 44H
AL = 07H
BX = handle
Returns: If function successful
Carry flag = clear
And for a device:
AL = 00H, if device not ready
FFH, if device ready
For a file:
AL = FFH
If function unsuccessful
Carry flag = set
AX = error code
评论:
它返回一个代码,指示与句柄关联的设备是否准备好输出。
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 08H (0x08)
I/O Ctrl --> check if block device is removable
Call with: AH = 44H
AL = 08H
BL = drive number (0 = default, 1=A, 2=B, etc.)
Returns: If function successful
Carry flag = clear
AL = 00H, if medium is removable
01H, if medium is not removable
If function unsuccessful
Carry flag = set
AX = error code
评论:
该子函数检查指定的块设备是否包含可移动存储介质,例如软盘。如果在特定驱动器上未按预期找到文件,则程序可以使用此子功能来确定是否应提示用户插入另一个磁盘。
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 09H (0x09)
I/O Ctrl --> check if block device is remote
Call with: AH = 44H
AL = 09H
BL = drive number (0 = default, 1=A, 2=B, etc.)
Returns: If function successful
Carry flag = clear
DX = device attribute word
bit 12 = 0, if drive is local
= 1, if drive is remote
If function unsuccessful
Carry flag = set
AX = error code
评论:
这个子函数检查指定的块设备是本地的(连接到运行程序的计算机)还是远程的(重定向到网络服务器)。
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 0AH (0x0A or 10) I/O Ctrl --> check if handle is remote
Call with: AH = 44H
AL = 0AH
BX = handle
Returns: If function successful
Carry flag = clear
DX = attribute word for file or device
bit 15 = 0 if local
1 if remote
If function unsuccessful
Carry flag = set
AX = error code
评论:
它检查指定的句柄是指本地(位于正在运行程序的 PC 上)还是远程(位于网络服务器上)的文件或设备。
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 0BH (0x0B or 11) I/O Ctrl --> change sharing retry count
Call with: AH = 44H
AL = 0BH
CX = delays per retry (default = 1)
DX = number of retries (default = 3)
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
评论:
此子函数设置 MS-DOS 在文件共享冲突导致失败后重试磁盘操作的次数,然后再向请求进程返回错误。除非加载了文件共享模块,否则此子功能不可用。
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 0CH (0x0C or 12) I/O Ctrl generic I/O control for
character devices
Call with: AH = 44H
AL = 0CH
BX = handle
CH =category (major) code:
00H = unknown
01H = COM1, COM2, COM3,OR COM4
03H = CON (keyboard and display)
05H = LPT1, LPT2, OR LPT3
CL = function (minor) code:
45H = Set Iteration Count
4AH = Select Code Page
4CH = Start Code Page Preparation
4DH = End Code Page Preparation
5FH = Set Display Information
65H = Get Iteration Count
6AH = Query Selected Code Page
6BH = Query Prepare List
7FH = Get Display Information
DS: DX = segment: offset of parameter block
Returns: If function successful
Carry flag = clear
And if called with CL = 65H, 6AH, 6BH or 7FH
DS: DX = segment: offset of parameter block
If function unsuccessful
Carry flag = set
AX = error code
评论:
它为应用程序和字符设备驱动程序之间的通信提供了一种通用机制。
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 0DH (0x0D or 13) I/O Ctrl --> generic I/O control for block
devices
Call with: AH = 44H
AL = 0DH
BL = drive code (0 =default, 1=A, 2=B, etc.)
CH = category (major) code:
08H = disk drive
CL = function (minor) code:
40H = Set Drive Parameters
41H = Write Track
42H = Format and Verify Track
47H = Set Access Flag
60H = Get Device Parameters
61H = Read Track
62H = Verify track
67H = Get Access Flag
DS: DX = segment: offset of parameter block
Returns: If function successful
Carry flag = clear
And if called with CL = 60H or 61H
DS: DX = segment: offset of parameter block
If function unsuccessful
Carry flag = set
AX = error code
评论:
该子函数为应用程序和块设备驱动程序之间的通信提供通用机制。允许程序检查或更改逻辑驱动器的设备参数,并以独立于硬件的方式读取、写入、格式化和验证磁盘磁道。
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 0EH (0x0E or 14) I/O Ctrl -->> get logical drive map
Call with: AH = 44H
AL = 0EH
BL = drive code (0 = default, 1=A, 2=B, etc.)
Returns: If function successful
Carry flag = clear
AL = mapping code
00H, if only one logical drive code
assigned to the block device
01H-1AH logical drive code (1=A,
2=B, etc.) mapped to the block device
If function unsuccessful
Carry flag = set
AX =error code
评论:
它返回最近用于访问指定块驱动器的逻辑驱动器代码。
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 0FH (0x0F or 15) I/O Ctrl --> set logical drive map
Call with: AH = 44H
AL = 0FH
BL = drive code (0 = default, 1=A, 2=B, etc.)
Returns: If function successful
Carry flag = clear
AL = mapping code
00H, if only one logical drive code
assigned to the block device
01H-1AH, logical drive code (1=A,
2=B, etc.) mapped to the
block device
If function unsuccessful
Carry flag = set
AX = error code
评论:
此子函数设置将用于引用块设备的下一个逻辑驱动器代码。
INT 21H (0x21)
Function 45H (0x45 or 69) --> Duplicate handle
Call with: AH = 45H
BX = handle to be duplicated
Returns: If function successful
Carry flag = clear
AX = new handle
If function unsuccessful
Carry flag = set
AX = error code
评论:
此函数返回一个新句柄,该句柄引用当前打开的设备或文件的给定句柄的相同位置的相同设备或文件。
INT 21H (0x21)
Function 46H (0x46 or 70) --> Redirect handle
Call with: AH = 46H
BX = handle for file or device
CX = handle to be redirected
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
评论:
如果有两个给定句柄,此函数使第二个句柄引用与第一个句柄相同位置的相同设备或文件。然后说第二个句柄被重定向。
INT 21H (0x21)
Function 47H (0x47 or 71) --> Get current
directory
Call with: AH = 47H
DL = drive code (0 =default, 1=A,
2=B, etc.)
DS: SI = segment: offset of 64-byte buffer
Returns: If function is successful
Carry flag = clear
And buffer is filled in with full pathname from root of current directory.
If function is unsuccessful
Carry flag = set
AX = error code
评论:
此函数获取描述从根目录到当前目录的路径的 ASCIIZ 字符串,以及该目录的名称。
INT 21H (0x21)
Function 48H (0x48 or 72) --> Allocate memory
block
Call with: AH = 48H
BX = number of paragraphs of memory
needed
Returns: If function successful
Carry flag = clear
Ax = base segment address of allocated
block
If function unsuccessful
Carry flag = set
AX = error code
BX = size of largest available block
(paragraphs)
评论:
它分配一块内存并返回一个指向分配区域开头的指针。
INT 21H (0x21)
Function 49H (0x49 or 73) --> Release memory
block
Call with: AH = 49H
ES = segment of block to be released
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
评论:
此函数用于释放内存块并使其可供其他程序使用。如果程序释放一个不属于它的内存块,或者寄存器 ES 中传递的段地址不是现有内存块的有效基地址,则该函数将失败或可能导致不可预知的系统错误。
INT 21H (0x21)
Function 4AH (0x4A or 74) --> Resize memory
block
Call with: AH = 4AH
BX = desired new block size in paragraphs
ES = segment of block to be modified
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
BX = maximum block size available
(paragraphs)
评论:
此函数根据应用程序的需要动态收缩或扩展内存块。
INT 21H (0x21)
Function 4BH (0x4B or 75) --> Execute program (EXEC)
Call with: AH = 4BH
AL = sub function
00H = Load and Execute Program
03H = Load Overlay
ES: BX = segment: offset of parameter block
DS: DX = segment: offset of ASCIIZ program
pathname
Returns: If function successful
Carry flag = clear
Registers are preserved in the usual fashion.
If function unsuccessful
Carry flag = set
AX = error code
评论:
此功能允许应用程序运行另一个程序,并在完成后重新获得控制权。也可用于加载叠加层,尽管这种用法并不常见。
INT 21H (0x21)
Function 4CH (0x4C or 76) --> Terminate process
with Return code
Call with: AH = 4CH
AL = return code
Returns: Nothing
评论:
此函数终止当前进程,将返回码传递给父进程。这是程序可以用来执行最终退出的几种方法之一。
INT 21H (0x21)
Function 4DH (0x4D or 77) --> Get return code
Call with: AH = 4DH
Returns: AH = exit type
00H, if normal termination by INT 20H, INT 21H
Function 00H, or INT 21H Functions 4CH
01H if termination by user’s entry of Ctrl-C
02H if termination by critical-error handler
03H if termination by INT21H Function 31H or
INT 27H |
AL = return code passed by child process
(0 if child terminated by INT 20H,
INT 21H Function 00H, or INT 27H)
评论:
该函数用于父进程在成功执行EXEC调用(INT 21H Function 4BH)后,获取子进程的返回码和终止类型。
INT 21H (0x21)
Function 4EH (0x4E or 78) --> Find first file
Call with: AH = 4EH
CX = search attribute (bits may be combined)
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful and matching file found
Carry flag = clear
在当前磁盘传输区返回的搜索结果如下:
Byte(s) |
Description |
00H-14H |
Reserved (0) |
15H |
Attribute of matched file or directory |
16H-17H |
File time
bits 00H-04H = 2-second increments (0-29)
bits 05H-0AH = minutes (0-59)
bits 0BH-0FH = hours (0-23) |
18H-19H
|
File date
bits 00H-04H = day (1-31)
bits 05H-08H = month (1-12)
bits 09H-0FH = year (relative to 1980) |
1AH-1DH |
File size |
1EH-2AH |
ASCIIZ filename and extension |
If function is unsuccessful
Carry flag = set
AX = error code
评论:
此函数在默认或指定驱动器上的默认或指定目录中搜索第一个匹配文件,以查找 ASCIIZ 字符串形式的给定文件规范。关于属性的位意义,请参考前面给出的位意义表。
INT 21H (0x21)
Function 4FH (0x4F or 79) --> Find next file
Call with: AH = 4FH
Returns: If function is successful and matching file found
Carry flag = clear
If function is unsuccessful
Carry flag = set
AX = error code
评论:
如果先前成功调用了 INT 21H 函数 4EH,则此函数在默认或指定驱动器上的默认或指定目录中查找与原始文件规范匹配的下一个文件。
INT 21H (0x21)
Function 50H (0x50 or 80) --> Reserved
INT 21H (0x21)
Function 51H (0x51 or 81) --> Reserved
INT 21H (0x21)
Function 52H (0x52 or 82) --> Reserved
INT 21H (0x21)
Function 53H (0x53 or 83) --> Reserved
INT 21H (0x21)
Function 54H (0x54 or 84) --> Get verify flag
Call with: AH = 54H
Returns: AL = current verify flag value
00H if verify off
01H if verify on
评论:
该函数获取系统校验(read-after-write)标志的当前值。
INT 21H (0x21)
Function 55H (0x55 or 85) --> Reserved
INT 21H (0x21)
Function 56H (0x56 or 86) --> Rename file
Call with: AH = 56H
DS: DX = segment: offset of current ASCIIZ
pathname
ES: DI = segment: offset of new ASCIIZ
pathname
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
评论:
此函数重命名文件和/或将其目录条目移动到同一磁盘上的不同位置。在 MS-DOS 3.0 及以后的版本中,此功能也可用于重命名目录
如果路径名的任何元素不存在,或者具有新路径名的文件已经存在,或者当前路径名规范包含与新路径名不同的磁盘驱动器,或者文件正在移动到根目录,并且根目录已满或用户权限不足,重命名文件功能失败。
INT 21H (0x21)
Function 57H (0x57 or 87) --> Get or set file date and time
Call with: If getting date and time
AH = 57H
AL = 00H
BX = handle
If setting date and time
AH = 57H
AL = 01H
BX = handle
CX = time
bits 00H-04H = 2-second increments (0-29)
bits 05H-0AH = minutes (0-59)
bits 0BH-0FH = hours (0-23)
DX = date
bits 00H-04H = day (1-31)
bits 05H-08H = month (1-12)
bits 09H-0FH = year (relative to 1980)
Returns: If function successful
Carry flag = clear
and, if called with AL = 00H
CX = time
DX = date
If function unsuccessful
Carry flag = set
AX = error code
评论:
该函数获取或修改文件根目录项中的日期和时间戳。
INT 21H (0x21)
Function 58H (0x58 or 88) --> Get or set allocation strategy
Call with: If getting strategy code
AH = 58H
AL = 00H
If setting strategy code
AH = 58H
AL = 01H
BX = desired strategy code
00H = first fit
01H = best fit
02H = last fit
Returns: If function successful
Carry flag = clear
and, if called with AL = 00H
AX = current strategy code
If function unsuccessful
Carry flag = set
AX = error code
评论:
获取或更改指示当前 MS-DOS 分配内存块策略的代码。默认的 MS-DOS 内存分配策略是 First Fit(代码 0)。
在 First fit 内存分配中,MS-DOS 从低地址到高地址搜索可用的内存块,分配第一个足够大的内存块以满足块分配请求。
在最佳匹配分配策略的情况下,MS-DOS 搜索所有可用内存块并分配满足请求的最小可用块,无论其位置如何。
在 Last fit 内存分配策略中,MS-DOS 从高地址到低地址搜索可用的内存块,分配最高的一个足够大以满足块分配请求。
INT 21H (0x21)
Function 59H (0x59 or 89) --> Get extended error
Information
Call with: AH = 59H
BX = 00H
Returns: AX = extended error code
错误代码表如下:
Error Code |
Error |
01H |
function number invalid |
02H |
file not found |
03H |
path not found |
04H |
too many open files |
05H |
access denied |
06H |
handle invalid |
07H |
memory control blocks destroyed |
08H |
insufficient memory |
09H |
memory block address invalid |
0AH (10) |
environment Invalid |
0BH (11) |
format invalid |
0CH (12) |
access code invalid |
0DH (13) |
data invalid |
0EH (14) |
unknown unit |
0FH (15) |
disk drive invalid |
10H (16) |
attempted to remove current directory |
11H (17) |
not same device |
12H (18) |
no more files |
13H (19) |
disk write-protected |
14H (20) |
unknown unit |
15H (21) |
drive not ready |
16H (22) |
unknown command |
17H (23) |
data error (CRC) |
18H (24) |
bad request structure length |
19H (25) |
seek error |
1AH (26) |
unknown media type |
1BH (27) |
sector not found |
1CH (28) |
printer out of paper |
1DH (29) |
write fault |
1EH (30) |
read fault |
1FH (31) |
general failure |
20H (32) |
sharing violation |
21H (33) |
lock violation |
22H (34) |
disk change invalid |
23H (35) |
FCB unavailable |
24H (36) |
sharing buffer exceeded |
25H-31H |
reserved |
32H (50) |
unsupported network request |
33H (51) |
remote machine not listening |
34H (52) |
duplicate name on network |
35H (53) |
network name not found |
36H (54) |
network busy |
37H (55) |
device no longer exists on network |
38H (56) |
net BIOS command limit exceeded |
39H (57) |
error in network adapter hardware |
3AH (58) |
incorrect response from network |
3BH (59) |
unexpected network error |
3CH (60) |
remote adapter incompatible |
3DH (61) |
print queue full |
3EH (62) |
not enough space for print file |
3FH (63) |
print file canceled |
40H (64) |
network name deleted |
41H (65) |
network access denied |
42H (66) |
incorrect network device type |
43H (67) |
network name not found |
44H (68) |
network name limit exceeded |
45H (69) |
net BIOS session limit exceeded |
46H (70) |
file sharing temporarily paused |
47H (71) |
network request not accepted |
48H (72) |
print or disk redirection paused |
49H-4FH |
reserved |
50H (80) |
file already exists |
51H (81) |
reserved |
52H (82) |
cannot make directory |
53H (83) |
fail on INT 24H (critical error) |
54H (84) |
too many redirections |
55H (85) |
duplicate redirection |
56H (86) |
invalid password |
57H (87) |
invalid parameter |
58H (88) |
network device fault |
59H (89) |
function not supported by network |
5AH (90) |
required system component not installed |
BH = error class
01H |
if out of resource (such as storage or handles) |
02H |
if not error, but temporary situation (such as locked region in file) that can be expected to end |
03H |
if authorization problem |
04H |
if internal error in system software |
05H |
if hardware failure |
06H |
if system software failure not the fault of the active process (such as missing configuration files) |
07H |
if application program error |
08H |
if file or item not found |
09H |
if file or item of invalid type or format |
0AH (10) |
if file or item locked |
0BH (11) |
if wrong disk in drive, bad spot on disk, or storage medium problem |
0CH (12) |
if item already exists |
0DH (13) |
unknown error |
BL = recommend action
01H |
Retry reasonable number of times, then prompt user to select abort or ignore |
02H |
retry reasonable number of times with delay between retries, then prompt user to select abort or ignore |
03H |
get correct information from user (typically caused by incorrect file name or device specification) |
04H |
abort application with cleanup (i.e., terminate the program in as orderly a manner as possible: releasing locks, closing files, etc.) |
05H |
perform immediate exit without cleanup |
06H |
ignore error |
07H |
retry after user intervention to remove cause of error |
CH = error locus
01H unknown
02H block device (disk or disk emulator)
03H network
04H serial device
05H memory
ES: DI = ASCIIZ volume label of disk to
insert, if AX = 0022H (invalid disk change)
评论:
该函数在上一次不成功的 INT 21H 函数调用后获取详细的错误信息,包括建议的补救措施。
INT 21H (0x21)
Function 5AH (0x5A or 90) --> Create temporary
file
Call with: AH = 5AH
CX = attribute (bits may be combined)
DS: DX = segment: offset of ASCIIZ path
Returns: If function is successful
Carry flag = clear
AX = handle
DS: DX = segment: offset of complete ASCIIZ
pathname
If function is unsuccessful
Carry flag = set
AX = error code
评论:
此函数在默认或指定磁盘驱动器上的当前或指定目录中创建一个具有唯一名称的文件,并返回一个句柄,程序可以使用该句柄供程序后续访问该文件。为文件生成的名称也会在程序指定的缓冲区中返回。
如果路径名的任何元素不存在或正在根目录中创建文件,并且根目录已满,则函数将失败。
INT 21H (0x21)
Function 5BH (0x5B or 91) --> Create new file
Call with: AH = 5BH
CX = attribute (bits may be combined)
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function is successful
Carry flag = clear
AX = handle
If function is unsuccessful
Carry flag = set
AX = error code
评论:
此函数在指定或默认驱动器上的指定或默认目录中创建一个文件,并返回一个句柄,程序可以使用该句柄对给定 ASCIIZ 路径名的文件进行后续访问。
如果已存在同名同路径的文件或指定路径的任何元素不存在或正在根目录下创建文件,且根目录已满或用户访问权限不足,则功能失败。
INT 21H (0x21)
Function 5CH (0x5C or 92) --> Lock or unlock file region
Call with: AH = 5CH
AL = 00H if locking region
01H if unlocking region
BX = handle
CX = high part of region offset
DX = low part of region offset
SI = high part of region length
DI = low part of region length
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
评论:
此函数锁定或解锁文件的指定区域。除非加载了文件共享模块(如 SHARE.EXE),否则此功能不可用。
INT 21H (0x21)
Function 5DH (0x5D or 93) --> Reserved
INT 21H (0x21)
Function 5EH (0x5E or 94), sub function 00H (0x00)
--> Get machine name
Call with: AH = 5EH
AL = 00H
DS: DX = segment: offset of buffer to receive
string
Returns: If function is successful
Carry flag = clear
CH = 00H if name not defined
<> 00H if name defined
CL = netBIOS name number (if CH <> 0)
DX: DX = segment: offset of identifier (if CH <> 0)
If function is unsuccessful
Carry flag = set
AX = error code
评论:
此子函数返回标识本地计算机的 ASCIIZ 字符串的地址。此函数调用仅在 Microsoft 网络运行时可用。
INT 21H (0x21)
Function 5EH (0x5E or 94), sub function 02H (0x02)
--> Set printer setup string
Call with: AH = 5EH
AL = 02H
BX = redirection list index
CX = length of setup string
DS: SI = segment: offset of setup string
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
评论:
这个子函数指定一个字符串,在所有文件前面发送到特定的网络打印机,允许不同网络节点的用户在同一台打印机上指定个性化的操作模式。
INT 21H (0x21)
Function 5EH (0x5E or 94), sub function 03H (0x03)
--> Get printer setup string
Call with: AH = 5EH
AL = 03H
BX = redirection list index
ES: DI = segment: offset of buffer to receive
setup string
Returns: If function successful
Carry flag = clear
CX = length of printer setup string
ES: DI = segment: offset of buffer to receive
setup string
If function unsuccessful
Carry flag = set
AX = error code
评论:
此函数用于获取特定网络打印机的打印机设置字符串。
INT 21H (0x21)
Function 5FH (0x5F or 95), sub function 02H (0x02)
--> Get redirection list entry
Call with: AH = 5FH
AL = 02H
BX = redirection list index
DS: SI = segment: offset of 16-byte buffer to
receive local device name
ES: DI = segment: offset of 128-byte buffer to
receive network name
Returns: If function successful
Carry flag = clear
BH = device status flag
Bit 0 = 0 if device valid
= 1 if not valid
BL = device type
03H, if printer
04H, if drive
CX = stored parameter value
DX = destroyed
BP = destroyed
DS: SI = segment: offset of ASCIIZ local
device name
ES: DI = segment: offset of ASCIIZ network
name
If function unsuccessful
Carry flag = set
AX = error code
评论:
此子功能允许检查系统重定向列表,该列表将本地逻辑名称与网络文件、目录或打印机相关联。此函数调用仅在 Microsoft Networks 正在运行且文件共享模块已加载时可用。
INT 21H (0x21)
Function 5FH (0x5F or 95), sub function 03H (0x03) --> Redirect device
Call with: AH = 5FH
AL = 03H
BL = device type
03H, if printer
04H, if drive
DS: SI = segment: offset of ASCIIZ local
device name
ES: DI = segment: offset of ASCIIZ network
name, followed by ASCIIZ password
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
评论:
通过将本地设备名称与网络名称相关联来建立跨网络重定向。此函数调用仅在 Microsoft Networks 正在运行并且文件共享模块 (SHARE.EXE) 已加载时可用。
INT 21H (0x21)
Function 5FH (0x5F or 95), sub function 04H (0x04)
--> Cancel device redirection
Call with: AH = 5FH
AL = 04H
DS: SI = segment: offset of ASCIIZ local
device name
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
评论:
此子函数通过删除本地设备名称与网络名称的关联来取消先前的重定向请求。此函数调用仅在 Microsoft Networks 正在运行并且已加载 SHARE.EXE 等文件共享模块时可用。
INT 21H (0x21)
Function 60H (0x60 or 96) --> Reserved
INT 21H (0x21)
Function 61H (0x61 or 97) --> Reserved
INT 21H (0x21)
Function 62H (0x62 or 98) --> Get Program Segment
Prefix (PSP) address
Call with: AH = 62H
Returns: BX = segment address of program segment
prefix
评论:
该函数获取当前执行程序的程序段前缀(PSP)的段(段)地址。
INT 21H (0x21)
Function 64H (0x64 or 100) --> Reserved
INT 21H
Function 65H (0x65 or 101) --> Get extended
country Information
Call with: AH = 65H
AL = sub function
00H = Get General
Internationalization Information
02H = Get Pointer to Uppercase
Table
04H = Get Pointer to Filename
Uppercase Table
06H = Get Pointer to Collating Table
07H = Get Pointer to Double-Byte
Character Set (DBCS) Vector
BX = code page of interest (-1 = active
CON device)
CX = length of buffer to receive
information (must be >=5)
DX = country ID (-1 = default)
ES: DI = address of buffer to receive
information
Returns: If function successful
Carry flag = clear
And requested data placed in calling program’s buffer
If function unsuccessful
Carry flag = set
AX = error code
评论:
这将获取有关指定国家和/或代码页的信息。请参阅前面给出的国际化表以了解信息字节。
INT 21H (0x21)
Function 66H (0x66 or 102) --> Get or set code
page
Call with: AH = 66H
AL = sub function
01H = Get Code Page
02H = Select Code Page
BX = code page to select, if AL = 02H
Returns: If function is successful
Carry flag = clear
And, if called with AL = 01H
BX = active code page
DX = default code page
If function is unsuccessful
Carry flag = set
AX = error code
评论:
此函数获取或选择当前代码页。
INT 21H (0x21)
Function 67H (0x67 or 103) --> Set handle count
Call with: AH = 67H
BX = number of desired handles
Returns: If function is successful
Carry flag = clear
If function is unsuccessful
Carry flag = set
AX = error code
评论:
该函数设置当前进程可以使用句柄同时打开的文件和设备的最大数量。
INT 21H (0x21)
Function 68H (0x68 or 104) --> Commit file
Call with: AH = 68H
BX = handle
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
评论:
此函数强制将 MS DOS 内部缓冲区中与指定句柄关联的所有数据物理写入设备。如果句柄引用一个文件,并且该文件已被修改,则更新文件根目录条目中的时间和日期戳以及文件大小。
INT 21H (0x21)
Function 69H (0x69 or 105) --> Reserved
INT 21H (0x21)
Function 6AH (0x6A or 106) --> Reserved
INT 21H (0x21)
Function 6BH (0x6B or 107) --> Reserved
INT 21H (0x21)
Function 6CH (0x6C or 108) --> Extended open file
Call with: AH = 6CH
AL = 00H
BX = open mode
Bit(s) |
Significance |
0-2 |
Access type
000 = read-only
001 = write-only
010 = read/write |
3 |
Reserved (0) |
4-6 |
Sharing mode
000 = compatibility
001 = deny read/write (deny all)
010 = deny write
011 = deny read
100 = deny none |
7 |
Inheritance
0 = child process inherits handle
1 = child does not inherit handle |
8-12 |
Reserved (0) |
13 |
Critical error handling
0 = execute INT 24H
1 = return error to process |
14 |
Write-through
0 = writes may be buffered and deferred
1 = physical write at request time |
15 |
Reserved (0) |
CX = file attribute (bits may be combined;
if ignored if openrefer Bits Significance table.
DX = open flag
Bit(s) |
Significance |
0-3 |
Action if file exists
0000 = fail
0001 = open file
0010 = replace file |
4-7 |
Action if file does not exists
0000 = fail
0001 = create file |
8-15 |
Reserved (0) |
DS: SI = segment: offset of ASCIIZ pathname
Returns:mIf function successful
Carry flag = clear
AX = handle
CX = action taken
1 = file existed and was
opened
2 = file did not exists and
was created
3 = file existed and was
replaced
If function unsuccessful
Carry flag = set
AX = error code
评论:
此函数打开、创建或替换指定或默认磁盘驱动器上给定 ASCIIZ 路径名的指定或默认目录中的文件,并返回可供程序用于后续访问该文件的句柄。
如果路径名的任何元素不存在或正在根目录下创建文件且根目录已满或正在创建文件且已存在同名且具有只读属性的文件指定目录或用户访问权限不足,功能失败。