时间冲突,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 ;编译到此结束