80*86汇编语言程序设计 第2版 教学ppt课件第9章 磁盘文件存取方法.ppt

上传人:小飞机 文档编号:3909245 上传时间:2023-03-27 格式:PPT 页数:25 大小:192.50KB
返回 下载 相关 举报
80*86汇编语言程序设计 第2版 教学ppt课件第9章 磁盘文件存取方法.ppt_第1页
第1页 / 共25页
80*86汇编语言程序设计 第2版 教学ppt课件第9章 磁盘文件存取方法.ppt_第2页
第2页 / 共25页
80*86汇编语言程序设计 第2版 教学ppt课件第9章 磁盘文件存取方法.ppt_第3页
第3页 / 共25页
80*86汇编语言程序设计 第2版 教学ppt课件第9章 磁盘文件存取方法.ppt_第4页
第4页 / 共25页
80*86汇编语言程序设计 第2版 教学ppt课件第9章 磁盘文件存取方法.ppt_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《80*86汇编语言程序设计 第2版 教学ppt课件第9章 磁盘文件存取方法.ppt》由会员分享,可在线阅读,更多相关《80*86汇编语言程序设计 第2版 教学ppt课件第9章 磁盘文件存取方法.ppt(25页珍藏版)》请在三一办公上搜索。

1、第9章 磁盘文件存取方法,9.1 以文件句柄方式存取文件 9.2 文件操作举例,9.1 以文件句柄方式存取文件,9.1.1 DOS文件功能调用 9.1.2 路径和ASCIIZ串9.1.3 文件句柄、错误代码和文件属性9.1.4 文件的打开方式9.1.5 读写指针的移动,9.1.1 DOS文件功能调用,DOS的INT 21H为文件操作提供了相应的功能支持,基于文件句柄的DOS功能调用如下:AH=3CH:创建一个新文件 输入参数:DS:DX=ASCIIZ串的首地址 CX=文件属性 返回结果:CF=0,创建成功,AX=文件句柄 CF=1,创建失败,AX=错误代码AH=3DH:打开一个已有文件 输入参

2、数:DS:DX=ASCIIZ串的首地址 AL=访问方式(0读打开,1写打开,2读写打开)返回结果:CF=0,打开成功,AX=文件句柄 CF=1,打开失败,AX=错误代码,AH=3EH:关闭文件 输入参数:BX=文件句柄 返回结果:CF=0,操作成功 CF=1,操作失败,AX=错误代码 AH=3FH:读文件 输入参数:DS:DX=读缓冲区的首地址 BX=文件句柄 CX=希望读入的字节数 返回结果:CF=0,操作成功,AX=实际读入的字节数 CF=1,操作失败,AX=错误代码AH=40H:写文件 输入参数:DS:DX=写缓冲区的首地址 BX=文件句柄 CX=要写入的字节数 返回结果:CF=0,操作

3、成功,AX=实际写入的字节数 CF=1,操作失败,AX=错误代码,AH=41H:删除文件 输入参数:DS:DX=ASCIIZ串的首地址 返回结果:CF=0,操作成功 CF=1,操作失败,AX=错误代码 AH=42H:移动文件读写指针 输入参数:BX=文件句柄 AL=移动方式代码 CX=移动字节数的高位字 DX=移动字节数的低位字 返回结果:CF=0,操作成功,DX:AX=新指针位置 CF=1,操作失败,AX=错误代码AH=43H:检验(读取)或改变文件属性 输入参数:DS:DX=ASCIIZ串的首地址 AL=0,为读取文件属性 AL=1,为设置文件属性,CX=新文件属性 返回结果:CF=0,操

4、作成功,输入AL=0则CX=属性 输入AL=1则CX=新属性 CF=1,操作失败,AX=错误代码,9.1.2 路径和ASCIIZ串,当用DOS功能调用创建或打开文件时,首先必须在程序的数据段中定义一个反映文件名信息的ASCIIZ串,ASCIIZ串由文件路径名的ASCII码和一个全0字节组成,文件路径名说明文件的位置,包括磁盘驱动器、目录路径和文件名。例如:FILENAME DB C:MYMASMHB.DAT,00H 其中:FILENAME为ASCIIZ串的首地址,C:MYMASMHB.DAT 是创建或打开文件的路径和文件名,最后的00H用来标识该字符串为ASCIIZ串。,9.1.3 文件句柄、

5、错误代码和文件属性,1.文件句柄 用DOS功能调用创建或打开文件时,如果CF=0,说明操作成功,通过AX返回一个文件句柄,这时文件和句柄就建立了对应关系,以后对文件的读写等操作,只要给出文件句柄即可,而不必再给出其ASCIIZ串,因而一定要注意保存这个文件句柄。返回的文件句柄一般从05开始顺序排列,因为前5个句柄已被标准设备占用。2.错误代码 文件句柄存取方式对各种错误采取了统一的处理方法。在文件操作时,无论调用哪一功能调用,如返回CF=1,表示操作失败或出错,则AX中返回的是错误代码,这些错误代码都来自一个统一的错误代码表。,3.文件属性 文件属性字节用来说明DOS文件属性,其各位含义如图9

6、-1所示。7 6 5 4 3 2 1 0 只读文件 隐藏文件 系统文件 卷标 子目录 归档位图9-1 文件属性字节 主要属性字节代码如下:00H普通文件 01H只读文件 02H隐藏文件 04H系统文件 08H磁盘的卷标号 10H子目录 20H未归档的文件,9.1.4 文件的打开方式,用INT 21H的3DH功能打开一个文件时,打开文件的方式有三种,由AL中的打开方式代码确定:AL=0,以只读方式打开,文件只能读,不能写。AL=1,以只写方式打开,文件只能写,不能读。AL=2,以读写方式打开,文件可读可写。,DOS系统为每个打开的文件管理一个读写指针。对文件的读写操作,实际上是从当前指针指向的位

7、置开始的,可以把读写指针移动到文件的任意位置,从而能够实现对文件的随机存取。建立一个新文件或打开一个已有文件后,读写指针的值被初始化为0,也就是指向文件的起始位置。随着读写操作的进行,系统会根据读写的字节数,不断修改读写指针的值,使读写指针总是指向下一次要存取的字节。用INT 21H的42H功能可以把读写指针移到文件的任意位置。该功能要求在BX中设置文件句柄,在CX:DX中设置要移动的字节数(偏移量),在AL中设置移动方式代码。,9.1.5 读写指针的移动,AL中设置的移动方式代码指定了3种移动指针的方式:(1)AL=00H,从文件开始处计算偏移量(移动的字节数)。例如,对文件进行过读写操作后

8、,读写指针不再指向文件开始处,下面指令序列可以把读写指针重新移动到文件开始处:MOV AH,42H;INT 21H的42H功能 MOV AL,00H;从文件开始处计算偏移量 MOV BX,HANDLE;文件句柄(存储在HANDLE单元中)送BX MOV CX,0;移动字节数的高位数 MOV DX,0;移动字节数的低位数 INT 21H;DOS的21H号功能 又例如,从文件开始把指针移动100个字节的指令如下:MOV AH,42H MOV AL,00 MOV BX,HANDLE MOV CX,0 MOV DX,100;移动字节数的低位数 INT 21H,(2)AL=01,从文件的当前位置计算偏移

9、量。此时,偏移值可正可负,若为正,则正向移动指针;若为负,则反向移动。例如,从当前读写指针位置正向移动100个字节的指令序列如下:MOV AH,42H MOV AL,01;从当前读写指针位置计算偏移量 MOV BX,HANDLE MOV CX,0 MOV DX,100;移动字节数的低位数 INT 21H(3)AL=02,从文件尾计算偏移量 例如,要在文件尾添加记录,可先用下列指令把读写指针移到文件尾:MOV AH,42H MOV AL,02;从文件尾计算偏移量 MOV BX,HANDLE MOV CX,0 MOV DX,0 INT 21H 如果指针移动成功,在DX:AX中返回新指针的位置。,9

10、.2 文件操作举例,【例9-1】:创建一个文本文件MYFILE1.TXT,将从键盘输入的内容写入此文件中,输入过程以回车结束。(1)分析:1)在数据段中定义一个文件名的ASCIIZ串、一个字节的写缓冲区。2)利用INT 21H的3CH功能创建文件,若创建不成功则显示错误信息 并退出。3)在循环体中,利用INT 21H的1号功能从键盘接收字符,然后利用 INT 21H的40H功能把这一个字符写到文件中。每接收一个字符,判断是否为回车,若为回车则退出,否则循环。4)写文件后,必须先关闭文件,然后才能退出。,(2)程序流程图如下,DATA SEGMENTFILENAME1 DB MYFILE1.TX

11、T,0;ASCIIZ串FILENAME2 DB MYFILE2.TXT,0HANDLE1 DW?;保存文件句柄单元HANDLE2 DW?BUFFER DB 1024 DUP(?);读写缓冲区 LEN DW?;保存实际读入长度单元ERROR1 DB Can Not Open File!,0DH,0AH,$ERROR2 DB Can Not Creat File!,0DH,0AH,$ERROR3 DB Reading File Wrong!,0DH,0AH,$ERROR4 DB Writing File Wrong!,0DH,0AH,$DATA ENDSCODE SEGMENT ASSUME CS

12、:CODE,DS:DATAMAIN PROC FARSTART:MOV AX,DATA MOV DS,AX;打开文件MYFILE1 MOV AH,3DH;INT 21H的3DH功能 LEA DX,FILENAME1;DX=ASCIIZ串的首地址 MOV AL,0;AL=0,读打开 INT 21H;打开文件 JC ERR1;打开不成功,转ERR1 MOV HANDLE1,AX;成功,保存文件句柄,;创建新文件MYFILE2 MOV AH,3CH;INT 21H的3CH功能 LEA DX,FILENAME2;DX=ASCIIZ串的首地址 MOV CX,0;CX=0,普通文件 INT 21H;创建文

13、件 JC ERR2;创建不成功,转ERR2 MOV HANDLE2,AX;保存文件句柄;读MYFILE1内容到缓冲区 MOV AH,3FH;INT 21H的3FH功能 LEA DX,BUFFER;DX=读缓冲区的首地址 MOV BX,HANDLE1;BX=文件句柄 MOV CX,1024;CX=希望读入的字节数 INT 21H;读文件 JC ERR3;不成功,转ERR3 MOV LEN,AX;成功,保存字节数;把缓冲区中的小写字母变为大写字母 LEA SI,BUFFER;设置SI、DI为地址指针 MOV DI,SI MOV CX,LEN;CX=待处理的字符数 LP1:MOV AL,SI;从缓冲

14、区中取一个字节,(3)根据流程图编写汇编程序:,CMP AL,a;与小写字母a比较 JB CON1;若比a小,则不转换 CMP AL,z;与小写字母z比较 JA CON1;若比z大,则不转换 SUB AL,20H;否则转换成大写字母 MOV DI,AL;送回缓冲区 CON1:INC SI;修改地址指针 INC DI LOOP LP1;循环;将缓冲区中内容写到文件MYFILE2中 MOV AH,40H;INT 21H的40H功能 LEA DX,BUFFER;DX=写缓冲区首地址 MOV BX,HANDLE2;BX=文件句柄 MOV CX,LEN;CX=要写入的字节数 INT 21H;写文件 JC

15、 ERR4;不成功,转ERR4;关闭文件MYFILE2 L0:MOV AH,3EH;INT 21H的功能3EH MOV BX,HANDLE2;BX文件句柄 INT 21H;关闭文件 L1:MOV AH,3EH;关闭文件MYFILE1 MOV BX,HANDLE1 INT 21H,EXIT:MOV AX,4C00H;返回DOS INT 21H ERR1:MOV AH,9;显示打开文件出错信息 LEA DX,ERROR1 INT 21H JMP EXIT;返回DOS ERR2:MOV AH,9;显示创建文件出错信息 LEA DX,ERROR2 INT 21H JMP L1 ERR3:MOV AH,

16、9;显示读文件出错信息 LEA DX,ERROR3 INT 21H JMP L0 ERR4:MOV AH,9;显示写文件出错信息 LEA DX,ERROR4 INT 21H JMP L0 MAIN ENDP CODE ENDS END START,【例9-2】:将例9-1中形成的文件MYFILE1.TXT中的小写字母变成大写字母,并复制到另一文件MYFILE2.TXT中。(1)分析:对文件内容进行加工,必须在内存的读写缓存区中进行,所以,首先要打开文件,把文件内容读到读缓冲区中,然后在缓冲区中进行小写到大写的转换。(2)程序流程图如下。,DATA SEGMENTFILENAME1 DB MYF

17、ILE1.TXT,0;ASCIIZ串FILENAME2 DB MYFILE2.TXT,0HANDLE1 DW?;保存文件句柄单元HANDLE2 DW?BUFFER DB 1024 DUP(?);读写缓冲区 LEN DW?;保存实际读入长度单元ERROR1 DB Can Not Open File!,0DH,0AH,$ERROR2 DB Can Not Creat File!,0DH,0AH,$ERROR3 DB Reading File Wrong!,0DH,0AH,$ERROR4 DB Writing File Wrong!,0DH,0AH,$DATA ENDSCODE SEGMENT AS

18、SUME CS:CODE,DS:DATAMAIN PROC FARSTART:MOV AX,DATA MOV DS,AX;打开文件MYFILE1 MOV AH,3DH;INT 21H的3DH功能 LEA DX,FILENAME1;DX=ASCIIZ串的首地址 MOV AL,0;AL=0,读打开 INT 21H;打开文件 JC ERR1;打开不成功,转ERR1 MOV HANDLE1,AX;成功,保存文件句柄,;创建新文件MYFILE2 MOV AH,3CH;INT 21H的3CH功能 LEA DX,FILENAME2;DX=ASCIIZ串的首地址 MOV CX,0;CX=0,普通文件 INT

19、21H;创建文件 JC ERR2;创建不成功,转ERR2 MOV HANDLE2,AX;保存文件句柄;读MYFILE1内容到缓冲区 MOV AH,3FH;INT 21H的3FH功能 LEA DX,BUFFER;DX=读缓冲区的首地址 MOV BX,HANDLE1;BX=文件句柄 MOV CX,1024;CX=希望读入的字节数 INT 21H;读文件 JC ERR3;读文件不成功,转ERR3 MOV LEN,AX;读成功,保存字节数;把缓冲区中的小写字母变为大写字母 LEA SI,BUFFER;设置SI、DI为地址指针 MOV DI,SI MOV CX,LEN;CX=待处理的字符数 LP1:MO

20、V AL,SI;从缓冲区中取一个字节 CMP AL,a;与小写字母a比较 JB CON1;若比a小,则不转换 CMP AL,z;与小写字母z比较 JA CON1;若比z大,则不转换 SUB AL,20H;若是小写字母,则转换,(3)根据流程图编写汇编程序:,MOV DI,AL;送回缓冲区 CON1:INC SI;修改地址指针 INC DI LOOP LP1;循环;将缓冲区中内容写到文件MYFILE2中 MOV AH,40H;INT 21H的40H功能 LEA DX,BUFFER;DX=写缓冲区的首地址 MOV BX,HANDLE2;BX=文件句柄 MOV CX,LEN;CX=要写入的字节数 I

21、NT 21H;写文件 JC ERR4;写文件不成功,转ERR4;关闭文件MYFILE2 L0:MOV AH,3EH;INT 21H的功能3EH MOV BX,HANDLE2;BX文件句柄 INT 21H;关闭文件 L1:MOV AH,3EH;关闭文件MYFILE1 MOV BX,HANDLE1 INT 21H EXIT:MOV AX,4C00H;返回DOS INT 21H,ERR1:MOV AH,9;显示打开文件出错信息 LEA DX,ERROR1 INT 21H JMP EXIT;返回DOS ERR2:MOV AH,9;显示创建文件出错信息 LEA DX,ERROR2 INT 21H JMP

22、 L1 ERR3:MOV AH,9;显示读文件出错信息 LEA DX,ERROR3 INT 21H JMP L0 ERR4:MOV AH,9;显示写文件出错信息 LEA DX,ERROR4 INT 21H JMP L0 MAIN ENDPCODE ENDS END START,【例9-3】:将上面两个例子中形成的文件MYFILE2.TXT连接到MYFILE1.TXT后面,然后删除MYFILE2.TXT。(1)分析:把文件MYFILE2连接到MYFILE1,首先要打开两个文件,把文件MYFILE2 的内容读到缓冲区,然后再写到文件MYFILE1中。注意,写文件之前要把文件MYFILE1的读写指针

23、移动到文件尾,因为对文件的读写操作实际上是从当前指针指向的位置开始的,打开文件后,文件指针指向文件头,所以必须先把MYFILE1的指针移到文件尾,再把缓冲区中的内容写进去,这样才能保证文件MYFILE2的内容连接到MYFILE1的内容之后。,DATA SEGMENTFNAME1 DB MYFILE1.TXT,0;文件信息的ASCIIZ串FNAME2 DB MYFILE2.TXT,0HANDLE1 DW?;保存文件句柄单元HANDLE2 DW?BUFFER DB 100 DUP(?);读写缓冲区ERR1 DB Can not open file,0dh,0ah,$ERR2 DB Reading

24、error,0dh,0ah,$ERR3 DB Writing error,0dh,0ah,$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN PROC FAR MOV AX,DATA;初始化DS MOV DS,AX;以只写方式打开文件FNAME1 MOV AX,3D01H;写打开打开文件 LEA DX,FNAME1;DX=ASCIIZ串的首地址 INT 21H;打开文件 JC OPEN_ERR1;若打开不成功,转OPEN_ERR1 MOV HANDLE1,AX;打开成功,保存文件句柄;以读方式打开文件FNAME2 MOV AX,3D00H;AH=

25、3DH,打开文件;AL=0,读打开 LEA DX,FNAME2;DX=ASCIIZ串的首地址 INT 21H;打开文件 JC OPEN_ERR2;若打开不成功,转OPEN_ERR2 MOV HANDLE2,AX;打开成功,保存文件句柄,(3)根据流程图编写汇编程序:,(2)程序流程图如下:,;把文件FNAME1的指针移到文件尾 MOV BX,HANDLE1;BX=文件句柄 MOV CX,0;CX=移动字节数的高位字 MOV DX,0;DX=移动字节数的低位字 MOV AX,4202H;相对文件尾移动 INT 21H;移动指针;把文件FNAME2的内容读到缓冲区中 MOV BX,HANDLE2;

26、BX=文件2的文件句柄 LEA DX,BUFFER;DX=读缓冲区的首地址 MOV CX,100;CX希望读入的字节数 MOV AH,3FH;AH=3FH,读文件 INT 21H JC READ_ERR;不成功,转READ_ERR;把缓冲区中的内容写到文件1中 MOV BX,HANDLE1;BX=文件1的文件句柄 LEA DX,BUFFER;DX=写缓冲区的首地址 MOV CX,AX;CX=要写入的字节数 MOV AH,40H;AH40H,写文件 INT 21H JC WRITE_ERR;失败,转WRITE_ERRL1:MOV BX,HANDLE2;BX=文件2的文件句柄 MOV AH,3EH

27、;AH=关闭文件的功能号3EH INT 21H;关闭文件2L2:MOV BX,HANDLE1;BX=文件1的文件句柄 MOV AH,3EH;AH=关闭文件的功能号3EH INT 21H;关闭文件1,LEA DX,FNAME2;DX=文件2的ASCIIZ串首地址 MOV AH,41H;AH=41H,删除文件的功能号 INT 21H;删除文件2 MOV AX,4C00H;结束程序 INT 21H OPEN_ERR1:LEA DX,ERR1;显示打开文件1出错信息 MOV AH,9 INT 21H JMP L2OPEN_ERR2:LEA DX,ERR1;显示打开文件2出错信息 MOV AH,9 IN

28、T 21H JMP L1READ_ERR:LEA DX,ERR2;显示读文件出错信息 MOV AH,9 INT 21H JMP L1WRITE_ERR:LEA DX,ERR3;显示写文件出错信息 MOV AH,9 INT 21H JMP L1 MAIN ENDPCODE ENDS END MAIN,【例9-4】:已知有一个文件MYFILE.TXT,其中的内容为5个学生的记录,每条记录为14个字节,最后两个字节为回车和换行。要求编程实现:从键盘输入任一个序号后,在屏幕上显示出该条记录,有效记录号为15,若输入回车则结束。(1)分析:本程序的难点是要读取文件中的任意记录,为此必须将文件的读写指针移

29、动到该记录处。因为每条记录为14个字节,所以第N条记录在文件中相对于文件开始的偏移量为(N-1)14,那么从文件头开始移动文件指针的字节数即为(N-1)14。,DATA SEGMENTSTRING DB Please Input Number:,0DH,0AH,$FILENAME DB MYFILE.TXT,0;文件名的ASCIIZ串HANDLE DW?;保存文件句柄单元BUFFER DB 14 DUP(?),$;读缓冲区ERROR DB Number Wrong!,0DH,0AH,$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN PROC F

30、ARSTART:MOV AX,DATA MOV DS,AX;打开文件MYFILE.TXT MOV AH,3DH;AH=打开文件的功能号3DH LEA DX,FILENAME;DX=ASCIIZ串首地址 MOV AL,0;AL=0,读打开 INT 21H;打开文件 MOV HANDLE,AX;保存文件句柄 LP1:LEA DX,STRING;显示提示串STRING MOV AH,9 INT 21H,(3)根据流程图编写汇编程序:,(2)程序流程图如下:,MOV AH,1;从键盘输入一个数字 INT 21H CMP AL,0DH;如是回车,结束 JZ EXIT CMP AL,31H;若小于1,为非

31、法记录号 JB ERR;转ERR CMP AL,35H;若大于5,为非法记录号 JA ERR;转ERR SUB AL,30H;把ASCII码转换成二进制数 DEC AL;第N条记录在文件中相对于文 MOV BL,14;件开始的偏移量为(N-1)14 MUL BL MOV DX,AX;需要移动的字节数在DX中;移动读写指针到该条记录处 MOV AH,42H;AH=42H,移动文件指针 MOV AL,0;相对于文件开始处移动 MOV BX,HANDLE;BX=文件句柄 MOV CX,0;CX=移动字节数的高位字 INT 21H;读出指定记录 MOV AH,3FH;AH=3FH,读文件 LEA DX

32、,BUFFER;DX=读缓冲区首地址 MOV BX,HANDLE;BX=文件句柄 MOV CX,14;CX=希望读入的字节数 INT 21H,MOV AH,2;1)回车、换行 MOV DL,0DH;DL=回车的ASCII码 INT 21H;INT 21H的功能2,显示字符 MOV AH,2;INT 21H的功能2,显示字符 MOV DL,0AH;DL=换行的ASCII码 INT 21H MOV AH,9;显示读出的记录 LEA DX,BUFFER;DX=待显示字符串的首地址 INT 21H JMP LP1;循环接收下一记录号 EXIT:MOV AH,3EH;关闭文件 MOV BX,HANDLE INT 21H MOV AX,4C00H;结束程序 INT 21H ERR:MOV AH,2;回车 MOV DL,0DH INT 21H MOV AH,2;换行 MOV DL,0AH INT 21H MOV AH,9;显示出错信息 LEA DX,ERROR INT 21H JMP LP1;循环接收下一记录号 MAIN ENDP CODE ENDS END START,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号