目录
0.创建文件:3CH
1. 打开文件:3DH
2.关闭文件:3EH
3.读取文件:3FH
4.写入文件:40H
完整代码示例
注:AH = 3CH → \rightarrow → 40H,分别按顺序分别表示创建、打开、关闭、读取、写入
补充:
5.删除文件:41H
6.设置文件指针位置:42H
7.创建目录:39H
8.删除目录:3AH
9.获取当前目录:47H
10.创建文件:4EH
调用DOS功能号21h中的ah=3Ch参数可以在磁盘上创建一个新文件。
寄存器 | 说明 |
---|---|
ah | 功能号,3Ch表示创建文件 |
cx | 文件属性(文件的读写权限、是否隐藏等) |
dx | 存放文件名地址 |
代码示例:
mov ah, 3Ch ; 调用DOS功能号21h中的ah=3Ch参数
mov cx, 0 ; 文件属性为普通文件
lea dx, filename ; 将文件名保存到dx中
int 21h ; 调用中断
jc error ; 如果CF标志位被设置,则处理文件创建错误
mov bx, ax ; 将句柄存入bx中
其中,filename为文件名字符串常量,如果发生错误,则CF标志位会被设置,需要进行错误处理。创建成功后,函数返回值存放在ax寄存器中,表示新建文件的文件句柄。
调用DOS功能号21h中的ah=3Dh参数可以打开一个文件。
寄存器 | 说明 |
---|---|
ah | 功能号,3DH表示打开文件 |
al | 访问模式,0表示只读,1表示只写,2表示读写 |
dx | 存放文件名地址 |
代码示例:
mov ah, 3Dh ; 调用DOS功能号21h中的ah=3Dh参数
mov al, 0 ; 只读方式打开文件
lea dx, filename ; 将文件名保存到dx中
int 21h ; 调用中断
jc error ; 如果CF标志位被设置,则处理文件打开错误
mov bx, ax ; 将句柄存入bx中
其中,filename为文件名字符串常量,ax寄存器中返回的是文件的句柄(文件编号),如果发生错误,则CF标志位会被设置,需要进行错误处理。
使用DOS功能号21h中的ah=3Eh参数可以关闭一个文件。
寄存器 | 说明 |
---|---|
ah | 功能号,3Eh表示关闭文件 |
bx | 文件句柄 |
代码示例
mov ah, 3Eh ; 功能号3Eh表示关闭文件
mov bx, handle ; 将文件句柄保存到bx中
int 21h ; 调用DOS功能号21h的3Eh参数关闭文件
其中,handle为要关闭的文件的句柄。
使用DOS功能号21h中的ah=40h参数可以向文件中写入数据。
寄存器 | 说明 |
---|---|
ah | 功能号,40H表示写入文件 |
bx | 文件句柄 |
cx | 要写入的字节数 |
dx | 数据缓冲区地址 |
代码示例
mov ah, 40h ; 功能号40h表示写入文件
mov bx, handle ; 将文件句柄保存到bx中
mov cx, length ; 将要写入的字节数保存到cx中
lea dx, buffer ; 将数据缓冲区地址保存到dx中
int 21h ; 调用DOS功能号21h的40h参数写入文件
其中,handle为要写入的文件的句柄,length为要写入的字节数,buffer为存放要写入数据的缓冲区地址。
寄存器 | 说明 |
---|---|
ah | 功能号,40H表示写入文件 |
bx | 文件句柄 |
cx | 要写入的字节数 |
dx | 数据缓冲区地址 |
代码示例:
mov ah, 3Fh ; 功能号3Fh表示读取文件
mov bx, handle ; 将文件句柄保存到bx中
mov cx, length ; 将要读取的字节数保存到cx中
lea dx, buffer ; 将数据缓冲区地址保存到dx中
int 21h ; 调用DOS功能号21h的3Fh参数读取文件
其中,handle为要读取的文件的句柄,length为要读取的字节数,buffer为存放要读取数据的缓冲区地址。
DATA SEGMENT
filename db "123.txt", 0
buffer db "hello, world!", 10, 13
buffer_size equ $ - buffer
DATA ENDS
CODE SEGMENT
ORG 100h
ASSUME DS:DATA, CS:CODE
main proc near
start:
MOV AX, DATA
MOV DS, AX
;打开文件
mov ah, 3dh
mov al, 2
lea dx, filename
int 21h
JC error_open
mov bx, AX
;写入文件
mov ah, 40h
mov cx, buffer_size
lea dx, buffer
int 21h
JC error_write
;读取文件
mov ah, 3fh
mov cx, buffer_size
lea dx, buffer
int 21h
JC error_read
;关闭文件
mov ah, 3eh
int 21h
JC error_close
mov ax, 4c00h ;正常退出
int 21h
error_open:
mov ax, 4c01h ;错误退出:无法打开文件
int 21h
error_write:
mov ax, 4c02h ;错误退出:写文件失败
int 21h
error_read:
mov ax, 4c03h ;错误退出:读文件失败
int 21h
error_close:
mov ax, 4c04h ;错误退出:关闭文件失败
int 21h
CODE ENDS
main ENDP
end start
其中,filename为要打开的文件名,buffer为存放数据的缓冲区,这里写入和读取的都是10个字节。在实际运行时,需要将此代码保存为.asm文件并汇编运行。
调用DOS功能号21h中的ah=41h参数可以删除一个指定的文件。
寄存器 | 说明 |
---|---|
ah | 功能号,41H表示删除文件 |
dx | 存放文件名地址 |
代码示例:
mov ah, 41h ; 调用DOS功能号21h中的ah=41h参数
lea dx, filename ; 将文件名保存到dx中
int 21h ; 调用中断
其中,filename为文件名字符串常量。
调用DOS功能号21h中的ah=42h参数可以设置文件指针的位置。
寄存器 | 说明 |
---|---|
ah | 功能号,42H表示设置文件指针 |
bx | 存放文件句柄 |
cx | 相对于文件起始位置的偏移量(字节数) |
dx | 移动方式,0表示从文件起始位置移动,1表示从当前位置移动,2表示从文件结尾移动 |
代码示例:
mov ah, 42h ; 调用DOS功能号21h中的ah=42h参数
mov bx, handle ; 文件句柄存入bx中
mov cx, offset ; 相对于文件起始位置的偏移量(字节数)存入cx中
mov dx, 0 ; 移动方式,0表示从文件起始位置移动
int 21h ; 调用中断
其中,offset指定要移动的字节数。
调用DOS功能号21h中的ah=39h参数可以创建一个指定的目录。
寄存器 | 说明 |
---|---|
ah | 功能号,39H表示创建目录 |
dx | 存放目录名称地址 |
代码示例:
mov ah, 39h ; 调用DOS功能号21h中的ah=39h参数
lea dx, dirname ; 将目录名保存到dx中
int 21h ; 调用中断
其中,dirname为目录名字符串常量。
调用DOS功能号21h中的ah=3Ah参数可以删除一个指定的目录。
寄存器 | 说明 |
---|---|
ah | 功能号,3AH表示删除目录 |
dx | 存放目录名称地址 |
代码示例:
mov ah, 3Ah ; 调用DOS功能号21h中的ah=3Ah参数
lea dx, dirname ; 将目录名保存到dx中
int 21h ; 调用中断
其中,dirname为目录名字符串常量。
调用DOS功能号21h中的ah=47h参数可以获取当前目录的路径。
寄存器 | 说明 |
---|---|
ah | 功能号,47H表示获取当前目录信息 |
dl | 存放驱动器号 |
代码示例:
mov ah, 47h ; 调用DOS功能号21h中的ah=47h参数
mov dl, drive ; 驱动器号存入dl中
lea dx, path ; 存储目录路径的缓冲区地址存入dx中
int 21h ; 调用中断
其中,drive为驱动器号,path为存储目录路径的缓冲区地址。
调用DOS功能号21h中的ah=4Eh参数可以在磁盘上查找文件。
寄存器 | 说明 |
---|---|
ah | 功能号,4E表示在磁盘上查找文件 |
cx | 查找文件时期望的属性 |
ds:dx | 指向包含文件名及路径的字符串缓冲区 |
代码示例:
mov ah, 4Eh ; 调用DOS功能号21h中的ah=4Eh参数来查找文件
mov cx, 0001h ; 查找只读文件
lea dx, filename ; 将文件名保存到dx中
int 21h ; 调用中断
jc error ; 如果CF标志位被设置,则处理文件查找错误
; 文件已找到,DS:DX 指向找到的文件记录
其中,filename为文件名字符串常量,cx寄存器中存储查找文件时期望的属性,ds:dx指向包含文件名及路径的字符串缓冲区,如果发生错误,则CF标志位会被设置,需要进行错误处理。
当cx等于不同的值时,文件的属性也会发生改变。具体情况如下表:
cx值 | 文件属性 |
---|---|
0000h | 普通文件 |
0001h | 只读文件 |
0002h | 隐藏文件 |
0004h | 系统文件 |
0020h | 归档文件 |
0040h | 设备文件 |
0080h | 保留位,无实际意义 |