1、具体的设计任务及要求:1)出现提示后输入要显示的磁盘文件的路径名;2)显示一页后暂停,等待用户命令:用户输入“1”,继续显示下一页;用户输入“2”,将刚才显示的一页拷贝到指定的磁盘文件中;用户输入“3”,将刚才显示的一页从文件中删除;用户输入“0”,结束程序。3)文件显示完后显示提示信息。设计中使用的方法:1.文件代号存取方式在DOS 2.0以上的版本中,为了支持层次结构,引用了树形结构目录,因此相应增加了一个新的存取方式即文件代号存取方式(file handles access)。这种方式将有关文件的完整的路径名(path name),一旦文件的路径名被送入操作系统,就被赋予一个简单的文件代
2、号(file handle),这个文件代号是一个16位的数。以后对该文件进行读写时,就用这个文件代号去查找相应的文件。对于每一个打开的文件,DOS还为其管理一个读写指针(read/write pointer),读写指针总是指向下一个要存取的文件的字节,这个读写指针可以引动到文件的任意位置,从而能满足随机存取的要求。 2.写磁盘文件 写一个新文件或用同一个文件名重写一个旧文件时,首先要建立文件并赋给它一个属性,如果DOS发现要建立的文件已经存在,那么原来的文件就破坏。建立文件的功能调用是3CH,调用该功能时,在DX中装入ASCIZ串的地址,在CX中装入文件的属性。当写入文件操作完成后,必须用DO
3、S功能调用3EH来关闭文件,以确保操作系统将文件记录在磁盘上,这个操作只要求在BX中放入文件代号。3.读磁盘文件 调用读文件或设备功能(3FH),要求把文件打开取得文件代号,然后按照指定的字节数从磁盘中把文件读出,送入内存中预先定义好的数据缓冲区。如果读入的字节数大于缓冲区空间,那么,这些多余的数据将送到程序所占空间上的存储器中。打开文件操作(3DH)要检查文件名是否合法,文件是否有效。文件名是一个ASCIZ串,其地址装入DX寄存器,并在AL中设置存取代码。一个文件分几次读取,取决于文件的大小和输入缓冲区的空间。如果文件很大,程序中不能设置如此大的缓冲区,则必须分几次重复调用读功能,直到整个文
4、件结束。程序流程图:运行结果:在exe运行文件目录下新建yzq1.txt和空文档yzq2.txt,程序开始运行显示如下:按1翻页:按2删除:按3复制:5.设计心得: 通过此次汇编课程设计,学到了很多实际运用得上的知识,并认识到了自己动手能力的不足,过程虽然很困难,但还是收获匪浅。 在课程设计的过程中,首先认识到了汇编语言与别的高级语言的差别。汇编语言它与硬件知识联系非常紧密,要想学好汇编语言,对计算机组成原理和操作系统等课程要有一定的要求。同时,汇编语言与存储地址的对应关系是非常明了的。其次可从汇编语言的角度剖析高级计算机语言的组成,更一步了解了汇编语言在处理文件分页显示时运用到的一些基本知识
5、。这次课程设计是前面那些实验结合在一起的综合运用,并且通过这次课程设计进一步加深了我对整个汇编语言的理解和运用。最后此次实验启示我们,要善于运用所学的知识并把它运用到实际的操作中,加强自己动手动脑的能力,加强独立思考分析的能力并以此检验所学知识的是否牢固扎实,知识是否欠缺和是否有漏洞以及如何运用所学知识实现真正需求的问题。因此,在以后学习中要进一步加强运用知识解决问题和实际动手的能力。6.程序清单:;#Mode=DOSdata segment Pagesize dw ? buf_size db 80 s_buf db ? buf db 200 dup(?) names db 20 dup(?)
6、 dstname db 20 dup(? cur dw ? handle dw ? handle_cpy dw ? ;copy文件句柄 buf_tmp db 24*80 dup(? cur_tmp dw ? name_tmp db tmp,0 handle_tmp dw ? mark db ? mess_getname db 0dh,0ah,Please input filename: $ mess_getdstname db 0dh,0ah,Please input dst filename:目标文件 mess_err1 db 0ah,0dh,Illegal filename ! mess_
7、err2 db 0ah,0dh,File not found ! mess_err3 db 0ah,0dh,File read error ! mess_psize db 0ah,0dh,Page Size:$ mess_dele db 0dh,0ah,The page is deleted! mess_ok db 0dh,0ah,file opened! crlf db 0ah,0dh, mess_star db 0ah,0dh,* db 0ah,0dh,data endscode segment assume ds:data,cs:code main proc farstart: push
8、 ds sub ax,ax push ax mov ax,data mov ds,ax mov mark,0 mov Pagesize,24 mov cur,200 ;File data buffer is empty call getline ;Get file name call openf ;open the file and creat temporary file,(ax)=0 means no such file or ax,ax jnz display mov dx,offset mess_err2 mov ah,09h int 21h jmp file_enddisplay:
9、mov cx,Pagesize mov cur_tmp,0show_page: call read_block ;read a line from handle to buf jnz next2 mov dx,offset mess_err3 int 21h ;error in read.next2: call show_and_reserve;display a line in buf,and put the line in buf_tmp.(bx)returned=0means that the file reach its end. or bx,bx jz file_end ;(bx)=
10、0:at the end of file. or cx,cx jnz show_page (cx)=0:end of a page,print a line of stars. mov dx,offset mess_starthe current page has been on screen,and followed by a line of stars.wait_space: mov ah,1 cmp al, jnz psize call write_buf_tmpcommand=space,then reserve the page in temp file. jmp displayps
11、ize:p jnz copydstthe last page is reserved. call change_psize jmp stickcopydst : cmp al,c jnz delete call getdstname call opendstf or ax,ax jz stick call showmessage; call write_dst call write_buf_tmp jmp stick delete:d jnz wait_spacecommand is DELETE,the last pagenot reserved in temp file. mov mark
12、,1 mov dx,offset mess_dele mov ah,02hstick: jnz stickfile_end: call write_buf_tmp cmp mark,0 jz ok call write_tmp_back ;write the temp file backto users file.ok: retmain endpchange_psize proc near push bx push cx push dx mov dx,offset mess_psize mov ah,01 cmp al,0dh jz illeg sub al,0 mov cl,algetp:
13、jz pgot mov dl,al mov al,cl mov cl,dl ;exchange al and cl. mov bl,10 mul bl add cl,al jmp getppgot: mov dl,0ah mov ah,2output 0ah to complete the RETURN. cmp cx,0 jle illeg cmp cx,24 jg illeg mov Pagesize,cxilleg:output 0ah to complete the RETURN pop dx pop cx pop bx pop axchange_psize endpopenf pro
14、c near mov dx,offset names mov al,2 mov ah,3dh mov handle,ax mov ax,0 jc quit mov dx,offset name_tmp mov cx,0 mov ah,3ch mov handle_tmp,ax mov ax,1quit: pop bx ret openf endpgetline proc near mov dx,offset mess_getname mov dx,offset buf_size mov ah,0ah mov bl,s_buf mov bh,0 mov namesbx,0 ;insert 0 t
15、o form the asciiz string.name_move: dec bx mov al,bufbx mov namesbx,al ;move the line got into name string jnz name_movegetline endp read_block proc near cmp cur,200 jnz back mov cx,200 mov bx,handle mov dx,offset buf mov ah,3fh mov cur,0 jnc back mov cur,200back:read_block endpshow_and_reserve proc
16、 near mov bx,cur mov bp,cur_tmploop1: cmp bx,200 jl lp jmp exitlp: mov dl,bufbx mov ds:buf_tmpbp,dl ;(dl)need shown,reserveit in buf_tmp. inc bx inc cur inc bp inc cur_tmp cmp dl,1ah ;search the file end jz exit_eof mov ah,02show the (dl). cmp dl,0ah jz exit_ln ;if meets RETURN,exit. jmp loop1 ;else
17、 show another char.exit_eof: mov bx,0exit_ln: dec cxexit:show_and_reserve endpwrite_buf_tmp proc near mov dx,offset buf_tmp mov cx,cur_tmp mov bx,handle_tmp mov ah,40hwrite_buf_tmp endpwrite_tmp_back proc near mov ah,3ehclose the temporary fileclose the file giving mov al,0open the temporary file fo
18、r reading mov al,1reopen the file giving for writing mov si,1wrt_back:read a page bytes from temporary file to buf jc wrt_end mov si,ax mov cx,siwrite a page bytes from buf to the file giving or si,si jnz wrt_backwrt_end:write_tmp_back endpgetdstname proc near mov dx,offset mess_getdstname mov dstnamebx,0 ;name_move1: mov dstnamebx,al ; jnz name_move1getdstname endpopendstf proc near mov dx,offset dstname mov handle_cpy,ax jc quit1quit1:opendstf endp write_dst proc near mov bx,handle_cpywrite_dst endpshowmessage proc near mov dx,offset mess_ok showmessage endpcode endsend start
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1