KkKkK_th1 2018-11-04 01:51 采纳率: 0%
浏览 979

汇编编写的一copy文件程序,DOXBOX运行,输入文件路径及名时总显示找不到文件,求大佬帮忙运行解决一下。

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

另外,运行时发生跳转错误,求大佬帮助,能贴出运行截图最好啦图片说明

找不到源文件

  • 写回答

1条回答

  • threenewbee 2018-11-04 12:37
    关注

    你在dosbox里执行下dir,看下目录,是不是在当前目录里。
    dosbox会设置一个虚拟根目录,往往你的程序在它的子目录里。

    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料