135 lines
2.4 KiB
NASM
135 lines
2.4 KiB
NASM
; 实验八-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 |