实验九文件操作
一、实验分析及框图
1、从命令行读入参数:DOS加载一个外部命令或用户程序时,把文件名之后到回车符
之间的字符串,送到PSP位移81H开始的区域,位移80H的一个字节存放参数字符串长度(回车符不算在内)。读入参数可利用一个循环将80h之后的字节存放到已经申请的用于存放ACSIIZ串的内存空间。在读参数的时候需要判断参数开始存放的位置和参数结束的位置。因为第一个空格以前的字符串为命令名(必须符合DOS命名规则),第一个空格(包括空格)到回车之间的字符作为命令或程序的参数,所以判断的时候可利用第一个不是空格的字节开始,以回车作为结束。在此过程中遇到做一些简单的输入格式错误的响应。
2、调用DOS功能打开文件,并处理可能发生的错误(如文件不存在等)。
在将命令行参数读进响应的内存后,在其后存放一个全零的字节形成ASCIIZ串。设置相应的入口参数之后,调用DOS功能调用INT 21h打开文件。
判断返回参数CF,如果为0,保存文件代码;如果为1,显示出错并退出程序。
3.将文件内容显示在显示器上:设置入口参数如文件代号、读取字节数等,然后调用
读文件的功能调用。判断返回参数CF,如果为0,表示读取成功;如果为1,读取失败显示失败信息并退出程序。
4、关闭文件,返回DOS:设置文件代号,调用关闭文件的功能调用。判断返回参数
CF,如果为0,表示读取成功;如果为1,读取失败显示失败信息并退出程序
二、程序
code segment
assume cs:code,ds:code,es:code,ss:code
org 100h
main proc near
jmp start
org 1000h
fpath db 50 dup(?) ;'D:\hello.txt',0
errmsg3 db'File Operating Error !',0dh,0ah,24h
errmsg2 db'File Cannot Be Closed !',0dh,0ah,24h
errmsg1 db'File Not Found !',0dh,0ah,24h
endmsg db'Press any key to continue !$'
handle dw?;存文件代号
buf db 586 dup(?),'$';数据缓冲区
count dw?;计数
start:
mov al,byte ptr ds:[80h];路径字节数+1
mov si,0
mov cx,count
dec cx ;路径字节数
loop1:
mov al,byte ptr ds:[si+82h]
mov fpath[si],al ;保存路径
inc si
loop loop1
mov fpath[si],0 ;补0,以构成ASCIIZ串
;openf
lea dx,fpath
mov ax,3d02h ;打开,读写文件
int 21h
jc Err1
mov handle,ax ;将文件代号存入handle
;readf
mov bx,handle
mov cx,0ffffh ;读取的字节数
lea dx,buf ;数据缓冲区地址
mov ah,3fh
int 21h
;showf
lea dx,buf
mov ah,09h
int 21h
;closef
mov bx,handle
mov ah,3eh
int 21h
jc Err2
call enter ;输出回车
;stop
lea dx,endmsg
mov ah, 09h
int 21h
mov ah,8 ;无回显键盘输入
int 21h
jmp Exit
Err1: call Error1 ;文件路径错误提示
ret
Err2: call Error2 ;不能关闭提示
ret
Err3: call Error3 ;操作错,此程序中未用到ret
Exit:
ret
main endp
Error1 proc near ;文件路径错误提示
lea dx,errmsg1
mov ah, 09h
int 21h
ret
Error1 endp
Error2 proc near ;不能关闭提示
lea dx,errmsg2
mov ah, 09h
int 21h
ret
Error2 endp
Error3 proc near ;操作错,此程序中未用到lea dx,errmsg3
mov ah, 09h
int 21h
ret
Error3 endp
enter proc near ;输出回车符
mov ah,02h
mov dl,0dh
int 21h
mov ah,02h
mov dl,0ah
ret enter endp
code ends
end main 三.实验截图