您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 实验六-磁盘文件存取实验(设计性实验)
实验六磁盘文件存取实验(设计性实验)一、实验要求和目的1.理解文件、目录的概念;2.了解FCB(文件控制块)方式文件管理方法;3.掌握文件代号式文件存取方式;4.学习使用文件指针读取文件二、软硬件环境1、硬件环境:计算机系统windows;2、软件环境:装有MASM、DEBUG、LINK、等应用程序。三、实验涉及的主要知识DOS功能调用中断(INT21H)提供了两类磁盘文件管理功能,一类是FCB(文件控制块)方式,另一类是文件代号式存取方式。对于文件的管理,实际上是对文件的读写管理,DOS设计了四种存取文件方式:顺序存取方式、随机存取方式、随机分块存取方式和代号法存取方式。文件的处理步骤A)写之前必须先建立文件、读之前必须先打开文件。B)写文件之后一定要关闭文件。通过关闭文件,使操作系统确认此文件放在磁盘哪一部分,写后不关闭会导致写入文件不完整。1、文件代号式存取方式:当用户需要打开或建立一个文件时,必须提供文件标识符。文件标识符用ASCIIZ字符串表示。ASCIIZ字符串是指文件标识符的ASCII字符串后面再加1个“0”字符。文件标识符的字符串包括驱动器名、路径名和文件名。其格式为[d:][path]filename[.exe]其中d为驱动器名,path为路径名,.exe为文件名后缀。中断21H提供了许多有关目录和文件操作的功能,其中文件代号式存取方式常用的功能如下:2、操作目录的常用功能39H——创建目录3BH——设置当前目录3AH——删除目录47H——读取当前目录有关中断功能的详细描述和调用参数在此从略,需要查阅者可参阅相关资料之目录控制功能。3、用文件句柄操作文件的常用功能3CH——创建文件4EH——查找到第一个文件3DH——打开文件4FH——查找下一个文件3EH——关闭文件56H——文件换名3FH——读文件或设备57H——读取/设置文件的日期和时间40H——写文件或设备5AH——创建临时文件41H——删除文件5BH——创建新文件42H——设置文件指针67H——设置文件句柄数(最多文件数)43H——读取/设置文件属性6CH——扩展的打开文件功能四、实验内容与步骤1、编写一个创建子目录的程序,具体要求如下:1)用键盘输入一个目录路径名,若输入的字符串为空,则程序运行结束;2)若目录创建成功,显示成功信息,否则,显示创建失败信息。程序框图:源程序:DATASSEGMENTSTRING1DB'Inputanewpath:',0dh,0ah,'$'STRING2DB'Createsuccessfully.',0dh,0ah,'$'STRING3DB'Failed.',0dh,0ah,'$'BUFDB20,?,20DUP(?);路径存储缓冲区DATASENDS开始输入新目录路径路径为空将路径改为ASCIIZ字符串创建新目录CF=0是屏幕显示成功结束屏幕显示失败否是否STACKSSEGMENTSTACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AXLEADX,STRING1MOVAH,9INT21HLEADX,BUF;输入路径MOVAH,10INT21HCMPBUF[1],BYTEPTR0;判断路径是否为空JZFINISHMOVCL,BUF[1]LEASI,BUF+2ADDSI,CXMOVBYTEPTR[SI],0;将路径转为ASCIIZ字符串CLCMOVAH,39H;创建目录LEADX,BUF+2MOVCX,0INT21HJCL2;判断是否成功LEADX,STRING2MOVAH,9INT21HJMPFINISHL2:LEADX,STRING3MOVAH,9INT21HFINISH:MOVAH,4CHINT21HCODESENDSENDSTART程序结果:2、编写一个创建文件的程序,其要求如下:1)用键盘输入文件名(可包含路径),若输入的字符串为空,则程序运行结束;2)若目录创建成功,显示成功信息,否则,显示创建失败信息;3)从键盘输入20个字符存放到新建立的文件中。程序框图:源程序:DATASSEGMENTSTRING1DB'Inputanewpath:',0dh,0ah,'$'STRING2DB'Createsuccessfully.',0dh,0ah,'$'STRING3DB'Failed.',0dh,0ah,'$'STRING4DB'Writesuccessfully.',0dh,0ah,'$'STRING5DB'Writenewwords:',0dh,0ah,'$'开始输入新文件路径路径为空将路径改为ASCIIZ字符串创建新文件CF=0是屏幕显示成功结束屏幕显示失败否是否输入要写入的内容写入内容STRING6DB0dh,0ah,'$'BUFDB20,?,20DUP(?);路径存储缓冲区WRITEDB40,?,40DUP(?);写入内容存储缓冲区DATASENDSSTACKSSEGMENTSTACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AXLEADX,STRING1MOVAH,9INT21HLEADX,BUF;输入新文件路径MOVAH,10INT21HLEADX,STRING6MOVAH,9INT21HCMPBUF[1],BYTEPTR0;判断是否为空JZFINISHMOVCL,BUF[1]LEASI,BUF+2ADDSI,CXMOVBYTEPTR[SI],0;路径改为ASCIIZ字符串CLCMOVAH,3CH;创建新文件LEADX,BUF+2MOVCX,0INT21HJCL2;判断是否成功CALLSUCJMPFINISHL2:LEADX,STRING3MOVAH,9INT21HFINISH:MOVAH,4CHINT21H;子函数:正确建立输入内容SUCPROCLEADX,STRING2MOVAH,9INT21HLEADX,STRING5MOVAH,9INT21HLEADX,WRITEMOVAH,10INT21HLEADX,STRING6MOVAH,9INT21HMOVAH,3DHLEADX,BUF+2MOVAL,1INT21HMOVCX,AXMOVAH,40HLEASI,WRITE+2MOVBL,[WRITE+1]MOVBH,0MOV[SI+BX],BYTEPTR'$'LEADX,WRITE+2MOVBX,CXMOVCL,[WRITE+1]INT21HJCS1LEADX,STRING4MOVAH,9INT21HJMPS2S1:LEADX,STRING3MOVAH,9INT21HS2:RETSUCENDPCODESENDSENDSTART运行结果:3、利用文件句柄将两个文件合并成一个文件。要求:1)在第一个文件末尾处换行回车,插入“Thesecondfileasfollow:”;2)换行回车,把第二个文件内容存放在后面。程序框图:源程序:DATASSEGMENTSTRING1DB'Inputpath1:',0dh,0ah,'$'STRING2DB'Inputpath2:',0dh,0ah,'$'STRING3DB0dh,0ah,'Thesecondfileasfollow:',0dh,0ahSTRING0DB0dh,0ah,'$'STRING4DB'Successfully.',0dh,0ah,'$'PATHNAME1DB20,?,20DUP(?)PATHNAME2DB20,?,20DUP(?)FILE1DW?FILE2DW?BUFDB30DUP('')DATASENDSSTACKSSEGMENTSTACKSENDS开始打开文件1打开文件2将文件2指针移到开头读取文件2内容将文件1指针移到最后将文件2中读取的内容写入文件1结束CODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AX;打开文件1LEADX,STRING1MOVAH,9INT21HLEADX,PATHNAME1MOVAH,10INT21HLEADX,STRING0MOVAH,9INT21HMOVCL,PATHNAME1[1]LEASI,PATHNAME1+2ADDSI,CXMOVBYTEPTR[SI],0MOVAH,3DHLEADX,PATHNAME1+2MOVAL,2INT21HMOVFILE1,AX;打开文件2LEADX,STRING2MOVAH,9INT21HLEADX,PATHNAME2MOVAH,10INT21HLEADX,STRING0MOVAH,9INT21HMOVCL,PATHNAME2[1]LEASI,PATHNAME2+2ADDSI,CXMOVBYTEPTR[SI],0MOVAH,3DHLEADX,PATHNAME2+2MOVAL,0INT21HMOVFILE2,AX;移动指针MOVAH,42HMOVCX,0MOVDX,0MOVAL,0MOVBX,FILE2INT21H;读文件MOVAH,3FHLEADX,BUFMOVBX,FILE2MOVCX,30INT21H;移动指针MOVAH,42HMOVCX,0MOVDX,0MOVAL,2MOVBX,FILE1INT21H;写文件MOVAH,40HLEADX,STRING3MOVBX,FILE1MOVCX,30INT21HMOVAH,40HLEADX,BUFMOVBX,FILE1MOVCX,30INT21HLEADX,STRING4MOVAH,9INT21HMOVAH,4CHINT21HCODESENDSENDSTART运行结果:五、思考与练习以及测评标准1.有兴趣的同学考虑用子程序方法实现上述实验内容;2.文件在使用之前为何要打开?使用后为何要关闭?怎样计算文件的长度和移动文件的读写指针?打开文件用以获得文件句柄,对该文件的其他文件操作均通过文件句柄实现。关闭文件是为了释放该文件所占用的资源,如句柄、指针等。自动文件读写指针可通过DOS功能调用42H实现。计算文件长度可赋值CX,DX为0,AL为2,调用42H功能,使指针指向文件尾,以此事指针地址减去文件头地址即可算得文件长度。六、心得体会这次实验中练习了使用汇编语言对文件进行操作。有着学习c语言中处理文件的基础,我知道对文件操作的基本种类,如创建、打开、读写、关闭等。有了这些知识学习起汇编的文件处理就很容易上手。对于这方面的知识,我认为唯一较难的就是各种文件处理指令的INT代码不容易记。学会处理文件是编程的重要一个部分,掌握了这项技能就能够在今后的汇编编程中编写更为实用复杂的程序了。
本文标题:实验六-磁盘文件存取实验(设计性实验)
链接地址:https://www.777doc.com/doc-7312722 .html