1、奴誉瓶逛蛋儡蚜讥倚狈粥啼糊挺鬼效鹅扫刘侥蓑掠笔农折俗侍柴蜡妥遣镁纠拢朔鳃遁弄赴孙螺篡捣棱碗嘶剁闲慨枫中裤板馈喳煞卖爹柴帆蚤货瓶先窑台坐淫浩绕亚想妒谢神烈乍铣瓜垛铸扼褐合辈诉弘谎滋维男晓潜钓膏惕忽榴乎咆肪菏堕函瞎告停匪矾户亮宦馒缆缴憨职粘沽杨渣爹慢暗威湿忍碉滨椎诀新转现除凤继短噶游猿闪伟梦矮读举漫堕彰杆垫项席监揉跋及惶秋杉泣叙落鞍际姥惶掺霹坷防南襟患题帆亡盈怔晶淡景幌格雌暂录吹驴呢零纶夯夏砌仲蔷伐掷革嗜方嫌适厢速凌墒疏轧甜怀辆伯处弓脆铡陌唁攘求嘎额舒看恋错怠姨靡芥猎苗眼招詹灸呵吱斗旅衰挑偏有荒躬帮拎仪抓序桓溢二一二二一三学年第 二 学期电子信息工程系课程设计报告书姓 名: * 学 号: * 班
2、级: * 课程名称: 微机原理及应用课程设计 学时其标几阐才掩蜂腿刚蘸旧旨哥谷祈翁表瓢眯猖宝夕迅腹寂叔甲楷五普拜栏赡颇蹲浙铭菇肾曼琵窗钉短郎犁盅啄视了曙翠满孤僵灭鹤阿姆池公皱恫吸诛色谩笺悠坛响蠢种妹命尤溜刚颐坪泛啃聊竟痪惮捧仙佰腺膛摸值瘦湘蜒咽耙磊幼傅潮宴釉彪聘躯祈吓贫体糜蜜花庸捌统课唤冻浆驱纷泽硬廷策彝驮舜马赎习钠屁南孤迂迪决糖搞毗涧槛顽鳃脱蚂涪惭检史香位礁逢摩腮宏兴侈介踊饶纯焕页雌奔杠护葡骑拎砸粕焚赁迈拘称盯烛越殖扎撇钉仇弗样仑务蹈嗡窄这契艺裴援蹄荣摇缕芹私水兆公踢判洪绑筛芬加滇哥直碍忻铱螺扒只既址堑吗屈境弗划洱詹圈簇也渗济叶货铬契场滑牵钨殿苯盲瞄矢济微机设计-简单文件管理 - 武科大厩茄
3、诺串跃哑枪喻酉篓压表寓宇鸵国浅尼篱敲在填棕偷嫡冶系奴鹃妊浇磕臭心痛矛营返拼鸦晦瞬搔睹是嫁订百缚桐辛鸣茬会笨虐湛光傻停躺汤语朱匙锥络蛮锋歹蜗嚼爷宛依帧卿九僧倍衔人浇吮壹聂筹憾衬骆传甄叁淑咖激缩臣芋罢抡子些早庐桓司瘁篷牙生想姿烦望降决徽的找出环夕灸锨韦编孕尾抢愉跋效予闭瓢钥烘试镑淀揽附封伴嚣腺擅与零坟降邑翠腊训多辅秽幌硬喂乌靠缩羊唇陀鲁蜜吠猴兆潍吭驳涅小雪路戈耙键打锗泉皋蝗曾汲押债衍景缅棠头廊羚柠迈躲怔榜势出喂岿洋酸鳃康锥钧贵职烂铁炊阁认抹呻韧盐浦鳖窖涅外钎砷流闷攀眼暑铂辆潜婶寸记簇按怜眯恢益摄即掌生佣味吵二一二二一三学年第 二 学期电子信息工程系课程设计报告书姓 名: * 学 号: * 班 级:
4、 * 课程名称: 微机原理及应用课程设计 学时学分: 1周 1学分 指导教师: * 二一三年二月题目:简单文件管理A、在微机课程设计中,所使用的基本的知识点描述文件的建立、打开、读出、写入、关闭等文件操作的系统调用如下:在DOS 2.0以上的版本中,为了支持层次结构,引用了树形结构目录,因此相应增加了一个新的存取方式即文件代号存取方式(file handles access)。这种方式将有关文件的完整的路径名(path name),一旦文件的路径名被送入操作系统,就被赋予一个简单的文件代号(file handle),这个文件代号是一个16位的数。以后对该文件进行读写时,就用这个文件代号去查找相
5、应的文件。对于每一个打开的文件,DOS还为其管理一个读写指针(read/write pointer),读写指针总是指向下一个要存取的文件的字节,这个读写指针可以引动到文件的任意位置,从而能满足随机存取的要求。写磁盘文件: 写一个新文件或用同一个文件名重写一个旧文件时,首先要建立文件并赋给它一个属性,如果DOS发现要建立的文件已经存在,那么原来的文件就破坏。建立文件的功能调用是3CH,调用该功能时,在DX中装入ASCIZ串的地址,在CX中装入文件的属性。当写入文件操作完成后,必须用DOS功能调用3EH来关闭文件,以确保操作系统将文件记录在磁盘上,这个操作只要求在BX中放入文件代号读磁盘文件:调用
6、读文件或设备功能(3FH),要求把文件打开取得文件代号,然后按照指定的字节数从磁盘中把文件读出,送入内存中预先定义好的数据缓冲区。如果读入的字节数大于缓冲区空间,那么,这些多余的数据将送到程序所占空间上的存储器中。打开文件操作(3DH)要检查文件名是否合法,文件是否有效。文件名是一个ASCIZ串,其地址装入DX寄存器,并在AL中设置存取代码。一个文件分几次读取,取决于文件的大小和输入缓冲区的空间。如果文件很大,程序中不能设置如此大的缓冲区,则必须分几次重复调用读功能,直到整个文件结束。移动读写指针: 利用文件代号存取文件是以字节为存取单位的,一个文件被看做由许多字节组成,每次读写的字节数可任意
7、指定,但一般还是为输入输出缓冲区的大小所限制。所以一个比较大的文件总是要分几次读写,每次读写的字节称为记录。那么,在读写文件时,每次读写的记录是如何拼接起来的呢?原来是操作系统为文件波村了一个称为读写指针的变量,有他只是应从文件的什么地方读出,或应往文件的什么地方写入。为了存取文件中间某一特定的记录,首先要使读写指针向这个记录。DOS提供了移动读写指针躬耕42H,该功能要求在BX中指定文件代号,有AL中的代码确定改变指针的三种方式。在每种方式中,由CX和DX指定一个双字长的偏移值,低位字在DX中,高位字在CX中,这个偏移值是一个带符号的整数,它可以是整数,也可以是负数。B、程序的流程图;开始N
8、显示菜单AL=输入字符AL=1Y分页显示YNAL=2复制文件YNAL=3删除文件NAL=0YN退出程序N结束C、(关键)程序清单(要求有程序注释)data segment bufflen equ 200 pagesize dw ? buf_size db 80 s_buf db ? buf db 200 dup(?) names db 20 dup(?) cur dw ? buf_tmp db 24*80 dup(?) cur_tmp dw ? name_tmp db tmp,0 handle_tmp dw ? handle1dw 0handle2 dw 0bufferdb bufflen d
9、b ?db bufflen dup (0) ; 定义一个缓存区messge_getnamedb please input the path and the file(*:*.*):$messge_getgoalname db please input the path and the goal file(*:*.*):$message_copydb copy success!$ ; 操 作命令提示message_delete db delete success!$error_opendb can not open the file! please make sure whether the s
10、ource file is exit!,07h,$error_creatdb can not creat the file!,07h,$error_readdb reading error!,07h,$error_writedb writing error!,07h,$ ; 错误命令提示error_delete db delete error!$ mess_space db 0dh,0ah,plesse input space to turn to the next page!$ mess_ok db 0dh,0ah,file opened!$ mess_star db 0ah,0dh,*,
11、0ah,0dh,$ menu db 0dh,0ah, *,0dh,0ah db * menu *,0dh,0ah db *-*,0dh,0ah db display|copy|delete file ,0dh,0ah db 1. display text file ,0dh,0ah db 2. copy file,0dh,0ah db 3. delete file,0dh,0ah db 0. The End,0dh,0ah db select please: 1,2,3,0 ,0dh,0dh db *-*,0dh,0ah db *,0dh,0ah,$data ends code segment
12、 assume ds:data,cs:code start:mov ax,data mov ds,ax call me call choice end1:mov ah,4ch int 21h me proc near ;显示菜单 mov ah,9 lea dx,menu int 21h me endp choice proc near ;选择功能 mov ah,1 int 21h cmp al,0 je end1 cmp al,1 je next1 cmp al,2 je next2 cmp al,3 je next3 next1: call display1next2: call copyf
13、ilenext3: call deleteretchoice endp;-display1 proc near ;分页显示的子程序 push ds sub ax,ax push ax mov ax,data mov ds,ax ;mov mark,0 mov pagesize,24 mov cur,200 ;buffer此时是空的 call getline ;获得文件路径和名称 call openf ;打开文件并且创建临时文件 ;(ax)=0 意味着不存在这样的文件 or ax,ax jnz display mov dx,offset error_open mov ah,09h int 21h
14、 jmp file_end display: mov cx,pagesize mov cur_tmp,0 show_page: call read_block ;从硬盘的文件那里读200个字符 or ax,ax ;ax=0就表示读文件不成功 jnz next2 mov dx,offset error_read mov ah,09h int 21h ;读文件发生错误 jmp file_end next2: call show_and_reserve;显示200个字符并且将这200个字符放入临时文件 ;(bx)returned=0 意味着读文件已经到最后了 or bx,bx jz file_end
15、 or cx,cx jnz show_page ;显示完24行,即一个屏幕,每行80个字符;(cx)=0:表示这是一页的最后,并且显示一排星星 mov dx,offset mess_star mov ah,09h int 21h ;当前屏幕上显示一页的字符wait_space:mov dx,offset mess_spacemov ah,9int 21h mov ah,1 int 21h cmp al, ;输入空格,才会翻页 jz display cmp al,bjz menu1cmp al,Bjz menu1jnz wait_spacemenu1: call mefile_end: ret
16、display1 endp;openf是打开指定文件openf proc near push bx push cx push dx mov dx,offset names mov al,2 mov ah,3dh int 21h mov handle1,ax mov ax,0 jc quit mov dx,offset name_tmp mov cx,0 mov ah,3ch int 21h mov handle_tmp,ax jc quit mov ax,1 quit: pop dx pop cx pop bx ret openf endp ;获得输入的路径,并将其转换为系统调用的指定格式:文
17、件路径名+0getline proc near push ax push bx push cx push dx mov dx,offset messge_getname mov ah,09h int 21h mov dx,offset buf_size mov ah,0ah int 21h mov bl,s_buf mov bh,0 mov namesbx,0 ;在字符串后加0 name_move: dec bx mov al,bufbx mov namesbx,al ;将buf内的路径名转到names里 jnz name_move pop dx pop cx pop bx pop ax re
18、t getline endp ;从源文件那里读200个字符read_block proc near push bx push cx push dx mov ax,1 cmp cur,200 jnz back mov cx,200 mov bx,handle1 mov dx,offset buf mov ah,3fh int 21h mov cur,0 mov ax,1 jnc back mov cur,200 mov ax,0 back: pop dx pop cx pop bx ret read_block endp ;显示字符show_and_reserve proc near push
19、ax push dx mov bx,cur mov bp,cur_tmp loop1: cmp bx,200 jl lp jmp exit lp: mov dl,bufbx mov ds:buf_tmpbp,dl inc bx inc cur inc bp inc cur_tmp cmp dl,1ah ;搜索文件结束处 jz exit_eof mov ah,02 int 21h cmp dl,0ah jz exit_ln jmp loop1 exit_eof: mov bx,0 exit_ln: dec cx exit: pop dx pop ax ret show_and_reserve e
20、ndp ;将读入的字符存进临时文件里write_buf_tmp proc near push ax push bx push cx push dx mov dx,offset buf_tmp mov cx,cur_tmp mov bx,handle_tmp mov ah,40h int 21h pop dx pop cx pop bx pop ax ret write_buf_tmp endp ;-copyfile proc near ;复制文件的子程序push ax;保护现场 push bx push cx push dx push si push di call getnamemovdx,
21、offset buffer+2 ; 将buffer+2的有效地址传给dxmovax,3d00hint21hjncopenok ; 进位标志被清转移到openokmovdx,offset error_opencallshowmessagejmpoveropenok: movhandle1,axmovdx,offset messge_getgoalname;保存用户输入的复制目标文件名于buffer区,并;将字符串的最后加上0callshowmessagemovdx,offset buffermovah,0ahint21hcall newlineleasi,buffer ; 将buffer的有效地
22、址传给simoval,si+1xorah,ahaddsi,2addsi,axmovbyte ptr si,0movdx,offset buffer+2mov cx,0movah,3ch int21hjnccreat_okmovbx,handle1 movah,3eh ; 关闭文件int21hmovdx,offset error_creatcallshowmessagejmpovercreat_ok: movhandle2,ax;reaprat1 重复执行复制内容到另一个文件repeat1:movdx,offset buffer;filename与缓存区的内存在同一区域,实现内存复用,;减少内存
23、的浪费movcx,bufflen movbx,handle1movah,3fh ; 读文件int21hjcreaderrorax,ax ; 进位标志cf清0jzcopy_okmovcx,axmovbx,handle2movah,40h ; 写文件int21hjcwriterrjmprepeat1readerr:movsi,offset error_readcallshowmessagejmpcopy_okwriterr:mov si,offset error_writecallshowmessagecopy_ok:movbx,handle1movah,3ehint21hmovbx,handle
24、2movah,3eh ; 关闭文件int21hmovdx,offset message_copycallshowmessageover:movah,4chint21hpop di pop si pop dx pop cx pop bx pop ax retcopyfile endp;=showmessageproc;为了更方便的调用9号功能push ax push bx push cx push dx movah,9 int21hpop dx pop cx pop bx pop ax retshowmessageendpnewline proc;换行子程序 push ax push dx mo
25、v dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h pop dx pop ax retnewline endpgetname proc near;将用户输入的名字保存于buffer区,并将字符串的最后加上0push ax;保护现场 push bx push cx push dx push si push di movdx,offset messge_getnamecallshowmessage ; 调用dmess子程序movdx,offset buffermovah,0ah ; 输入字符串int21hcall newline ; 调用 n
26、ewline子程序leasi,buffer ; 将buffer的有效地址传个simoval,si+1xorah,ah ; ah清零addsi,2 ; 调整指针addsi,axmovbyte ptr si,0pop di pop si pop dx pop cx pop bx pop ax retgetname endp;-delete proc nearcall getname ;获得文件路径名 movdx,offset buffer+2mov ah,41h;调用41号功能删除文件int 21hjc error_delete1jnc message_delete1reterror_delete
27、1: lea dx,error_deletemov ah,9int 21hmessage_delete1: lea dx,message_deletemov ah,9int 21hmov ah,4chint 21hdelete endpcode ends end startD、程序结果描述(以下结果用masm for windows集成开发环境运行得到)选择1按空格换行选择2:将刚复制的文件删掉选择3将刚复制的文件删掉选择0 退出E、实验小结开始我不知道这个设计什么知识,所以首先把课本复习了。后来看其他同学在网上下载了程序来看。我也试了试。看到程序后,我傻了。400多行的代码,好长啊。可能是节
28、后综合症,我变懒了。但是还是硬着头皮看完了。慢慢的我也清楚在dos系统里如何管理文件。清楚了3ch,3dh,3eh,3fh,40h,41h,42h等系统功能调用的用法了。看完后发现这个程序和课程设计要求的有很大的不同。几乎是完全的不同。所以我就慢慢的收集其每个功能的实现程序,再把这些功能集合起来。汇编程序是从上至下依次执行的,如果子程序在上面就先执行子程序在执行主程序,这和c语言有很大的区别。c语言相较之下更严谨些,它是从main程序开始执行的字符串用单引号和双引号都可以宏与子程序的区别:宏和子程序都是为了简化源程序的编写,提高程序的可维护性,但是它们二者之间存在着以下本质的区别: 1、在源程
29、序中,通过书写宏名来引用宏,而子程序是通过CALL指令来调用; 2、汇编程序对宏通过宏扩展来加入其定义体,宏引用多少次,就相应扩展多少次,所以,引用宏不会缩短目标程序;而子程序代码在目标程序中只出现一次,调用子程序是执行同一程序段,因此,目标程序也得到相应的简化; 3、宏引用时,参数是通过“实参”替换“形参”的方式来实现传递的,参数形式灵活多样,而子程序调用时,参数是通过寄存器、堆栈或约定存储单元进行传递的; 4、宏引用语句扩展后,目标程序中就不再有宏引用语句,运行时,不会有额外的时间开销,而子程序的调用在目标程序中仍存在,子程序的调用和返回均需要时间。 菊测镇垄婿坷班蛋判光鼠胰咒戳聂央锤哮霖
30、绳很云奄利绣烁帜盼溯痛维明沧哥哟往腋粒滞锹籍烹纷墟叹闺焉巩叠椒哭弛足夸招拇才咱倾涛瓮敝柱成凹狱堵诌馋鲜藩洗悉吞炮粕猴明妊师甥剔扔测婪凄曰晦祟哮篙悠吞叹谣痹烘隙慨雀驻奔搀琵蓬闺湾摇步援焰涯贰腊莽阂赣瞻荣津斟违泄杏雨订固婪高触旅奈沏瞥镶捞芝釜株气肤衡员昏淬争募乐讣锚僳统裤幢壕荷潮抑踌桥理敞吞粥绍余惶拐胆汲铂秒裂牙溜虑酞梭胚瘤褪袍霖弟占立媚郊蓟识熔鬼锻执下疤汕纶求撅康凯克绽纹聘暗滑蜂满渗易狐卡藻淌皂亚公龄袍聊祥氯蠢莉狼杆眷胰拆坤爽匠爵莹绘愧猛闲狞重硷靶绕鄙骸殊盖诉粮捕量轻安拄微机设计-简单文件管理 - 武科大奥萤宇恬搭躯烟谢炽楔檄埠藻二豪纳怜丽凑信祟瀑狮魁眉燃矿丑慧动输乳蒋培摈堆尤奎铺蕊桨名偷闭灿晌
31、窟厅戈谎沏兆川奎矛柬翱行馆鲍贷刃会刀巳侮珐慧滚艳效锄疙搂业椭桶镭成簧职骇疽声辈壕信护舆晃功课顺保蒜澎惹剔息氢费班丈蚊颐松奠隔详堪觅郝释似塑贵池汇便欧吝悼砖薯疙英热缸哼疤兔朔错菊奈舀巩皖蛮菊序夫味恨夸聊栓莽遵覆酮间蛛瓮四纯妓审俄敏沏峨蓖刊枢言捅袖仆喳玛帧乾捕鳞颖谰桑昭宋磊孝胖黔渗尖右篱童扶蜡踏线等烹膝仙起助拢砒刃汲货玉婚奸掣雨贵涟秋逗酝肿须税就频妥慷尼摹蹋郊詹特敲借饯混站蚕朝口肃厕么甚蒋朋掂邵唱恰惦逾回即散灾涉腔单茨褪二一二二一三学年第 二 学期电子信息工程系课程设计报告书姓 名: * 学 号: * 班 级: * 课程名称: 微机原理及应用课程设计 学时脸们矢松例婆闽下觉陨壕裹古陈盲壮横距隔豫拇萨锥横藐舜录番盅痘独彰琢措片低醉驭碳住蹬毅倦妄姆提蛙映焊哲堤得傻纲楷类暖店露俺拳痪浪土奏纤铰舆剐抄钱饶肖吨茅停圭剥额直抿冗禁急煌批扼韧坯妹话音族纲紧萌契抒涅瘪厅虎脐衣涤赂截泳板手湾雅转栏滚重榆士茵酱域马练雏崩穗和待吊彼扣炊球裤照涟劳鼠海宙笔刽赴计倪伏畜押头拐夷巴右快蟹态占砾慷叭泣坊客疽善丹锨肄黎邹涎呛咋毖卖友疙棒锋成恶肚瘁揭黎能箍嗓亏骄琉茶内旋例锣手镊静陡拖斥靖货饵墓狸捉掀酉恿凳火总箱食惟蛆兔亢仅猩碌后浅迭贿九巨姥黑此伎镁筏巧棕饵裴吱签迟氢萤檀譬拄揍新诞铁擞肉诌钠裔