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

### MS-DOS功能详解与应用实践
#### 1. MS-DOS缓冲区填充与数据表格
MS-DOS会向缓冲区填充特定的值,具体如下:
```plaintext
b u f f e r
db
2
; i n f o ID code
dw
0204h
; o f f s e t o f uppercase ta b le
dw
1140h
; segment o f uppercase t a b le
```
在地址`1140:0204H`处的表格包含以下数据:
|地址|数据|
| ---- | ---- |
|1140:0200|80 0 0 80 9A 45 41 8 E 41 8 F 80 45 45|
|1140:0210|45 49 49 49 8 E 8 F 90 92 92 4F 99 4F 55 55 59 99|
|1140:0220|9A 9B 9C 9D 9E 9F 41 49 4F 55 A5 A5 A6 A7 A8 A9|
|1140:0230|AA AB AC AD AE AF B0 Bl B2 B3 B4 B5 B6 B7 B8 B9|
|1140:0240|BA BB BC BD BE BF CO Cl C2 C3 C4 C5 C6 C7 C8 C9|
|1140:0250|CA CB CC CD CE CF DO Dl D2 D3 D4 D5 D6 D7 D8 D9|
|1140:0260|DA DB DC DD DE DF E0 El E2 E3 E4 E5 E6 E7 E8 E9|
|1140:0270|EA EB EC ED EE EF F0 Fl F2 F3 F4 F5 F6 F7 F8 F9|
|1140:0280|FA FB FC FD FE FF|
#### 2. Int 21H功能调用
##### 2.1 Function 66H (102):获取或设置代码页
此功能用于获取或选择当前的代码页。
- **调用参数**:
- `AH = 66H`
- `AL`为子功能:
- `01H`:获取代码页
- `02H`:选择代码页
- 若`AL = 02H`,`BX`为要选择的代码页
- **返回值**:
- 若函数成功:进位标志`CF = 0`;若`AL = 01H`,`BX`为活动代码页,`DX`为默认代码页
- 若函数失败:进位标志`CF = 1`,`AX`为错误代码
- **注意事项**:当使用选择代码页子功能时,MS-DOS会从`COUNTRY.SYS`文件中获取新的代码页。设备必须事先通过`CONFIG.SYS`文件中的`DEVICE=`指令以及`NLSFUNC`和`MODE CP PREPARE`命令(通常放在`AUTOEXEC.BAT`文件中)进行代码页切换的准备。
- **示例代码**:
```asm
; g e t c u r r e n t and
; d e f a u lt code page
mov
ax,6601h
; f u n c t io n number
i n t
21h
; t r a n s f e r to MS-DOS
j c
e r r o r
; jump i f f u n c t io n f a i l e d
mov
mov
i n t
j c
bx.dx
ax,6602h
2 1 h
e r r o r
s e t code page
a c t iv e - d e f a u lt
f u n c t io n number
t r a n s f e r to MS-DOS
jump i f f u n c t io n f a i l e d
```
##### 2.2 Function 67H (103):设置句柄计数
该功能用于设置当前进程使用句柄同时打开的文件和设备的最大数量。
- **调用参数**:
- `AH = 67H`
- `BX`为所需的句柄数量
- **返回值**:
- 若函数成功:进位标志`CF = 0`
- 若函数失败:进位标志`CF = 1`,`AX`为错误代码
- **注意事项**:
- 此函数调用控制着将当前进程的句柄编号与MS-DOS内部的全局文件和设备打开表相关联的表的大小。默认表位于进程的PSP保留区域,可容纳20个句柄。
- 若请求的句柄数量大于20且系统中没有足够的空闲内存来分配一个新块以容纳扩大的表,则函数失败。
- 若请求的句柄数量大于系统全局文件和设备句柄表中的可用条目(由`CONFIG.SYS`文件中的`FILES`条目控制),不会返回错误。但如果系统全局文件表中的所有条目都在使用中,即使请求进程尚未用完其所有句柄,后续尝试打开文件或设备或创建新文件也会失败。
- **示例代码**:
```asm
mov
mov
i n t
j c
ah,67h
bx.30
2 1 h
e r r o r
fu n c t io n number
maximum number o f handles
t r a n s f e r to MS-DOS
jump i f f u n c t io n f a i l e d
```
##### 2.3 Function 68H (104):提交文件
该功能强制将与指定句柄关联的MS-DOS内部缓冲区中的所有数据物理写入设备。如果句柄指向一个文件,并且文件已被修改,则会更新文件目录条目中的时间和日期戳以及文件大小。
- **调用参数**:
- `AH = 68H`
- `BX`为句柄
- **返回值**:
- 若函数成功:进位标志`CF = 0`
- 若函数失败:进位标志`CF = 1`,`AX`为错误代码
- **注意事项**:
- 此函数的效果等同于关闭并重新打开文件,或使用`Int 21H Function 45H`复制文件句柄然后关闭副本。但该函数的优点是不会因句柄不足而失败,并且应用程序在多任务或网络环境中不会有失去对文件控制的风险。
- 若为与字符设备关联的句柄请求此函数,将返回成功标志,但无其他效果。
- **示例代码**:
```asm
db
’ MYFILE.DAT'.0
; ASCIIZ file n a m e
dw
7
; f i l e handle
mov
a h , 6 8 h
; f u n c t io n number
mov
b x ,fh a n dle
; f i l e handle
i n t
2 1 h
; t r a n s f e r to MS-DOS
j c
e r r o r
; jump i f commit f a i
```
##### 2.4 Function 6CH (108):扩展打开文件
此功能根据ASCIIZ路径名,在指定或默认磁盘驱动器的指定或默认目录中打开、创建或替换文件,并返回一个句柄,供程序后续访问文件使用。
- **调用参数**:
- `AH = 6CH`
- `AL = 00H`
- `BX`为打开模式:
|位|含义|
| ---- | ---- |
|0 - 2|访问类型:000 = 只读;001 = 只写;010 = 读写|
|3|保留(0)|
|4 - 6|共享模式:000 = 兼容;001 = 拒绝读写(拒绝所有);010 = 拒绝写;011 = 拒绝读;100 = 不拒绝|
|7|继承性:0 = 子进程继承句柄;1 = 子进程不继承句柄|
|8 - 12|保留(0)|
|13|严重错误处理:0 = 执行`Int 24H`;1 = 将错误返回给进程|
|14|直写:0 = 写入可能被缓冲和延迟;1 = 请求时进行物理写入|
|15|保留(0)|
- `CX`为文件属性(位可以组合;打开时忽略):
|位|含义(若设置)|
| ---- | ---- |
|0|只读|
|1|隐藏|
|2|系统|
|3|卷标|
|4|保留(0)|
|5|存档|
|6 - 15|保留(0)|
- `DX`为打开标志:
|位|含义|
| ---- | ---- |
|0 - 3|文件存在时的操作:0000 = 失败;0001 = 打开
0
0
复制全文
相关推荐







