当前位置: 首页 > 工具软件 > Open Emu > 使用案例 >

emu8086汇编语言操作文件指令详解

黄弘深
2023-12-01
在EMU8086中,操作文件的指令

目录
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

0. 创建文件

调用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寄存器中,表示新建文件的文件句柄。

1. 打开文件

调用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标志位会被设置,需要进行错误处理。

2. 关闭文件

使用DOS功能号21h中的ah=3Eh参数可以关闭一个文件。

寄存器说明
ah功能号,3Eh表示关闭文件
bx文件句柄

代码示例

    mov ah, 3Eh       ; 功能号3Eh表示关闭文件
    mov bx, handle    ; 将文件句柄保存到bx中
    int 21h           ; 调用DOS功能号21h的3Eh参数关闭文件

其中,handle为要关闭的文件的句柄。

3. 写入文件

使用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为存放要写入数据的缓冲区地址。

4. 读取文件

寄存器说明
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文件并汇编运行。

5. 删除文件

调用DOS功能号21h中的ah=41h参数可以删除一个指定的文件。

寄存器说明
ah功能号,41H表示删除文件
dx存放文件名地址

代码示例:

    mov ah, 41h       ; 调用DOS功能号21h中的ah=41h参数
    lea dx, filename  ; 将文件名保存到dx中
    int 21h           ; 调用中断

其中,filename为文件名字符串常量。

6. 设置文件指针位置

调用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指定要移动的字节数。

7. 创建目录

调用DOS功能号21h中的ah=39h参数可以创建一个指定的目录。

寄存器说明
ah功能号,39H表示创建目录
dx存放目录名称地址

代码示例:

    mov ah, 39h       ; 调用DOS功能号21h中的ah=39h参数
    lea dx, dirname   ; 将目录名保存到dx中
    int 21h           ; 调用中断

其中,dirname为目录名字符串常量。

8. 删除目录

调用DOS功能号21h中的ah=3Ah参数可以删除一个指定的目录。

寄存器说明
ah功能号,3AH表示删除目录
dx存放目录名称地址

代码示例:

    mov ah, 3Ah       ; 调用DOS功能号21h中的ah=3Ah参数
    lea dx, dirname   ; 将目录名保存到dx中
    int 21h           ; 调用中断

其中,dirname为目录名字符串常量。

9. 获取当前目录

调用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为存储目录路径的缓冲区地址。

10. 查找文件

调用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保留位,无实际意义
 类似资料: