用汇编实现命令行中COPY命令的功能,急(需1月10日前解决)!!!

时间冲突,1月11日检查实验,但这天又要考试。复习很重要,难顾及这个设计了。程序有一些问题,就是不明白:如何从命令行中提取出文件名。
总之,完成后有程序应有DOS中COPY命令一样的功能。在命令行中运行,格式为:copyxx filepath1 filepath2……
现在手上的程序如下,请大家帮助完成一下。

DATA SEGMENT
SOURCE LABEL BYTE
SR0 DB 66
SR1 DB ?
SR2 DB 64 DUP(?),'$'
DESTIN LABEL BYTE
DT0 DB 66
DT1 DB ?
DT2 DB 64 DUP(?),'$'
MSG3 DB 0DH,0AH,'Ready and press any key to continue !$'
ERRMSG1 DB 0DH,0AH,'Can not creat OBJ file !$'
ERRMSG2 DB 0DH,0AH,'Can not open SOURCE file error !$'
ERRMSG3 DB 0DH,0AH,'Read SOURCE file error !$'
ERRMSG4 DB 'Write OBJ file error !$'
ERRMSG5 DB 0DH,0AH,'Can not close SOURCE file ! $'
ERRMSG6 DB 0DH,0AH,'Can not close OBJ file !$'
ERRNUM DB 0
HANDSAV DW ?
BUFFER DB 16 DUP(0)
DATA ENDS

STACK1 SEGMENT PARA STACK
DB 256 DUP(0)
STACK1 ENDS

CODE SEGMENT
ASSUME CS:CODE,SS:STACK1,DS:DATA,ES:DATA
MAIN:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
;;LEA DX,MSG1
;;CALL DISP
;LEA DX,SOURCE
;CALL ACCEPT
;MOV CL,SR1
;XOR CH,CH
;MOV SI,CX
;MOV SR2[SI],0
;;LEA DX,MSG2
;;CALL DISP
;LEA DX,DESTIN
;CALL ACCEPT
;MOV CL,DT1
;XOR CH,CH
;MOV SI,CX
;MOV DT2[SI],0
LEA DX,MSG3
CALL DISP
MOV AH,7
INT 21H
CALL COPY
MOV AH,4CH
INT 21H
DISP PROC
MOV AH,09H
INT 21H
RET
DISP ENDP
ACCEPT PROC ;清空缓冲区并请求指定的输入功能
MOV AH,0CH
MOV AL,0AH
INT 21H
RET
ACCEPT ENDP
COPY PROC
MOV AH,3CH ;建立文件
LEA DX,DT2
MOV CX,20H
INT 21H
MOV ERRNUM,1
JC ERROR
MOV HANDSAV,AX
MOV AH,3DH ;打开文件,串地址为SR2中内容
MOV AL,0
LEA DX,SR2
INT 21H
MOV ERRNUM,2
JC ERROR
MOV BX,AX
RD_WR:
MOV CX,10H
LEA DX,BUFFER
MOV AH,3FH ;读文件16个字节至缓冲区BUFFER
INT 21H
MOV ERRNUM,3
JC ERROR
OR AX,AX
JZ DONE
MOV CX,AX
LEA DX,BUFFER
XCHG HANDSAV,BX ;写文件至BUFFER
MOV AH,40H
INT 21H
MOV ERRNUM,4
JC ERROR
XCHG HANDSAV,BX
JMP RD_WR
DONE:
MOV AH,3EH ;关闭文件
INT 21H
MOV ERRNUM,5
JC ERROR
XCHG HANDSAV,BX
MOV AH,3EH
INT 21H
MOV ERRNUM,6
JC ERROR
JMP RETURN
ERROR:
MOV AH,3EH
INT 21H
XCHG HANDSAV,BX
MOV AH,3EH
INT 21H
CMP ERRNUM,1
JNZ ERR2
LEA DX,ERRMSG1
JMP SHOWERR
ERR2:
CMP ERRNUM,2
JNZ ERR3
LEA DX,ERRMSG2
JMP SHOWERR
ERR3:
CMP ERRNUM,3
JNZ ERR4
LEA DX,ERRMSG3
JMP SHOWERR
ERR4:
CMP ERRNUM,4
JNZ ERR5
LEA DX,ERRMSG4
JMP SHOWERR
ERR5:
CMP ERRNUM,5
JNZ ERR6
LEA DX,ERRMSG5
JMP SHOWERR
ERR6:
CMP ERRNUM,6
JNZ RETURN
LEA DX,ERRMSG6
SHOWERR:
CALL DISP
RETURN:
RET
COPY ENDP
CODE ENDS
END MAIN
恳请大家相助,时速实在紧张……

; 题目名称:命令行COPY命令功能

; 题目来源:http://zhidao.baidu.com/question/132613879.html

; 操作说明:

; 1、源文件名或目标文件名,一定要遵守DOS下的文件名命名规则;

; 2、本程序一定要在保护模式下运行

; 3、命令格式:copyxx filepath1 filepath2

; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。

Code   Segment

   Assume  CS:Code,DS:Code

; -------------------------------------

; 功能:显示指定地址(Str_Addr)的字符串

; 入口:

; Str_Addr=字符串地址(要求在数据段)

; 用法: Output Str_Addr

; 用法举例:Output PromptStr

Output  MACRO Str_Addr

   lea  dx,Str_Addr

   mov  ah,9

   int  21h

   EndM

; -------------------------------------

Addr_File  dw  ?,? ;文件名字符串地址

Handle_File  dw  ?,? ;文件代号

Prompt_Str1 db  13,10,10,'The source file does not exist.$'

Prompt_Str2 db  13,10,10,'Invalid path.$'

Prompt_Str3 db  13,10,10,'Charactors on command line is no or too few.$'

Prompt_Str4 db  13,10,10,'Invalid parameters.$'

Prompt_Str5 db  13,10,10,10,'The file has been copied.$'

Press_Key  db    7,13,10,10,'Press any key to exit...$' 

Start:    push  cs

   pop  ds

   mov  ah,2fh ;取当前DTA地址(命令行参数地址)

   int  21h

   mov  cl,BYTE ptr es:[bx]

   cmp  cl,4

   jae  Next0 ;命令行参数多余或等于4个字符,转去分解、处理参数

   Output Prompt_Str3 ;提示:命令行参数字符太少

   jmp  Exit_Proc ;结束程序

Next0:  push  es

   pop  ds

   push  cs

   pop  es

   xor  ch,ch

   push  cx

   lea  si,[bx][2]

   lea  di,File_Name

   cld

   rep  movsb

   pop  cx

   push  cs

   pop  ds

   lea  di,File_Name

   mov  al,20h

   repz  scasb ;查找源文件名字符串地址

   jnz  Next1

Invalid_Para: Output Prompt_Str4 ;提示:命令行参数无效

   jmp  Exit_Proc ;结束程序

Next1:  lea  bx,[di-1]

   mov  Addr_File,bx ;保存源文件名字符串地址

   repnz scasb ;查找源文件名字符串结束地址

   jnz  Invalid_Para

   mov  BYTE ptr [di-1],0 ;源文件名字符串结束符

   repz  scasb ;查找目标文件名字符串地址

   jz  Invalid_Para

   cmp  BYTE ptr [di-1],0dh

   jz  Invalid_Para

   lea  bx,[di-1]

   mov  Addr_File[2],bx ;保存目标文件名字符串地址

   repnz scasb ;查找目标文件名字符串结束地址

   mov  BYTE ptr [di-1],0 ;目标文件名字符串结束符

   mov  dx,Addr_File ;源文件名字符串地址

Open_File: mov  ax,3d40h ;打开源文件

   int  21h

   jc  $+8

   mov  Handle_File,ax ;保存源文件代号

   jmp  Target_File

   cmp  ax,5

   jz  Open_File ;若访问被拒绝,尝试再次打开文件

   cmp  ax,2

   jnz  Next2

   Output Prompt_Str1 ;提示:文件不存在

   jmp  Exit_Proc

Next2:  cmp  ax,3

   jnz  Target_File

   Output Prompt_Str2 ;提示:无效的路径

   jmp  Exit_Proc

Target_File: mov  dx,Addr_File[2] ;目标文件名字符串地址

   xor  cx,cx

Create_File: mov  ah,3ch ;建立目标文件

   int  21h

   jnc  Next3

   cmp  ax,3

   jnz  Create_File

   Output Prompt_Str2 ;提示:无效的路径

   jmp  Exit_Proc

Next3:  mov  Handle_File[2],ax ;保存目标文件代号

   lea  dx,File_Name ;文件内容缓冲区

   mov  cx,0ffc0h ;预留32个字的堆栈空间

   sub  cx,dx ;设置读写一次文件内容的字节数

   mov  bp,cx ;暂存

Read_File: mov  cx,bp

   mov  bx,Handle_File ;读取源文件代号

   mov  ah,3fh ;读文件内容

   int  21h

   jc  Read_File ;读文件失败,尝试再读

   test  ax,ax

   jz  Close_File ;若实际读取的字节数为0,结束读写操作,关闭源文件和目标文件

   mov  bx,Handle_File[2] ;读取目标文件代号

   mov  cx,ax

Write_File: mov  ah,40h ;写文件

   int  21h

   jc  Write_File ;写文件失败,尝试再写

   jmp  Read_File

Close_File: mov  bx,Handle_File ;读取源文件代号

   mov  ah,3eh ;关闭文件

   int  21h

   mov  bx,Handle_File[2] ;读取目标文件代号

   mov  ah,3eh ;关闭文件

   int  21h

   Output Prompt_Str5 ;提示:文件已复制

; -------------------------------------

Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序

   mov  ah,1

   int  21h

   mov  ah,4ch ;结束程序

   int  21h

File_Name  db  ? ;字符串缓冲区

Code   Ends

   END   Start ;编译到此结束

温馨提示:答案为网友推荐,仅供参考
相似回答