主题:[原创]一个关于文件的问题
一个关于文件的问题
有点问题:单步执行没什么问题,但运行时就有问题
功能为:将一个文己存在的文件的内容复制到一个新建的文件中,其中文件名由自己输入
SSEG SEGMENT STACK
DB 80h DUP (?)
SSEG ENDS
DSEG SEGMENT
ASKFN DB 'File Name:$'
FNAME DB 14,0,14 dup (?)
handle1 dw ?
handle2 dw ?
ERRMSG DB 'FILE ERROR!$'
BUFF DB 512 DUP(?)
DSEG ENDS
CSEG SEGMENT
ASSUME CS:cseg,ds:dseg,ss:sseg
FILE:
mov ax,dseg
mov ds,ax
LEA DX,ASKFN ;提示信息"file name:"的首地址
MOV AH,9 ;显示字符串功能调用号
INT 21H ;显示'file name:'
LEA DX,FNAME ;输入缓冲区首地址
MOV AH,0AH ;输入字符串功能号的调用
INT 21H
MOV DL,0AH ;换行
MOV AH,2
INT 21H
MOV BL,FNAME+1 ;输入字符串的个数
MOV BH,0 ;将BL扩展到BX中
MOV [BX+FNAME+2],BH ;文件名的最后放上一个0
LEA DX,FNAME+2 ;取文件名的首地址
MOV AX,3D00H ;以读的方式打开指定的文件
INT 21H
JC EXIT ;若打开失败则退出
MOV handle1,AX ;送文件号到handle1中保存
LEA DX,ASKFN ;提示信息"file name:"的首地址
MOV AH,9 ;显示字符串功能调用号
INT 21H ;显示'file name:'
LEA DX,FNAME ;输入缓冲区首地址
MOV AH,0AH ;输入字符串功能号的调用
INT 21H
MOV DL,0AH ;换行
MOV AH,2
INT 21H
MOV BL,FNAME+1 ;输入字符串的个数
MOV BH,0 ;将BL扩展到BX中
MOV [BX+FNAME+2],BH ;文件名的最后放上一个0
mov [bx+FNAME+3],0
MOV [BX+FNAME+4],0
LEA DX,FNAME+2 ;取文件名的首地址
MOV AX,3c00H ;创建一个普通文件
INT 21H
JC EXIT ;若打开失败则退出
MOV handle2,AX ;送文件号到handle1中保存
AGAIN: mov bx,handle1 ;送读文件号到bx中保存
MOV CX,512 ;每次读入的字节数
LEA DX,BUFF ;取缓冲区的地址
MOV AH,3FH ;读文件的功能号
INT 21H ;读入
JC EXIT ;如果文件出错,转EXIT
PUSH AX ;保存实际读出的字节数
copy: mov ah,40h
mov bx,handle2
pop cx
lea dx,buff
int 21h
jc EXIT
cmp cx,512
je again
close1: mov bx,handle1
MOV AH,3EH ;读文件关闭
INT 21H
;结束
close2: mov bx,handle2
mov ah,3eh
int 21h
jmp stop
EXIT: LEA DX,ERRMSG
MOV AH,9
INT 21H
stop: mov AX,4c00h
int 21h
CSEG ENDS
END FILE
有点问题:单步执行没什么问题,但运行时就有问题
功能为:将一个文己存在的文件的内容复制到一个新建的文件中,其中文件名由自己输入
SSEG SEGMENT STACK
DB 80h DUP (?)
SSEG ENDS
DSEG SEGMENT
ASKFN DB 'File Name:$'
FNAME DB 14,0,14 dup (?)
handle1 dw ?
handle2 dw ?
ERRMSG DB 'FILE ERROR!$'
BUFF DB 512 DUP(?)
DSEG ENDS
CSEG SEGMENT
ASSUME CS:cseg,ds:dseg,ss:sseg
FILE:
mov ax,dseg
mov ds,ax
LEA DX,ASKFN ;提示信息"file name:"的首地址
MOV AH,9 ;显示字符串功能调用号
INT 21H ;显示'file name:'
LEA DX,FNAME ;输入缓冲区首地址
MOV AH,0AH ;输入字符串功能号的调用
INT 21H
MOV DL,0AH ;换行
MOV AH,2
INT 21H
MOV BL,FNAME+1 ;输入字符串的个数
MOV BH,0 ;将BL扩展到BX中
MOV [BX+FNAME+2],BH ;文件名的最后放上一个0
LEA DX,FNAME+2 ;取文件名的首地址
MOV AX,3D00H ;以读的方式打开指定的文件
INT 21H
JC EXIT ;若打开失败则退出
MOV handle1,AX ;送文件号到handle1中保存
LEA DX,ASKFN ;提示信息"file name:"的首地址
MOV AH,9 ;显示字符串功能调用号
INT 21H ;显示'file name:'
LEA DX,FNAME ;输入缓冲区首地址
MOV AH,0AH ;输入字符串功能号的调用
INT 21H
MOV DL,0AH ;换行
MOV AH,2
INT 21H
MOV BL,FNAME+1 ;输入字符串的个数
MOV BH,0 ;将BL扩展到BX中
MOV [BX+FNAME+2],BH ;文件名的最后放上一个0
mov [bx+FNAME+3],0
MOV [BX+FNAME+4],0
LEA DX,FNAME+2 ;取文件名的首地址
MOV AX,3c00H ;创建一个普通文件
INT 21H
JC EXIT ;若打开失败则退出
MOV handle2,AX ;送文件号到handle1中保存
AGAIN: mov bx,handle1 ;送读文件号到bx中保存
MOV CX,512 ;每次读入的字节数
LEA DX,BUFF ;取缓冲区的地址
MOV AH,3FH ;读文件的功能号
INT 21H ;读入
JC EXIT ;如果文件出错,转EXIT
PUSH AX ;保存实际读出的字节数
copy: mov ah,40h
mov bx,handle2
pop cx
lea dx,buff
int 21h
jc EXIT
cmp cx,512
je again
close1: mov bx,handle1
MOV AH,3EH ;读文件关闭
INT 21H
;结束
close2: mov bx,handle2
mov ah,3eh
int 21h
jmp stop
EXIT: LEA DX,ERRMSG
MOV AH,9
INT 21H
stop: mov AX,4c00h
int 21h
CSEG ENDS
END FILE