Files
Operating-System/Experiment/asm-exp/实验八/实验八-5_文件复制.asm
2026-06-25 00:09:09 +08:00

135 lines
2.4 KiB
NASM
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; 实验八-5: 文件复制程序
; 功能: 使用DOS功能号实现文件复制
; 说明: 读取源文件内容,写入目标文件
DATAS SEGMENT
SRC_FILE DB 'source.txt', 0 ; 源文件名
DST_FILE DB 'dest.txt', 0 ; 目标文件名
HANDLE DW ? ; 文件句柄
BUFFER DB 512 DUP(?) ; 读写缓冲区 (512字节)
ERR_OPEN DB 'Cannot open source file!', 0DH, 0AH, '$'
ERR_READ DB 'Read error!', 0DH, 0AH, '$'
ERR_WRITE DB 'Write error!', 0DH, 0AH, '$'
OK_MSG DB 'File copied successfully!', 0DH, 0AH, '$'
DATAS ENDS
STACKS SEGMENT
DB 64 DUP(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES, DS:DATAS, SS:STACKS
START:
MOV AX, DATAS
MOV DS, AX
; 打开源文件 (功能号3DH只读模式)
LEA DX, SRC_FILE
MOV AH, 3DH
MOV AL, 00H
INT 21H
JNC OPEN_OK
LEA DX, ERR_OPEN
MOV AH, 09H
INT 21H
JMP PROGRAM_END
OPEN_OK:
MOV HANDLE, AX
; 创建目标文件 (功能号3CH)
LEA DX, DST_FILE
MOV AH, 3CH
MOV AL, 00H
INT 21H
MOV BX, AX ; 保存目标文件句柄到BX
JNC CREATE_OK
; 关闭源文件
MOV AH, 3EH
INT 21H
LEA DX, ERR_OPEN
MOV AH, 09H
INT 21H
JMP PROGRAM_END
CREATE_OK:
; 读取源文件循环
COPY_LOOP:
; 读取源文件 (功能号3FH)
MOV CX, 512
LEA DX, BUFFER
MOV AH, 3FH
INT 21H
; 检查读取是否成功
JNC READ_OK
; 关闭两个文件
PUSH BX
MOV AH, 3EH
MOV BX, HANDLE
INT 21H
POP BX
MOV AH, 3EH
INT 21H
LEA DX, ERR_READ
MOV AH, 09H
INT 21H
JMP PROGRAM_END
READ_OK:
; 检查是否到达文件末尾 (AX=0表示EOF)
CMP AX, 0
JE COPY_COMPLETE
; 写入目标文件 (功能号40H)
; BX中已经是目标文件句柄
MOV CX, AX ; CX = 实际读取的字节数
MOV AH, 40H
INT 21H
; 检查写入是否成功
JNC WRITE_OK
; 关闭两个文件
PUSH BX
MOV AH, 3EH
MOV BX, HANDLE
INT 21H
POP BX
MOV AH, 3EH
INT 21H
LEA DX, ERR_WRITE
MOV AH, 09H
INT 21H
JMP PROGRAM_END
WRITE_OK:
JMP COPY_LOOP
COPY_COMPLETE:
; 关闭源文件
MOV AH, 3EH
MOV BX, HANDLE
INT 21H
; 关闭目标文件
MOV AH, 3EH
INT 21H
LEA DX, OK_MSG
MOV AH, 09H
INT 21H
PROGRAM_END:
MOV AH, 4CH
INT 21H
CODES ENDS
END START