高级MS-DOS编程:从基础到实践
立即解锁
发布时间: 2025-08-20 00:42:35 阅读量: 2 订阅数: 13 


深入解析MS-DOS编程技巧与实践
### 高级MS-DOS编程:从基础到实践
在计算机编程的世界里,MS-DOS曾经是占据重要地位的操作系统,对于C或汇编语言程序员来说,了解如何在MS-DOS环境下编写高性能、稳定的应用程序至关重要。下面将详细介绍MS-DOS的发展历程、结构、应用程序类型以及编程工具等内容。
#### 1. MS-DOS的发展历程
MS-DOS在短短七年时间里,从一个简单的程序加载器演变成了基于英特尔8086系列微处理器的复杂稳定的操作系统。它的前身是86 - DOS,最初设计是为了模仿CP/M - 80,方便8位CP/M - 80应用程序移植到16位环境。后来,微软收购了86 - DOS并进行了大量修改,将其命名为MS - DOS。
在发展过程中,MS - DOS不断改进和增加新功能:
- **版本1.0**:相比CP/M - 80有诸多改进,如改进的磁盘目录结构、更好的磁盘空间分配和管理方法、扩展的操作系统服务以及AUTOEXEC.BAT批处理文件。
- **版本1.25**:修复了一些错误,支持双面磁盘和提高了DOS内核的硬件独立性。
- **版本2.0**:引入了许多类似UNIX/XENIX的特性,如分层文件结构、文件句柄、I/O重定向、管道和过滤器等,还支持硬盘和背景打印。
- **版本2.11**:改进了国际支持,增加了对16位汉字字符的支持并修复了一些小错误。
- **版本2.25**:主要在远东地区分发,进一步扩展了对日语和韩语字符集的支持。
- **版本3.0**:对整个操作系统进行了重大重写,增加了对1.2MB软盘和更大硬盘的支持,以及直接控制打印假脱机程序等功能。
- **版本3.1**:增加了对网络文件和打印机共享的支持。
- **版本3.2**:泛化了设备驱动程序的定义,方便支持新的媒体类型。
- **版本3.3**:大幅扩展了MS - DOS的多语言支持。
- **版本4.0**:增强了可视化外壳并支持非常大的文件系统。
同时,微软还在用户界面和多任务操作系统方面投入了大量精力,如推出了Microsoft Windows和Microsoft OS/2。
```mermaid
graph LR
A[MS-DOS 1.0] --> B[MS-DOS 1.25]
B --> C[MS-DOS 2.0]
C --> D[MS-DOS 2.01]
C --> E[PC-DOS 2.1]
D --> F[MS-DOS 2.11]
F --> G[MS-DOS 3.0]
G --> H[MS-DOS 3.1]
H --> I[MS-DOS 3.2]
I --> J[MS-DOS 3.3]
J --> K[MS-DOS 4.0]
C --> L[MS-DOS 2.25]
H --> M[Windows 1.0]
J --> N[Windows 2.0]
K --> O[Windows 3.0]
style A fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
style B fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
style C fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
style D fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
style E fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
style F fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
style G fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
style H fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
style I fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
style J fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
style K fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
style L fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
style M fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
style N fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
style O fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
```
#### 2. MS-DOS的结构
MS - DOS主要由三个层次组成:
- **BIOS模块**:特定于计算机系统,由制造商提供,包含默认的硬件相关设备驱动程序,如控制台显示和键盘、行式打印机、辅助设备、日期和时间以及引导磁盘设备。BIOS在系统初始化时作为IO.SYS文件的一部分被读入随机存取存储器(RAM)。
- **DOS内核**:由微软提供的专有程序,提供一系列硬件无关的系统功能,包括文件和记录管理、内存管理、字符设备输入/输出、生成其他程序以及访问实时时钟。程序通过加载寄存器中的特定参数并使用软件中断来访问这些功能。DOS内核在系统初始化时从引导磁盘的MSDOS.SYS文件读入内存。
- **命令处理器(shell)**:用户与操作系统的接口,负责解析和执行用户命令,包括从磁盘或其他存储设备加载和执行其他程序。默认的shell是COMMAND.COM,它可以被用户自定义的shell替换。
#### 3. MS-DOS应用程序的结构
MS - DOS应用程序主要有两种类型:
- **.COM程序**:最大大小约为64KB,适合小模型,代码和数据混合在一起。它以绝对内存映像的形式存储在磁盘上,没有头文件或内部标识信息。加载时,所有段寄存器指向程序段前缀(PSP),栈指针寄存器根据内存情况设置。.COM程序的首选退出方法是Int 21H Function 4CH。
- **.EXE程序**:可以和可用内存一样大,适合小、中或大模型,代码、数据和栈位于不同的段中。它以特殊类型的文件形式存储在磁盘上,有唯一的头文件、重定位映射、校验和等信息。加载时,代码段(CS)和栈段(SS)寄存器会根据程序设置,数据段(DS)和额外段(ES)寄存器指向PSP。.EXE程序处理完成后应通过Int 21H Function 4CH返回控制。
两者的区别如下表所示:
|对比项|.COM程序|.EXE程序|
| ---- | ---- | ---- |
|最大大小|约64KB减去PSP和栈的大小|无限制|
|入口点|PSP:0100H|由END语句定义|
|AL入口值|默认FCB #1驱动器有效为00H,无效为0FFH|与.COM程序相同|
|AH入口值|默认FCB #2驱动器有效为00H,无效为0FFH|与.COM程序相同|
|CS入口值|PSP|包含入口点的模块段|
|IP入口值|0100H|入口点在其段内的偏移量|
|DS入口值|PSP|PSP|
|ES入口值|PSP|PSP|
|SS入口值|PSP|具有STACK属性的段|
|SP入口值|0FFFEH或可用内存的最高字,取较低者|由STACK属性段定义的大小|
|栈入口|零字|初始化或未初始化|
|栈大小|约64KB减去PSP和代码数据大小|由STACK属性段定义|
|子程序调用|通常为NEAR|NEAR或FAR|
|退出方法|首选Int 21H Function 4CH,MS - DOS版本1使用Int 20H、Int 21H Function 0或NEAR RETURN|首选Int 21H Function 4CH|
|文件大小|程序的确切大小|程序大小加头文件(512字节的倍数)|
#### 4. MS-DOS编程工具
准备在MS - DOS下运行的新程序通常需要以下步骤:
1. 使用文本编辑器创建或修改ASCII源代码文件。
2. 使用汇编器(如Microsoft Macro Assembler)或高级语言编译器(如Microsoft C Optimizing Compiler)将源文件转换为可重定位的目标代码。
3. 使用链接器(如Microsoft Object Linker)将可重定位的目标代码转换为可执行的MS - DOS加载模块。
4. 使用调试器对程序进行系统测试和调试。
此外,还有一些辅助工具,如LIB用于创建和维护对象模块库,CREF用于生成交叉引用列表,EXE2BIN用于将.EXE文件转换为.COM文件,MAKE用于比较文件日期并根据结果执行操作。
### 5. 键盘和鼠标输入
在MS - DOS环境下,键盘是用户输入的基本手段,但随着高分辨率图形适配器的普及,鼠标等指向设备的支持也变得越来越重要。
#### 5.1 键盘输入方法
应用程序可以通过以下几种方法获取键盘输入:
- **MS - DOS句柄导向功能**:源于UNIX/XENIX,在MS - DOS 2.0版本首次引入。程序通过提供设备句柄、缓冲区地址和长度来使用这些功能。标准输入句柄(0)可用于读取键盘输入,但它是可重定向的。若要确保输入来自键盘,可打开控制台设备获取句柄进行输入。输入模式分为ASCII模式和二进制模式,两者处理输入的方式不同。
- **MS - DOS传统字符功能**:是CP/M字符I/O功能的超集,最初用于方便现有应用程序从CP/M移植,在MS - DOS 2.0及以后版本中大部分也支持I/O重定向。
- **IBM ROM BIOS键盘驱动功能**:适用于IBM PC兼容机,操作更底层,可绕过I/O重定向和MS - DOS对某些控制字符的特殊处理,但程序的可移植性较差,可能会干扰其他程序的正常运行。
#### 5.2 键盘输入的具体操作
- **使用句柄进行键盘输入**:主要使用Int 21H Function 3FH(Read File or Device)。以下是使用标准输入句柄读取一行的示例代码:
```asm
buffer db 80 dup (?) ; 键盘输入缓冲区
.
.
.
mov ah,3fh ; 功能3fh = 读取文件或设备
mov bx,0 ; 标准输入句柄
mov cx,80 ; 最大读取字节数
mov dx,seg buffer ; DS:DX = 缓冲区地址
mov ds,dx
mov dx,offset buffer
int 21h ; 转移到MS-DOS
jc error ; 若检测到错误则跳转
.
.
.
```
若要绕过重定向,可打开控制台设备:
```asm
buffer db 80 dup (?) ; 键盘输入缓冲区
fname db 'CON',0 ; 键盘设备名称
handle dw 0 ; 键盘设备句柄
.
.
.
mov ah,3dh ; 功能3dh = 打开
mov al,0 ; 模式 = 读取
mov dx,seg fname ; DS:DX = 设备名称
mov ds,dx
mov dx,offset fname
int 21h ; 转移到MS-DOS
jc error ; 若打开失败则跳转
mov handle,ax ; 保存CON的句柄
.
.
.
mov ah,3fh ; 功能3fh = 读取文件或设备
mov bx,handle ; BX = CON的句柄
mov cx,80 ; 最大读取字节数
mov dx,offset buffer ; DS:DX = 缓冲区地址
int 21h ; 转移到MS-DOS
jc error ; 若检测到错误则跳转
.
.
.
```
- **使用传统调用进行键盘输入**:MS - DO
0
0
复制全文
相关推荐









