; 实验八-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