磁盘管理文件及应用
DOS磁盘文件管理功能调用时DOS功能调用的重要组成部分
DOS磁盘文件管理功能的调用
在下面介绍的DOS磁盘文件管理功能调用中,用于表示文件名的ASCII字符串必须是ASCII码值0结尾(不是数字符号0)这样的字符串通常称为ASCII串,文件名可以使包含盘符和路径的文件标识,如果没有盘符,者认为是当前胖,如果路径不是从根目录开始,那么就认为是从当前目录了开始
DOS功能的调用
1:建立文件(创建新的或者刷新老的文件)
入口参数:DS:DX = 代表文件名的字符串的首地址
CX = 文件属性:
出口参数:CF = 0, 表示成功,AX等于 文件柄
CF = 1 表示失败,AX = 错误代码
说明,可以指定文件的属性如下: 00 H普通文件
01 H 只读文件
02 H 隐含文件
04 H系统文件
创建文件成功后,文件长度定为0
2:打开文件(3DH号功能的调用)
功能:打开文件,入口参数:DS:DX = 代表文件名的字符串的首地址
AL = 取存方式
出口参数:CF= 0,表示成功AX = 文件号
CF = 1,表示失败,AX = 错误代码
说明:(1)存取方式规定如下:
00H 只读方式
01H 只写方式
02H 读写方式
(2)打开文件成功后,文件指针定位于开始的第一个字节
3:读文件(3FH号功能的调用)
功能:读文件
入口参数:BX = 文件号
CX = 读入字节数
DS:DX= 准备存放所读数据的缓冲区首地址
出口参数:CF = 0 表示成功,AX = 实际读到的字节数
CF = 1,表示失败,AX = 错误代码
说明: (1)通常情况下,实际读到的字节数与欲读入的的字节数相同,除非不够读
(2)缓冲区应保证能容下说读到的数据
(3)文件应该以读的心思打开
(4)读文件后,文件指针应当定位到读出字节之后的第一个地址处
4:写文件(40H)
功能:写文件
入口参数:BX = 文件号
CX = 写盘字节数
DS:DX = 存放字节数的缓冲区首地址
出口参数:出口参数:CF = 0,表示成功,AX = 实际独到的字节数
CF = 1,表示失败,AX = 错误代码
说明:(1)通常情况下,实际读出的字节数与欲写的世界树相同,除非写磁盘已经满了
(2)文件应该以写或者读的形式打开
(3)写文件后,文件指针将定位到写入字节之后的第一个字节处
关闭文件:(3EH功能调用)
功能:关闭文件:
入口参数:BX = 文件句柄号
出口参数:CF = 0,表示成功
CF = 1 ,表示失败
文件号是打开该文件时,系统给定的文件号
移动文件读写指针(42H号功能的调用)
入口参数:BX = 文件号
CX = DX = 移动位移量
AL = 移动方式
出口参数:CF = 0,表示成功,此时DX : AX = 移动后文件指针值
CF = 1,表示失败,此时AX = 1,表示无效的移动,AX = 6,表示无效文件号
说明:(1)文件指针值是以文件首字节为0计算的
(2)移动的目的,
00H表示 移动文件指针的值 = 0 + 移动位移量
01H = 文件指针的值加上移动位移量
02H = 文件长(文件尾部) +移动的位移量
删除文件:(41H)的调用
功能:删除文件
入口参数:DS:DX = 代表文件名的字符串首地址
出口参数:CF = 0 表示成功
CF = 1,表示失败,AX = 错误代码
说明:只能删除一个普通的文件
写一个文本显示内容程序,文本文件为固定当前目录下的TEST.TXT文件
1 ;程序名功能 显示当前目录文本下的TEST.TXT内容 2 ;符号常量定义 3 EOF = 1AH ;文件结束符的ASCII 4 ;数据段 5 DSEG SEGMENT 6 FANME DB 'TEST.TXT',0 7 ERROR1 DB 'File not found ',07H,0 8 ERROR2 DB 'Reading error',07H,0 9 BUFFER DB ? 10 DSEG ENDS 11 ; 12 ;代码段 13 CSEG SEGMENT 14 ASSUME CS:CSEG,DS:DSEG 15 START: MOV AX,DSEG 16 MOV DS,AX 17 18 MOV DX,OFFSET FANME;也就是把变量FANME的偏移放入DX入口 19 MOV AX,3D00H ;AH = 3DH,AL = 00H,打开指定文件其中 00H表示以只读方式打开 20 INT 21H 21 JNC OPEN_OK;打开成功进行跳转 22 MOV SI,OFFSET ERROR1 23 CALL DMESS 24 JMP OVER 25 ; 26 27 OPEN_OK: MOV BX,AX ;保存文件句柄 28 CONT: CALL READCH 29 JC READEER 30 CMP AL,EOF 31 JZ TYPE_OK 32 CALL PUTCH 33 JMP CONT 34 35 READEER: MOV SI,OFFSET ERROR2 36 CALL DMESS 37 ; 38 TYPE_OK:MOV AH,3EH ;关闭文件调用:BX= 文件号,CF = 0,表示成功,CF = 1,表示失败 39 INT 21H 40 41 42 OVER: MOV AH, 01H 43 INT 21H 44 MOV AH,4CH 45 INT 21H 46 47 READCH PROC 48 MOV CX,1 ;准备读出一个字节 49 MOV DX,OFFSET BUFFER 50 MOV AH,3FH;读文件入口参数BX = 文件号,CX = 读入字节数,DS:DX= 准备存放所读数据的缓存区首地址 51 INT 21H 52 JC READCH2 53 CMP AX,CX 54 MOV AL,EOF 55 JB READCH1 56 MOV AL,BUFFER 57 READCH1:CLC ;清除进位标志 58 READCH2:RET ;段间返回 59 READCH ENDP 60 61 DMESS PROC 62 DMESS1:MOV DL,[SI] 63 INC SI 64 OR DL,DL;字符串以0结尾因此用来判断DL是否到字符串的末尾 65 JZ DMESS2 66 MOV AH,2 ;向标准输出设备写一个字符串 67 INT 21H 68 JMP DMESS1 69 DMESS2:RET ;段间返回指令 70 DMESS ENDP 71 72 PUTCH PROC 73 PUSH DX 74 MOV DL,AL 75 MOV AH,2 76 INT 21H 77 POP DX 78 RET 79 PUTCH ENDP 80 81 CSEG ENDS 82 END START
写一个能把键盘输入的全部字符串存入某个文件的程序(直到按下CTRL+Z按键的值是1AH为止)
1 ;程序功能:把键盘上输入的全部存入文件TEST.TXT中 2 ;常量定义 3 EOF = 1AH 4 ;数据段 5 DSEG SEGMENT 6 FANME DB 'TEST.TXT',0 7 ERROR1 DB 'Can not create file',07H,'$' 8 ERROR2 DB 'Writing error',07H,'$' 9 BUFFER DB ? 10 DSEG ENDS 11 12 CSEG SEGMENT 13 ASSUME CS:CSEG,DS:DSEG 14 START: MOV AX,DSEG 15 MOV DS,AX 16 17 MOV DX,OFFSET FANME 18 MOV CX,00H 19 MOV AH,3CH 20 INT 21H 21 JNC CREA_OK 22 23 MOV DX,OFFSET ERROR1 24 CALL DISPMESS 25 JMP OVER 26 27 CREA_OK:MOV BX,AX 28 CONT: CALL GETCHAR 29 PUSH AX 30 CALL WRITECH 31 POP AX 32 JC WERROR 33 CMP AL,EOF 34 JNZ CONT 35 JMP CLOSEF 36 WERROR:MOV DX,OFFSET ERROR2 37 CALL DISPMESS 38 CLOSEF:MOV AH,3EH 39 INT 21H 40 OVER: MOV AH,1H 41 INT 21H 42 MOV AH,4CH 43 INT 21H 44 45 46 WRITECH PROC 47 MOV BUFFER,AL 48 MOV DX,OFFSET BUFFER 49 MOV CX,1 50 MOV AH,40H 51 INT 21H 52 RET 53 WRITECH ENDP 54 55 GETCHAR PROC 56 MOV AH,1 57 INT 21H 58 RET 59 GETCHAR ENDP 60 61 DISPMESS PROC 62 MOV AH ,9 63 INT 21H 64 RET 65 DISPMESS ENDP 66 67 CSEG ENDS 68 END START
比较重要的子程序程序:
(1)显示DOS调用,类似于printf函数式DISPMESS
入口参数:DS:DX = 需要输出字符串的首地址,字符串内部以字符‘$’为结束标志
比如要显示ERROR DB 'write fail',0,'$'
调用函数之前,要进行 MOV DX,OFFSET ERROR
CALL DISPMESS
DISPMESS PROC MOV AH,9 INT 21H RET DISPMESS ENDP
(2)显示DOS调用,类似于putchar,这个功能用于换行和光标移到下一行首页
入口参数:DL = 要输出的字符的ASCII
出口参数:无
函数为NEWLINE
NEWLINE PROC PUSH AX PUSH DX MOV DL,0DH ;回车符的ASCII是0DH MOV AH,2 INT 21H MOV DL,0AH;换行符的ASCII是0AH MOV AH,2 INT 21H POP DX POP AX RET NEWLINE ENDP
(3)DOS调用功能,相当于scanf,调用之前,一般要给出缓冲区的首地址
入口参数:DX = 缓冲区首地址
出口参数:AL = 接收到的输入字符串在缓冲区中
例如定义缓冲区为BUFF DB 128
DB ?
DB 128 DUP (0)
调用函数之前,要来一个 MOV DX,OFFSET BUFF
MOV AH,10 INT 21H
(4)打开文件,类似于open
其中:FANME DB ’test.txt‘;即是FANME是文件名
3D00H是AH = 3D,AL = 00H,00H表示只读的方式打开文件
MOV DX,OFFSET FANME
MOV AH,3D00H
INT 21H
JNC OPNN_OK
(5)关闭文件类似于close,调用的参数是3EH
MOV AH ,3EH
INT 21H
(6)读取文件,相当于read,这个比较难,首先需要来一个循环,判断是否读到文件结尾
read实现的思路,保存文件句柄 —>从文件中读取一个字符—>读取出错者进行跳转—>判断读到字符结束符—>如果读到文件结束符进行跳转—>否则显示已经读到的字符—>继续
OPEN_OK: MOV BX,AX ;保存文件句柄
CONT:CALL READCH;读取一个字节
JC READERR;读取出错进行跳转
CMP AL,EOF;比较是否读完,
JZ TYPE_OK;读完进行跳转
CALL PUTCH;显示已经读到的字符
JMP CONT;继续读取
首先读取一个字符 CALL READCH
其中READCH :
READCH PROC MOV CX,1 ;读入字节数为1 MOV DX,0FFSET BUFFER ;缓冲区首地址 MOV AH,3FH ; INT 21H ; JC READCH2 ;读出错返回 CMP AX,CX ;比较稳健时候已经结束 MOV AL,EOF ;设文件已经结束,置文件结束符 JB READCH ; MOV AL,BUFFER ;文件未结束,取所读的字符 READCH1:CLC ; READCH2:RET ; READCH ENDP
读文件的入口参数:BX = 文件句柄
CX = 入读字节数
DX = 准备存入所读字节的缓冲首地址
文件未结束,调用MOV AL,BUFFER来保存所读的字节,之后显示所读的字节,调用putchar
调用PUTCH
PUTCH PROC PUSH DX MOV DL,AL MOV AH,2 INT 21H POP DX RET PUTCH ENDP
(7)写一个文件:write写文件思路
保存文件句柄-> 接受一个按键->向文件中写入所读的字符 ->如果写出错者进行跳转 ->遇到文件结束符吗? ->没遇到继续 ->遇到文件结束符,跳转到结束
CREA_OK:MOV BX,AX;保存文件句柄
CONT: CALL GETCHAR;接受一个键
PUSH AX;
CALL WRITECH;向文件中写入所读字符
POP AX;
JC WERROR;
CMP AL,EOF;遇到文件结束符了吗
JNZ CONT;没有继续进行前面的操作
JMP CLOSE ;
getchar 这个函数调用dos功能中的1,出口参数为AL中所读到的字符
GETCHAR PROC MOV AH,1 INT 21H RET GETCHAR ENDP
writech函数中调用的是40h
WRITECH PPOC
MOV BUFFER,AL;把要写的一个字节送入缓冲区
MOV DX,OFFSET BUFFER;置缓冲区地址
MOV CX,1;置要写的字节数
MOV AH,40H;写
INT 21H;
RET 返回
WRITECH ENDP
把一个文件复制粘贴到另一个文件中去
1 ;程序功能,把文件1拼接到文件test2之后 2 ;符号常量定义 3 BUFFLEN = 512 4 ;数据段 5 DSEG SEGMENT 6 FNAME1 DB 'TEST1.txt',0 7 FNAME2 DB 'TEST2.txt',0 8 HANDLE1 DW 0 9 HANDLE2 DW 0 10 ERRMESS1 DB 'CAN NOT OPEN FILE',07H,'$' 11 ERRMESS2 DB 'READING ERROR',07H,'$' 12 ERRMESS3 DB 'WRITING ERROR',07H,'$' 13 BUFFER DB BUFFLEN DUP (0) 14 DSEG ENDS 15 16 CSEG SEGMENT 17 ASSUME CS:CSEG,DS:DSEG 18 START: MOV AX,DSEG 19 MOV DS,AX 20 21 MOV DX,OFFSET FNAME1 22 MOV AX,3D01H 23 INT 21H 24 JNC OPEN_OK1 25 ERR1:MOV DX,OFFSET ERRMESS1 26 CALL DISPMESS 27 JMP OVER 28 29 OPEN_OK1:MOV HANDLE1,AX 30 MOV DX,OFFSET FNAME2 31 MOV AX,3D00H 32 INT 21H 33 JNC OPENOK2 34 OPENOK2:MOV HANDLE2,AX 35 MOV BX,HANDLE1 36 XOR CX,CX 37 XOR DX,DX 38 MOV AX,4202H 39 INT 21H 40 CONT: MOV DX,OFFSET BUFFER 41 MOV CX,BUFFLEN 42 MOV BX,HANDLE2 43 MOV AH,3FH 44 INT 21H 45 JC RERR 46 OR AX,AX 47 JZ COPYOK 48 MOV CX,AX 49 MOV BX,HANDLE1 50 MOV AH,40H 51 INT 21H 52 JNC CONT 53 54 WERR:MOV DX,OFFSET ERRMESS3 55 CALL DISPMESS 56 JMP SHORT COPYOK 57 58 RERR: MOV DX,OFFSET ERRMESS2 59 CALL DISPMESS 60 COPYOK:MOV BX,HANDLE1 61 MOV AH,3EH 62 INT 21H 63 MOV BX,HANDLE2 64 MOV AH,3EH 65 INT 21H 66 OVER:MOV AH,1 67 INT 21H 68 MOV AH,4CH 69 INT 21H 70 DISPMESS PROC 71 PUSH AX 72 PUSH DX 73 MOV AH,9 74 INT 21H 75 POP DX 76 POP AX 77 RET 78 DISPMESS ENDP 79 80 CSEG ENDS 81 END START
版权所有,转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3706233.html