DATAS SEGMENT
fname_buf db 64,?
fname db 64 dup(0) ;文件名缓冲区
fnum_s dw ? ;源文件号
fnum_d dw ? ;新文件号
buffer db 512 DUP (?) ;读写缓冲区
msg1 db 0dh,0ah,'Please input the source file path and name:','$'
msg2 db 0dh,0ah,'Can not find the file, please input again:','$'
msg3 db 0dh,0ah,'Please input the destination file path and name:','$'
msg4 db 0dh,0ah,'The destination file is existed...',0dh,0ah,'please enter another name:','$'
msg5 db 0dh,0ah,'Error in copying file...',0dh,0ah,'please try again:','$'
msg6 db 0dh,0ah,'Error in reading file...',0dh,0ah,'please try again:','$'
msg7 db 0dh,0ah,'Error in writing file...',0dh,0ah,'please try again:','$'
msg8 db 0dh,0ah,'File copying success!','$'
msg9 db 0dh,0ah,'Copy another files?(y/n)','$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
;----------------------------------------------------------------------------
;该函数用于输入文件名及路径,并删除输入文件名后的回车符,使字符串为ASCIZ地址
getfname proc
;将保存输入文件名的缓冲区清空
mov si,0
mov cx,64
reset:
mov fname[si],0
inc si
loop reset
;循环执行reset,将fname字符串置为0
;---------------------------------------------
;输入源文件名及路径
lea dx,fname_buf;取地址操作
mov ah,0ah
int 21h
;将最后一个回车符换成0,使字符串为ASCIZ地址
mov si,0
set0:
cmp fname[si],0dh
je set0go
inc si
jmp set0
set0go:
mov fname[si],0
ret
getfname endp
;---------------------------------------------
START:
MOV AX,DATAS
MOV DS,AX
;---------------------------------
;打开源文件
input:
mov dx,offset msg1
mov ah,9
int 21h
call getfname
lea dx,fname
mov ax,3d00h
int 21h
jnc opensuc
lea dx,msg2
mov ah,9
int 21h
jmp input
opensuc:
mov fnum_s,ax
;---------------------------------
;创建目标文件
mov dx,offset msg3
mov ah,9
int 21h
;判断目标文件是否存在
build:
call getfname
lea dx,fname
mov ax,3d00h
int 21h
jc notext;有进位时CF=1跳转
;存在,关闭打开的文件
mov bx,ax
mov ah,3eh
int 21h
mov dx,offset msg4
mov ah,9
int 21h
jmp build
;-----------------------------
;目标文件不存在,建立目标文件
notext:
mov cx,0
lea dx,fname
mov ah,3ch ;建立普通新文件
int 21h
jnc save ;建立成功,保存新文件号
mov dx,offset msg5 ;不成功,显示错误信息
mov ah,9
int 21h
jmp start ;重新输入
save:
mov fnum_d,ax ;保存新文件号
mov ax,3d01h ;以只写方式打开新文件
int 21h
readf:
mov bx,fnum_s ;取源文件号
mov cx,512 ;读出512个字符
mov dx,offset buffer
mov ah,3fh
int 21h
jnc writef ;读成功,则写
mov dx,offset msg6 ;不成功,显示错误信息,关闭文件
mov ah,9
int 21h
jmp exit
;--------------------------
writef:
mov bx,fnum_d ;取新文件号
mov cx,ax ;按实际读入字数写文件
mov ah,40h
int 21h
jnc cmpcx ;写成功
mov dx,offset msg7 ;不成功,显示错误信息,关闭文件
mov ah,9
int 21h
jmp exit
cmpcx:
cmp cx,512 ;判断实际读入的字数是不是512
je readf ;如果是512,说明还没读到文件尾
mov dx,offset msg8 ;显示‘复制成功’
mov ah,9
int 21h
exit:
mov ah,3eh ;关闭文件
int 21h
mov bx,fnum_s
mov ah,3eh
int 21h
;------------------------------------------------------------------
;继续复制
again:
mov dx,offset msg9
mov ah,9
int 21h
mov ah,1
int 21h
cmp al,'Y'
je start
cmp al,'y'
je start
cmp al,'N'
je ok
cmp al,'n'
je ok
jne again
;------------------------------------------------------------------
ok:
MOV AH,4CH
INT 21H
CODES ENDS
END START
另外,运行时发生跳转错误,求大佬帮助,能贴出运行截图最好啦
找不到源文件