MS-DOS功能函数详解
立即解锁
发布时间: 2025-08-24 00:02:23 阅读量: 1 订阅数: 4 

# MS-DOS 功能函数详解
## 1. 内存释放函数(Int 21H Function 49H)
### 1.1 功能概述
该函数用于释放之前通过成功调用 Int 21H Function 48H 获得的内存块。
### 1.2 注意事项
- 此函数假定要释放的内存块是之前通过成功调用 Int 21H Function 48H 获得的。
- 如果程序释放不属于它的内存块,或者传递到寄存器 ES 中的段地址不是现有内存块的有效基地址,函数将失败或可能导致不可预测的系统错误。
### 1.3 示例代码
```asm
bufseg dw ? ; segment base of block
mov ah,49h ; function number
mov es,bufseg ; base segment of block
int 21h ; transfer to MS-DOS
jc error ; jump if release failed
```
## 2. 调整内存块大小函数(Int 21H Function 4AH)
### 2.1 功能概述
该函数可根据应用程序的需求动态缩小或扩展内存块。
### 2.2 调用参数
| 参数 | 说明 |
| --- | --- |
| AH | = 4AH |
| BX | 所需的新内存块大小(以段落为单位) |
| ES | 要修改的内存块的段地址 |
### 2.3 返回值
- 如果函数成功,进位标志(Carry flag)清零。
- 如果函数失败,进位标志置位,AX 包含错误代码,BX 包含可用的最大内存块大小(以段落为单位)。
### 2.4 注意事项
- 此函数修改之前通过调用 Int 21H Function 48H 分配的内存块的大小。
- 如果程序请求增加已分配内存块的大小且此函数失败,寄存器 BX 将返回指定内存块的最大可能大小。程序可以使用此值来确定是应该终止还是以较少的内存继续运行。
- 使用 EXEC(Int 21H Function 4BH)加载和执行子程序的程序必须首先调用此函数,为子程序提供内存,将其 PSP 的地址传递到寄存器 ES 中,并将其自身代码、数据和堆栈所需的内存量传递到寄存器 BX 中。
### 2.5 示例代码
```asm
dw ? ; segment base of block
mov ah,4ah ; function number
mov bx,0800h ; new size (paragraphs)
mov es,bufseg ; segment base of block
int 21h ; transfer to MS-DOS
jo error ; jump, resize failed
```
## 3. 执行程序函数(Int 21H Function 4BH)
### 3.1 功能概述
该函数允许应用程序运行另一个程序,并在程序结束时重新获得控制权。它也可用于加载覆盖程序,但这种用法并不常见。
### 3.2 调用参数
| 参数 | 说明 |
| --- | --- |
| AH | = 4BH |
| AL | 子功能:00H = 加载并执行程序;03H = 加载覆盖程序 |
| ES:BX | 参数块的段:偏移地址 |
| DS:DX | ASCIIZ 程序路径名的段:偏移地址 |
### 3.3 返回值
- 如果函数成功,进位标志清零。在版本 2.0 中,除 CS:IP 外的所有寄存器可能会被破坏;在版本 3.0 及更高版本中,寄存器以通常的方式保留。
- 如果函数失败,进位标志置位,AX 包含错误代码。
### 3.4 注意事项
- 子功能 00H(加载并执行程序)的参数块格式如下:
| 字节范围 | 内容 |
| --- | --- |
| 00H - 01H | 环境块的段指针 |
| 02H - 03H | 命令行尾部的偏移量 |
| 04H - 05H | 命令行尾部的段地址 |
| 06H - 07H | 要复制到新 PSP + 5CH 的第一个 FCB 的偏移量 |
| 08H - 09H | 第一个 FCB 的段地址 |
| 0AH - 0BH | 要复制到新 PSP + 6CH 的第二个 FCB 的偏移量 |
| 0CH - 0DH | 第二个 FCB 的段地址 |
- 子功能 03H(加载覆盖程序)的参数块格式如下:
| 字节范围 | 内容 |
| --- | --- |
| 00H - 01H | 覆盖程序要加载的段地址 |
| 02H - 03H | 应用于加载映像的重定位因子 |
- 环境块必须按段落对齐,它由一系列 ASCIIZ 字符串组成,整个字符串集以额外的空字节(00H)结尾。
- 命令行尾部格式由一个计数字节后跟一个 ASCII 字符串组成,以回车符(不包含在计数中)结尾。为了与 COMMAND.COM 传递给程序的命令行尾部兼容,字符串的第一个字符应为 ASCII 空格(20H)。
- 在程序使用 Int 21H Function 4BH 运行另一个程序之前,它必须通过调用 Int 21H Function 4AH 释放所有实际未使用的内存,将其自身 PSP 的段地址和要保留的段落数传递给该函数。
- 通常,父程序的所有活动句柄都会被子程序继承,但在 MS - DOS 3.0 及更高版本中,父程序可以在打开文件或设备时设置继承位来阻止这种情况。父进程中对标准输入和/或输出的任何重定向也会影响子进程。
- 环境块可用于向子进程传递信息。如果参数块中的环境块指针为零,子程序将继承父程序环境的精确副本。无论如何,子程序环境的段地址可以在其子程序 PSP 的偏移量 002CH 处找到。
- 从 EXEC 函数调用返回后,可以使用 Int 21H Function 4DH 获取子程序的终止类型和返回代码。
### 3.5 示例代码
由于篇幅原因,这里不详细列出,其调用时需要根据不同子功能设置相应的参数块和路径名等。
## 4. 带返回码终止进程函数(Int 21H Function 4CH)
### 4.1 功能概述
该函数用于终止当前进程,并将返回代码传递给父进程。这是程序执行最终退出的几种方法之一。
### 4.2 调用参数
| 参数 | 说明 |
| --- | --- |
| AH | = 4CH |
| AL | 返回代码 |
### 4.3 返回值
无
### 4.4 注意事项
- 这是应用程序首选的终止方法,因为它允许将返回代码传递给父程序,并且不依赖于任何段寄存器的内容。其他执行最终退出的方法包括:Int 20H、Int 21H Function 00H、Int 21H Function 31H、Int 27H。
- 程序使用 FCB 打开并修改的任何文件应在程序终止前关闭,否则可能会丢失数据。
- 父进程可以使用 Int 21H Function 4DH(获取返回代码)检索返回代码,也可以在批处理文件中使用 IF ERRORLEVEL 语句进行测试。按照惯例,返回代码为零表示执行成功,非零返回代码表示错误。
- 如果程序在网络上运行,它应该在终止前移除对文件区域设置的所有锁。
### 4.5 示例代码
```asm
mov ah,4ch ; function number
mov al,01h ; return code
int 21h ; transfer to MS-DOS
```
## 5. 获取返回代码函数(Int 21H Function 4DH)
### 5.1 功能概述
父进程在成功执行 EXEC 调用(Int 21H Function 4BH)后,使用该函数获取子程序的返回代码和终止类型。
### 5.2 调用参数
| 参数 | 说明 |
| --- | --- |
| AH | = 4DH |
### 5.3 返回值
| 寄存器 | 说明 |
| --- | --- |
| AH | 退出类型:<br>00H 表示通过 Int 20H、Int 21H Function 00H 或 Int 21H Function 4CH 正常终止;<br>01H 表示用户输入 Ctrl - C 终止;<br>02H 表示由关键错误处理程序终止;<br>03H 表示由 Int 21H Function 31H 或 Int 27H 终止 |
| AL | 子程序传递的返回代码(如果子程序通过 Int 20H、Int 21H Function 00H 或
0
0
复制全文
相关推荐









