读写磁盘文件.docx
《读写磁盘文件.docx》由会员分享,可在线阅读,更多相关《读写磁盘文件.docx(16页珍藏版)》请在冰豆网上搜索。
![读写磁盘文件.docx](https://file1.bdocx.com/fileroot1/2023-2/23/88f34b09-a1ae-4884-83cd-b8cc94f1e070/88f34b09-a1ae-4884-83cd-b8cc94f1e0701.gif)
读写磁盘文件
读写磁盘文件
1设计任务及要求分析
1.1设计任务及要求
要求:
建立一个文件,从文件中读255字节,显示文件内容,操作成功后显示提示GOOD,操作失败后显示提示BAD,按Q退出程序。
要求完成主要任务:
(1)方案比较及认证说明
(2)系统原理阐述
(3)硬件设计课题需要说明:
硬件原理,电路图,采用器件的功能说明
(4)软件设计课题需要说明:
软件思想,流程图,源程序及程序注释
(5)调试记录及结果分析
(6)总结
(7)参考资料
(8)附录:
芯片资料或程序清单,软件演示屏幕拷贝图或硬件实物图
1.2设计任务分析
由要求可知,本题目是一道文件读取的题目,程序主要是分两步走:
1.写文件:
建立一个文本文件,写入内容,若操作成功则显示“GOOD”,若失败则显示“BAD”,按“Q”可退出程序。
2.读文件:
从建立的文件中读取255个字节并显示内容,若操作成功则显示“GOOD”,若失败则显示“BAD”,按“Q”可退出程序。
2方案比较及认证
2.1写文件
按要求需要建立一个文件,向文件中写入内容,程序如下:
movax,data
movds,ax;目录路径名的ASCII字符串的段地址
movdx,offsetfile;目录路径名的ASCII字符串的偏移地址
movcx,0
movah,3ch;调用功能3CH创建新的文件
int21h
jcerror;创建出错,转error处
movhandle,ax;保存文件号
movbx,ax;bx文件控制字
movcx,255;cx要写的字节数
movdx,offsetbuf;dx内存缓冲区的偏移地址
movah,40h;调用功能40H实现内存缓冲区中的数据写入到磁盘文件或设备
int21h;向文件中写入255个字节内容
2.2读文件
打开创建的文件并读取文件中的前255个字符的内容,程序如下:
movax,data
movds,ax;目录路径名的ASCII字符串的段地址
movdx,offsetfile;目录路径名的ASCII字符串的偏移地址
moval,0
movah,3dh;调用功能3DH打开指定文件
int21h
jcerror;若打开出错,转error
movhandle,ax;保存文件号
movbx,ax
movcx,255;要读取的字节数
movdx,offsetbuf;内存缓冲区的偏移地址
movah,3fh;调用功能3FH从文件中读255字节→buf
int21h
jcerror;若读出错,转error
movbx,ax;实际读到的字符数送入bx
movbuf[bx],'$';在文件结束处放置一“$”符
movdx,offsetbuf
movah,9h;DOS功能调用输出一串字符
int21h;显示文件内容
movbx,handle
movah,3eh;调用功能3EH关闭文件
int21h
2.3方案比较
文件读取有4种方式:
顺序存取方式、随机存取方式、随即分块存取方式以及文件代号式磁盘存取方式。
相比于其它三种方式,文件袋好事磁盘存取方式中有关文件的各种信息都包括在DOS中,对用户时透明的,在处理指定文件时,必须使用一个完整的路径名。
对各种错误采取了更统一的处理方法,操作过程中,AX中回送错误代码,这些错误代码对所有的代号式存取功能都是相同的,为用户进行分析提供了方便。
3系统实现的原理说明
3.1程序设计思想
由设计题目“建立一个文件,从文件中读255字节,显示文件内容,操作成功后显示提示GOOD,操作失败后显示提示BAD,按Q退出程序。
”可知大致可分两步走,建立文件,读取并显示文件内容。
通过查阅资料了解到文件代号式存取方式的方法,通过DOS中断调用21H完成。
建立磁盘文件:
写一个新文件或重写一个旧文件,首先要建立文件并赋给它一个属性。
如果DOS发现要建立的文件已经存在,那么原来的文件就被破坏。
建立文件的功能调用是3CH。
写磁盘文件是利用功能调用40H,要写入的字数放在CX中,输入缓冲区的地址放在DX中。
读取磁盘文件:
读文件或设备的功能调用是3FH,要求先把文件打开取得文件代号,然后按照制定的字节数从磁盘把文件读出,读入内存中预先定义好的数据缓冲区。
如果读入的字节数大于缓冲区空间,那么这些多余的数据将送到程序所占空间之上的存储器中。
打开文件操作的功能调用是3DH,需要检查文件名是否合法,文件是否有效。
3.2程序中用到的DOS功能调用
(1)9H:
在标准输出设备输出一串字符。
调用:
AH=0AH
DS=输入缓冲区的段地址
DX=输入缓冲区的偏移地址
(2)3CH:
创建新的文件或将磁盘上已存在的文件的长度变成0。
调用:
AH=3CH
DS=驱动器和目录路径名的ASCII字符串的段地址
DX=驱动器和目录路径名的ASCII字符串的偏移地址
(3)3DH:
打开指定的文件。
调用:
AH=3DH
DS=驱动器和目录路径名的ASCII字符串的段地址
DX=驱动器和目录路径名的ASCII字符串的偏移地址
(4)3EH:
关闭指定的文件。
调用:
AH=3EH
BX=打开或创建时返回的文件控制字
(5)3FH:
将指定的文件或设备的数据读入内存缓冲区中。
调用:
AH=3FH
BX=文件控制字
DS=内存缓冲区的段地址
DX=内存缓冲区的偏移地址
CX=要读取的字节数
(6)21H:
将当前块和当前记录所表示的记录读入磁盘传送地址。
调用:
AH=21H
(7)40H:
将内存的缓冲区中的数据写入到磁盘文件或设备。
调用:
AH=40H
BX=文件控制字
DS=内存缓冲区的段地址
DX=内存缓冲区的偏移地址
CX=要写的字节数
(8)4CH:
结束当前的进程,控制返回给调用该进程的程序。
调用:
AH=4CH
AL=返回值
4程序流程图
4.1写文件程序流程图
建立文件思路为:
输入文件名→创建文件→判断文件是否存在→写入文件内容→关闭文件
图4-1写文件程序流程图
4.2读文件程序流程图
读取文件思路为:
找到并打开指定位置文件→读取文件→显示文件前255个字符→关闭文件
图4-2读文件程序流程图
5程序设计结果显示
5.1写文件程序运行结果
程序运行成功显示“GOOD”,按“Q”或“q”退出。
图5-1写文件程序运行结果
5.2读文件程序运行结果
程序运行成功显示文件前255个字符并显示“GOOD”,按“Q”或“q”退出。
图5-2读文件程序运行结果
6调试记录与分析
本程序应用的主要是DOS中断调用21H里面的功能,如9H、3CH、3DH等。
由于以前接触较少的原因,使用不熟练,出现了一些问题。
经过详细的对课本和图书馆借来的资料的了解,以及同学的帮助最终顺利的完成了程序。
通过图书馆以及上网查阅的一些资料大致了解了磁盘文件读写的框架程序的编写。
完成写文件程序的主要部分,运行的时候出现问题。
运行完成程序自动退出,未能按要求实现“按‘Q’或‘q’退出”。
查阅相关资料以后知道可以在程序开始定义“exit_message”,最后加上1H功能调用可以实现。
完成读文件程序的内容后运行程序,运行出错显示了“BAD”,查找原因。
后来发现是写入内容不足255个字符,无法读出,故出错。
后来在写文件程序里改了写入内容够了255个字符以后运行成功。
通过不断的调试、运行,我认识到编程序是需要耐心与细心才能完成的事情,磨练了我们的毅力。
7总结
课程设计的过程是综合运用所学知识的过程。
要求将课本中分布独立学习的知识,在设计中综合加以应用,从而对所学知识有更进一步的理解、巩固、和发展,并掌握在理论学习时忽略的细节和要点。
通过课程设计,提高学生综合运用所学知识分析问题、解决问题的能力,同时,通过查找、运用设计资料,完成工程设计所必备的基本训练。
本次的课程设计的题目是“磁盘文件读取”,通过老师给的资料去图书馆查阅书籍,找到了完成该题目的框架程序,就是利用DOS功能调用21H里面的几种功能实现。
同时,通过查阅资料还了解了一些其他的汇编相关的知识,强化了自己的理论知识。
整个课程设计过程应该说还是比较顺利的,框架程序确定后,回来在电脑上一步步运行,调试,知道达到要求,可以实现预订的效果。
过程中,遇到一些困难,都是通过查阅资料或请教同学解决的,无形中加深了同学之间的感情,也提升了自己的能力。
完成了课程设计,不仅仅有一种完成作业的快感,更是为自己学习的东西可以在实践中应用感到兴奋。
一次次的课程设计,不进强化了我们的理论知识,加强了我们的动手能力,让我们更深入的了解理论结合实践的重要性,不能只局限于纸上写写画画,这对我们以后的学习、工作都有好处。
总之,课程设计是我们的一门必修课,通过了它,我们以后的路才会更顺畅。
8参考文献
[1]沈美明、温冬婵编著.《IBM—PC汇编语言程序设计(第二版)》.北京:
清华大学出版社.2005
[2]索梅、郑甫京、张鹿编著.《80386/80286汇编语言程序设计》.北京:
清华大学出版社.1994
[3]周佩玲、彭虎、傅忠谦编著.《微机原理与接口技术》.北京:
电子工业出版社.2005
[4]齐志儒、高福祥编著.《汇编语言程序设计》.沈阳:
东北大学出版社.2001
[5]冯萍、史新福编著.《汇编语言与接口技术》.北京:
机械工业出版社.2002
附录:
源程序及注释
附录一:
写文件源程序及注释
datasegment;数据段开始
filedb'e:
\R_Hand.txt',0;创建文件的文件名
bufdb'Travelingtoanothercountryisoftenawelcomeadventure.Inthisunit,however,wemeetpeoplewhotakeupthechallengeofleavinghometoliveinanothercountry.First,wediscovertheproblemsfacedbyteenagersfromBrazilwhotraveltoAmericatostudy.Next,wereadaboutayounggirlonherfirsttrainrideacrossCanadaasshetravelstohernewhome.Finally,wemeetawomenwholearnsthemeaningof"asunnymorning"onherfirstdayinanewland.Thesestoriesdemonstratehowthingsarenotalwaysaseasyastheylookthegrassisnotalwaysgreenerontheotherside.'
;写到文件中去的内容
error_messagedb0ah,'BAD!
','$';出错时的提示
exit_messagedb0dh,0ah,'PressQorqtoexit,orothersto
continue!
',0dh,0ah,'$'
;按“Q”或“q”退出
messagedb0ah,'GOOD!
$';操作成功后的提示
handledw?
;保存文件号
dataends;数据段结束
codesegment;代码段开始
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movdx,offsetfile;目录路径名的字符串偏移地址
movcx,0;文件属性
movah,3ch;调用功能3CH建立新的文件int21h
jcerror;创建出错,转error处
movhandle,ax;保存文件号
movbx,ax;bx文件控制字
movcx,255;cx要写的字节数
movdx,offsetbuf;dx内存缓冲区的偏移地址
movah,40h;调用功能40H实现内存缓冲区中的数据写入到磁盘文件或设备
int21h;向文件中写入255个字节内容
jcerror;写出错,转error处
movbx,handle
movah,3eh;调用功能3EH关闭文件
int21h
jcerror;关闭文件出错,转error处
movdx,offsetmessage
movah,9h;调用功能9H显示输出字符
int21h;操作成功后显示提示
jmpend1
error:
movdx,offseterror_message
movah,9h;调用功能9H显示输出字符
int21h;显示错误提示`
end1:
movdx,offsetexit_message
movah,9h;调用功能9H显示输出字符
int21h
movah,1h;输出显示al的内容
int21h
cmpal,'Q'
jzover
cmpal,'q'
jzover
jmpstart;退出显示
over:
movah,4ch;调用功能4CH结束当前的进程,返回主程序
int21h
codeends;代码段结束
endstart
附录二:
读文件源程序及注释
datasegment;数据段开始
filedb'e:
\R_Hand.txt',0;文件名
bufdb256dup(0);文件内容暂存区
error_messagedb0ah,'BAD!
','$';出错时的提示
messagedb0ah,'GOOD!
','$';操作成功后的提示
exit_messagedb0dh,0ah,'PressQorqtoexit,orotherstocontinue!
',0dh,0ah,'$'
;按“Q”或“q”退出
handledw?
;保存文件号
dataends;数据段结束
codesegment;代码段开始
assumecs:
code,ds:
data
start:
movax,data
movds,ax;目录名段地址
movdx,offsetfile;目录名偏移地址
moval,0;表示为读取而打开文件
movah,3dh;调用功能3DH打开文件
int21h
jcerror;若打开出错,转error
movhandle,ax;保存文件号
movbx,ax
movcx,255;要读取的字节数
movdx,offsetbuf;内存缓冲区的偏移地址
movah,3fh;调用功能3FH从文件中读255字节
int21h
jcerror;若读出错,转error
movbx,ax;实际读到的字符数送入bx
movbuf[bx],'$';在文件结束处放置一“$”符
movdx,offsetbuf
movah,9h
int21h;显示文件内容
movbx,handle
movah,3eh
int21h;关闭文件
movdx,offsetmessage
movah,9h
int21h;操作成功后显示提示
jncend1;若关闭过程无错,转到end1处返回dos
error:
movdx,offseterror_message
movah,9h
int21h;显示错误提示
end1:
movdx,offsetexit_message
movah,9h
int21h
movah,1h;输出显示al的内容
int21h
cmpal,'Q'
jzover
cmpal,'q';退出显示
jzover
jmpstart
over:
movah,4ch;结束当前的进程,返回主程序
int21h
codeends;代码段结束
endstart