MS-DOS编程的兼容性与可移植性
立即解锁
发布时间: 2025-08-24 00:02:22 阅读量: 12 订阅数: 18 


MS-DOS编程指南:深入解析与实践
# MS-DOS编程的兼容性与可移植性
## 1. 兼容性与可移植性概述
在不断发展的软硬件环境中,MS - DOS程序要保持可用性,就需考虑兼容性和可移植性。这意味着程序要能在合理的机器配置上可靠运行,充分利用系统资源,并且能轻松适应MS - DOS新版本、新机器,甚至全新的环境,如MS OS/2。
## 2. 兼容性的程度
现有MS - DOS应用程序对操作系统和硬件的使用方式可分为四类:
- **MS - DOS兼容应用程序**:仅使用有文档记录的MS - DOS函数调用,不调用ROM BIOS或直接访问硬件。使用ANSI转义序列进行屏幕控制,输入输出可重定向。这类程序能在任何支持MS - DOS的机器上运行,但由于MS - DOS内置显示和串口驱动性能较差,除编译器、汇编器和链接器外,流行程序较少属于此类。
- **ROM BIOS兼容应用程序**:使用有文档记录的MS - DOS和ROM BIOS函数调用,但不直接访问硬件。如今高质量的IBM兼容ROM BIOS确保了IBM ROM BIOS标准的主导地位,但ROM BIOS显示和串口驱动仍无法满足高性能交互式应用的需求,因此这类流行程序也不多。
- **硬件兼容应用程序**:通常使用MS - DOS函数进行大容量存储、内存管理等,在用户界面方面混合使用MS - DOS和ROM BIOS函数调用以及直接硬件访问。不同程序的硬件依赖程度差异很大,大多数流行的MS - DOS“生产力”应用程序都属于此类。
- **“行为不良”的应用程序**:依赖无文档记录的MS - DOS函数调用或数据结构、拦截MS - DOS或ROM BIOS中断,或直接访问大容量存储设备(绕过MS - DOS文件系统)。这类程序对环境极为敏感,通常需要针对每个新的MS - DOS版本或PC型号进行“调整”。
| 兼容性类型 | 使用方式 | 特点 | 流行程序情况 |
| --- | --- | --- | --- |
| MS - DOS兼容应用程序 | 仅用有文档MS - DOS函数调用,不调ROM BIOS或直访硬件 | 可在支持MS - DOS的任何机器运行 | 除编译器等外较少 |
| ROM BIOS兼容应用程序 | 用有文档MS - DOS和ROM BIOS函数调用,不直访硬件 | 依赖ROM BIOS标准 | 数量不多 |
| 硬件兼容应用程序 | 混合使用MS - DOS、ROM BIOS函数调用和直接硬件访问 | 硬件依赖程度差异大 | 多数流行“生产力”应用属此类 |
| “行为不良”的应用程序 | 依赖无文档MS - DOS内容或直访存储设备 | 对环境敏感,需调整 | 如TSR实用程序等 |
## 3. 编写行为良好的MS - DOS应用程序
### 3.1 程序结构
- 设计为具有独立代码、数据和堆栈段的.EXE文件,避免使用.COM文件。
- 使用Microsoft的段名和属性约定。
- 在运行时检查环境块以定位程序的覆盖文件或数据文件,避免在程序中“硬编码”目录位置。
### 3.2 检查主机能力
- 在程序初始化时,使用Int 21H Function 30H获取MS - DOS版本号,确保程序所需的所有函数都可用。若主机MS - DOS版本不足,谨慎选择用于显示错误消息和终止程序的函数。
- 当程序在MS - DOS 3和4版本下运行时,利用其增强功能。例如,使用Int 21H Function 3DH打开文件时可指定共享模式,使用Int 21H Functions 5AH和5BH创建临时或唯一文件,使用Int 21H Function 59H获取扩展错误信息。
### 3.3 输入和输出
- 仅使用句柄文件函数,并在整个应用程序中支持完整路径(确保在用户输入文件名时允许最大可能的路径长度)。
- 尽可能使用缓冲I/O。MS - DOS 2.0及更高版本的设备驱动程序可处理长达64 KB的字符串,写入较少的大记录比许多短记录能提高性能。
- 避免使用FCB、Int 25H或Int 26H函数,或ROM BIOS磁盘驱动。若必须使用FCB,使用完后关闭,打开时不要移动它们,避免重新打开已打开的FCB或重新关闭已关闭的FCB。
### 3.4 内存管理
- 在程序初始化时,释放程序不需要的任何内存(对于.COM程序尤为重要)。
- 若程序需要额外内存用于缓冲区或表格,在需要时动态分配,并在不再需要时立即释放。
- 当可用时,使用扩展内存以减少程序对常规内存的需求。
- 一般规则是不触碰程序不拥有的任何内存。使用Int 21H Functions 25H和35H设置或检查中断向量,而不是直接编辑中断向量表。若更改中断向量内容,保存其原始值并在程序退出前恢复。
- 使用EXEC函数(Int 21H Function 4BH)加载覆盖文件或其他程序,以隔离程序对PSP结构和重定位信息的依赖。使用Int 21H Function 4CH终止程序,程序成功执行时传递零返回码,遇到错误时传递非零码。
### 3.5 异常处理
安装Ctrl - C(Int 23H)和严重错误(Int 24H)处理程序,防止程序因用户输入Ctrl - C或Ctrl - Break或硬件I/O故障而意外终止。这对于使用扩展内存或安装自己的中断处理程序的程序尤为重要。
## 4. ROM BIOS和硬件兼容应用程序
### 4.1 引入硬件依赖时的注意事项
因性能原因需要引入ROM BIOS或硬件依赖时,将其隔离到小的、文档完善的过程中,以便在硬件更改时轻松修改。使用宏和常量隐藏硬件特性,避免在程序中散布“魔法数字”。
### 4.2 检查主机能力
若程序中使用ROM BIOS函数,运行时必须检查机器型号,确保程序所需的函数可用。在F000:FFFEH处有一个机器ID字节,其值解释如下:
| 机器ID字节值 | 对应机器型号 |
| --- | --- |
| F8H | PS/2 Models 70 and 80 |
| F9H | PC Convertible |
| FAH | PS/2 Model 30 |
| FBH | PC/XT (later models) |
| FCH | PC/AT, PC/XT - 286, PS/2 Models 50 and 60 |
| FDH | PCjr |
| FEH | PC/XT (early models) |
| FFH | PC “Classic” |
编写自己的直接视频驱动时,需通过Int 10H调用、读取端口以及检查ROM BIOS数据区等方式确定视频适配器的类型和功能。
### 4.3 避免不稳定硬件
IBM个人计算机架构的某些区域从最初的基于4.77 MHz 8088的IBM PC到如今基于20 MHz 80386的PS/2 Model 80都保持了显著的稳定性,如通过端口61H进行声音控制、8253定时器芯片的通道0和2(端口40H、42H和43H)、端口201H的游戏适配器以及通过端口21H的8259 PIC的屏蔽寄存器控制中断系统。但直接声音生成和对8253定时器或8259 PIC的操作在多任务程序管理器下可能会导致问题。键盘映射、键盘控制器以及软盘和硬盘控制器是相对硬件不稳定的区域,绕过MS - DOS进行键盘或磁盘访问的程序在不同PC型号上正常运行的可能性较小,且容易相互干扰和影响行为良好的应用程序。
## 5. OS/2兼容性
### 5.1 MS - DOS与OS/2的兼容性
MS - DOS在多个方面与OS/2向上兼容,OS/2是适用于80286和80386计算机的多任务保护模式虚拟内存操作系统。OS/2图形用户界面与Microsoft Windows 2.0几乎相同,OS/2 1.0和1.1版本使用与MS - DOS完全相同的磁盘格式,便于文件在两者之间移动。最重要的是,OS/2包含“DOS兼容性环境”或“3.x Box”模块,可同时运行一个MS - DOS应用程序和受保护模式的OS/2应用程序。
### 5.2 3.x Box的工作方式
3.x Box捕获Int 21H函数调用并将其重新映射为OS/2函数调用,模拟加载了文件共享模块(SHARE.EXE)的MS - DOS 3.3环境,但对于Int 21H Function 30H返回主版本号10而不是3。它还支持大多数ROM BIOS调用,通过模拟其功能或锁定设备后调用原始ROM BIOS例程。此外,3.x Box维护ROM BIOS数据区,通过Int 1CH为应用程序提供定时器滴答,并支持某些无文档记录的MS - DOS服务和数据结构,使大多数TSR实用程序能正常工作。
### 5.3 MS - DOS应用程序在OS/2下的限制
- **CPU周期问题**:MS - DOS应用程序在后台时不接收任何CPU周期,处于冻结状态。若捕获了任何中断向量,这些中断在应用程序再次被选中并处于前台之前不会得到处理。
- **FCB使用限制**:在3.x Box中使用FCB受到限制,与在加载了SHARE.EXE的MS - DOS 3或4下相同。若其他进程正在使用文件,则不能使用FCB打开该文件,同时打开的FCB数量限制为16个或CONFIG.SYS中FCBS = 指令指定的数量。即使使用句柄文件函数,由于其他进程的活动,这些函数也可能意外失败。
- **磁盘写入限制**:不允许使用Int 26H或Int 13H直接写入硬盘,以防止文件系统损坏。
- **中断向量修改限制**:尝试重新编程8259以移动中断向量表或修改已属于OS/2设备驱动程序的中断向量的MS - DOS应用程序将被操作系统终止。不过,MS - DOS应用程序可以更改8259的中断屏蔽寄存器,自行禁用和重新启用中断,以及读写任何I/O端口,但这也意味着MS - DOS程序可能随时导致整个OS/2系统崩溃。
## 6. 将MS - DOS应用程序移植到OS/2
### 6.1 移植步骤概述
将现有的MS - DOS汇编语言程序转换为OS/2程序可分为五个步骤:
1. **分段(Segmentation)**
2. **合理化(Rationalization)**
3. **封装(Encapsulation)**
4. **转换(Conversion)**
5. **优化(Optimization)**
前三个阶段可在MS - DOS环境中执行和测试,后两个阶段需要OS/2和受保护模式编程工具。遵循兼容性指南的MS - DOS程序在转换为受保护模式时所需的工作量相对较少。
### 6.2 分段(Segmentation)
#### 6.2.1 保护模式下的内存寻址变化
80286在保护模式下的内存寻址方式与实模式不同。实模式下,80286本质上模拟8088/86处理器,段寄存器的值直接对应物理内存地址;而在保护模式下,段寄存器持有选择器,选择器是描述符表的索引,描述符定义了内存段的物理地址、长度、特性、访问权限以及是否驻留在RAM中。每次程序加载段寄存器或访问内存时,80286硬件会检查相关描述符和程序的特权级别,若选择器或内存操作无效则产生故障。
#### 6.2.2 分段的具体操作
将程序转换为使用Microsoft段、类和组约定的.EXE类型程序。至少要有一个代码段和一个数据段,并声明一个名为DGROUP的组,包含“近”数据段、堆栈和本地堆(如果有)。同时,移除或重写任何直接操作段值的代码。分段和重组后,重新汇编和链接程序,确保其在MS - DOS下仍能按预期工作。
### 6.3 合理化(Rationalization)
#### 6.3.1 消除硬件依赖
将程序转换为完全行为良好的MS - DOS应用程序。首先,彻底消除任何直接操作外围设备适配器、更改中断优先级、编辑系统中断向量表或依赖CPU速度或特性(如定时循环)的元素。对于显示例程,将所有向显示器写入文本、修改字符属性或影响光标形状或位置的例程转换为使用ANSI转义序列的Int 21H Function 40H调用或ROM BIOS Int 10H调用;将所有依赖硬件的键盘操作转换为Int 21H Function 3FH或ROM BIOS Int 16H调用。
#### 6.3.2 优化内存使用
在MS - DOS下,应用程序通常会获得系统中剩余的所有内存;而在OS/2下,进程最初仅分配足够的内存来保存其代码、声明的数据存储和堆栈。可以通过使用/CPARMAXALLOC开关链接应用程序,使MS - DOS加载器的行为类似于OS/2加载器
0
0
复制全文
相关推荐










