实验报告607815140_第1页
实验报告607815140_第2页
实验报告607815140_第3页
实验报告607815140_第4页
实验报告607815140_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计报告( 2014 - 2015年度第 1 学期)名 称:微机原理与汇编语言程序设计课程设计 题 目: 汇编语言编程实践及电子钟设计 院 系: 班 级: 学 号: 学生姓名: 指导教师: 设计周数: 成 绩: 日期: 2015 年 1 月 18日微机原理与汇编语言程序设计课程设计评分表姓名学号实验结果(60分)电话号码本程序完善(满分6分) 显示器i/o程序设计(满分6分)中断程序设计(满分6分)发声系统设计(满分6分)键盘程序设计(满分6分)电子钟设计(满分30分)实验报告(30分)报告规范完整、符合要求,工作量大,文档逻辑性强,表述流畅(24-30分)报告较规范完整、基本符合要求,工

2、作量适中,文档逻辑性较强,表述较流畅(15-23分)报告不规范完整、不符合要求、文档逻辑性差,表述不清(0-14分)实验过程(10分)实验认真,主动性强,反映出较强的综合分析、解决问题的能力,出勤率高,无迟到早退现象(7-10分)实验较认真,较积极主动,反映出一定的综合分析、解决问题的能力,出勤率较高,较少迟到早退(4-6分)实验不认真主动,分析解决问题能力一般,出勤率低(1-3分)总成绩(0-100分)优(90-100分)良(80-89分)中(70-79分)通过(60-69分)不通过(60分)任 务 书一、 目的与要求本课程设计包含软件部分和硬件部分两个环节。软件部分:进一步熟悉汇编语言设计

3、方法和步骤,完成在有限的课内实验环节无法涉及到的具有综合设计性的软件实验,如中断程序设计、i/o程序设计、宏设计等。硬件部分:利用伟福试验设备中的8253可编程定时/计数器,8259中断控制器,8255可编程并行接口芯片和七段数码管等设计一个电子钟电路,并编制一个程序使电子钟能正常运行。 通过软硬件环节的设计和调试,巩固所学知识,增强动手能力,提高综合性工程素质。二、 主要内容软件部分:1.熟悉编程环境,完善前期电话号码本设计的功能;2.显示器i/o程序设计,完成窗口控制程序;3.中断程序设计,完成内部中断服务程序和外部中断服务程序设计;4.发声系统设计;5.键盘程序设计。 硬件部分:1.总体

4、模块设计,查阅资料,设计主程序和中断服务程序的流程;2.详细设计,完成软硬件模块的框架。3.调试,对前述工作进一步细化;4.完善功能,实现电子钟的准确运行,并进一步改进其功能;5.验收、实验报告撰写。三、 进度计划序号设计(实验)内容完成时间备注1熟悉环境,完善电话号码本设计的功能半天2显示器i/o程序设计1天3中断程序设计1天4发声系统设计1天5键盘程序设计1天6验收、实验报告总结、撰写半天7总体模块设计半天8详细设计1天半9调试1天10完善功能1天11系统验收、实验报告撰写1天四、 设计(实验)成果要求1.软件环节要求掌握各环节的设计原理、能实现各环节要求的功能。2.硬件环节要求利用相关接

5、口芯片,实现电子钟的准确运行等功能。3.总结实验,撰写实验报告。五、 考核方式实验结果(60)+实验报告(30)+实验过程表现(10)1验收:完成课程设计题目后由指导老师验收,学生汇报上机题目完成情况,回答提出的问题。2撰写课程设计实验报告:完成课程设计题目后,应认真撰写课程设计报告,报告应内容全面、格式规范。 学生姓名: 指导教师: 2015 年 1 月 18 日一、课程设计(综合实验)的目的与要求本课程设计包含软件部分和硬件部分两个环节。软件部分:进一步熟悉汇编语言设计方法和步骤,完成在有限的课内实验环节无法涉及到的具有综合设计性的软件实验,主要内容包括:1.完善前期电话号码本设计的功能;

6、2.显示器i/o程序设计,完成窗口控制程序;3.中断程序设计,完成内部中断服务程序和外部中断服务程序设计;4.发声系统设计;5.键盘程序设计。硬件部分:利用伟福试验设备中的8253可编程定时/计数器,8259中断控制器,8255可编程并行接口芯片和七段数码管等设计一个电子钟电路,并编制一个程序使电子钟能正常运行。 2、 设计(实验)正文一、软件1.完善前期电话号码本设计的功能 1.设计目的与要求(1) 要求程序建立一个可存放50项的电话号码表,每项包括人名(20个字符)及电话号码(8个字符)两部分。(2) 程序可接收输入人名及相应的电话号码,并把它们加入电话号码表中。(3) 凡有新的输入后,程

7、序应按人名对电话号码表重新排序。(4) 程序可接收需要查找电话号码的人名,并从电话号码表中查出其电话号码,再在屏幕上以如下格式显示出来。 name tel x x x x x x x x(5)除完成上述要求以外,需要增加一些新的东西,体现自己的特色。2.设计正文特色:设计时除了完成要求的之外,还设计了可以记录电话号码本中的人数,执行窗口最后会显示总人数。实现这一功能的代码为: ;添加,输出总数out_put_all_num: call crlf;调用crlf的子程序 mov ah,09h mov dx,offset string10 int 21h;功能调用,显示字符串output all n

8、umber call crlf push ax push bx push dx;压栈保护,为了避免出错 mov ah,0 mov al,name_count mov bx,10 push bx;思路为刚开始是用ascll码的转换来实现输出总数的,但因为只能输出0-9个数字,所以改为用总数不断除以10,取商来实现。again1:cmp ax,0 jz again2 sub dx,dx div bx add dl,30h push dx jmp again1again2:pop dx cmp dx,10 jz again3 mov ah,2 int 21h jmp again2again3: ca

9、ll crlf pop dx;因为求出的数从个位数开始,所以倒着出栈 pop bx pop ax;出栈 jmp exit3. 设计截图4.设计总结通过完善之前的电话号码本,不仅更加熟悉了电话号码本的原理和实现,而且还通过自己的思考,想出了如何增加一些功能使电话号码本的功能更加完善。增加的功能通过查阅资料和寻求同学的帮助得以实现。还有,谢谢老师的指导。附录:datarea segment tel_name db 21 namelen db ? namefld db 21 dup(?) ;定义20个字符的用于存放人名的字符串 tel_num db 9 tellen db ? telfld db 9

10、 dup(?) ;定义8个字符的用于存放电话号码的字符串 tel_tab db 50 dup(20 dup( ), 8 dup( ) ;定义可存放50项纪录的电话号码表 tel_sav db 28 dup(?), 13, 10, $ list db 20 dup( ), 8 dup( ), 0dh, 0ah, $ ;定义电话号码表的每个条目 string1 db input name:$ string2 db input a telphone number:$ string3 db do you want a telephone number?(y/n)$ string4 db name?$

11、string5 db would you like to input a telephone list?(y/n)$ string6 db there is no list fitting.$ string7 db name telephone $ string8 db do you want a tel_lab?(y/n)$ string9 db name_count string10 db output all number!,$ endadd dw ? swapped db 0 name_count db 0 tel_count db 0 ;计算电话号码表中的条目数量datarea en

12、dsprognam segmentstart:main proc far ;主程序 assume cs: prognam, ds: datarea, es: datarea push ds sub ax, ax push ax mov ax, datarea mov ds, ax mov es, ax cld lea di, tel_tab ;将电话号码表传给目的变址寄存器cho_inp: ;进行选择,是否输入条目 mov ah, 09 lea dx, string5 int 21h ;输出would you like to in put a telephone list?(y/n) mov

13、ah, 01 int 21h ;输入,进行选择 mov dl, 4eh cmp al, dl je sort_n ;若输入为n,则跳转至sort_n,进行电话号码表的排序 mov dl, 6eh cmp al, dl je sort_n ;若输入为n,则同上 mov dl, 59h cmp al, dl je input_n ;若输入为y,则跳转至input_n,进行电话号码条目的输入 mov dl, 79h cmp al, dl je input_n ;若输入为y,则同上 call crlf jmp cho_inp ;若输入不为y(y)/n(n),则返回cho_inp,重新进行选择input

14、_n: ;输入人名,并保存 call crlf lea dx, string1 mov ah,09 int 21h ;输出input name: call input_name ;调用子程序input_name接收人名 call stor_name ;调用子程序stor_name把人名存入电话号码表tel_tab中input_p: ;输入电话号码,并保存 lea dx,string2 mov ah, 09 int 21h ;输出input a telephone number: call inphone ;调用子程序inphone接收电话号码,并把它存入电话号码表tel_tab中 jmp ch

15、o_inp ;跳转至cho_inp,按提示选择是否继续输入条目sort_n: ;对电话号码表进行排序 call crlf call name_sort ;调用子程序name_sort,对电话号码表按人名排序print_lab: ;输出整个电话号码表 lea dx, string8 mov ah, 09 int 21h ;输出do you want a tel_lab?(y/n) mov ah, 01 int 21h ;输入,进行选择 mov cl, al call crlf mov al, cl mov dl, 4eh cmp al, dl je search_n ;若输入为n,则跳转至sea

16、rch_n,进行电话号码的查找 mov dl, 6eh cmp al, dl je search_n ;若输入为n,则同上 mov dl, 59h cmp al, dl je goon_p ;若输入为y,则跳转至goon_p,继续该部分操作 mov dl, 79h cmp al, dl je goon_p ;若输入为y,则同上 jmp print_lab ;若输入不为y(y)/n(n),则跳转至print_lab,重新进行选择goon_p: ;继续输出电话号码表的操作 call printall ;调用子程序printall,输出整个电话号码表search_n: ;查找电话号码条目 lea d

17、x, string3 mov ah, 09 int 21h ;输出do you want a telephone number?(y/n) mov ah, 01 int 21h ;输入,进行选择 mov cl, al call crlf mov al, cl mov dl, 4eh cmp al, dl je exit ;若输入为n,则跳转至exit,退出程序 mov dl, 6eh cmp al, dl ;添加输出总数 je out_put_all_num ;je exit ;若输入为n,则同上 mov dl, 59h cmp al, dl je goon_s ;若输入为y,则跳转至goon

18、_s,继续该部分操作 mov dl, 79h cmp al, dl je goon_s ;若输入为y,则同上 jmp search_n ;若输入不为y(y)/n(n),则跳转至search_n,重新进行选择 ;添加,输出总数out_put_all_num: call crlf mov ah,09h mov dx,offset string10 int 21h call crlf push ax push bx push dx mov ah,0 mov al,name_count mov bx,10 push bxagain1:cmp ax,0jz again2sub dx,dxdiv bxad

19、d dl,30hpush dxjmp again1again2:pop dxcmp dx,10jz again3mov ah,2int 21hjmp again2again3: call crlfpop dxpop bxpop ax jmp exit goon_s: ;继续查找操作 lea dx, string4 mov ah, 09 int 21h ;输出name? call crlf call input_name ;调用子程序input_name,接收人名 call name_search ;调用子程序name_search,对电话号码表按人名进行查找 jmp search_n ;跳转至

20、search_n,继续进行查找exit: ;退出程序 retmain endpinput_name proc near ;子程序input_name,用于接受人名 mov ah, 0ah lea dx, tel_name int 21h ;输入人名 call crlf mov bh, 0 mov bl, namelen mov cx, 20 sub cx, bx inc name_countnamebrk: ;将人名除外所剩下的字符用空格填满 mov namefldbx, 20h inc bx loop namebrk retinput_name endpstor_name proc near

21、 ;子程序stor_name,用于把人名存入电话号码表tel_tab中 inc tel_count ;将人名存入电话号码之后,电话号码条目数量增1 cld lea si, namefld mov cx, 10 rep movsw retstor_name endpinphone proc near ;子程序inphone,用于接受电话号码,并把它存入电话号码表tel_tab中 mov ah, 0ah lea dx, tel_num int 21h ;输入电话号码 call crlf mov bh, 0 mov bl, tellen mov cx, 8 sub cx, bxtelbrk: ;将电

22、话号码数字除外,所剩下的字符用空格填满 mov telfldbx, 20h inc bx loop telbrk cld lea si, telfld mov cx, 4 rep movsw ret inphone endpname_sort proc near ;子程序name_sort,用于对电话号码表按人名排序 cmp tel_count,1 je no_exchg sub di, 56 mov endadd, distart_sort: mov swapped, 0 lea si, tel_tabcmp_n: mov cx, 20 mov di, si add di, 28 mov a

23、x, di mov bx, si repe cmpsb jbe no_exchg call exchange_name ;调用子程序exchang_name,将两个相邻的条目进行对调 jmp no_exchgno_exchg: ;不进行对调 mov si, ax cmp si, endadd jbe cmp_n cmp swapped, 0 jnz start_sortexit_sort: retname_sort endpexchange_name proc near ;子程序exchange_name,用于将电话号码表中的两个相邻的条目进行对调 mov cx, 14 lea di, lis

24、t mov si, bx rep movsw mov cx, 14 mov di, bx rep movsw mov cx, 14 lea si, list rep movsw mov swapped, 1 retexchange_name endpname_search proc near ;子程序name_search,用于按人名在电话号码表中查找所要的电话号码 push di mov al, tel_count lea si, tel_tabagain: cmp al, 0 je no_list mov cx, 20 lea di, namefld mov bx, si repz cmp

25、sb jb find_n ja no_list dec al mov ah, 09 lea dx, string7 int 21h ;输出name tel. call crlf call printline ;调用子程序printline,输出所查找到的条目 jmp exit_schfind_n: mov si, bx add si, 28 jmp againno_list: ;若不存在该条目 mov ah, 09 lea dx, string6 int 21h ;输出there is no list fitting. call crlfexit_sch: pop di retname_sea

26、rch endpprintline proc near ;子程序printline,用于输出所查找到的电话号码条目 mov si, bx lea di, list mov cx, 14 rep movsw mov ah, 09 lea dx, list int 21h retprintline endpprintall proc near ;子程序printall,用于输出整个电话号码表 push di mov ah, 09 lea dx, string7 int 21h call crlf mov bl, tel_count cmp bl, 0 lea si, tel_tabnext: le

27、a di, list mov cx, 14 rep movsw mov ah, 09 lea dx, list int 21h dec bl jnz next jmp exit_pallexit_pall: pop di retprintall endpcrlf proc near mov ah, 02 mov dl, 0dh int 21h mov dl, 0ah int 21h retcrlf endpprognam ends end start 2.显示器i/o程序设计,完成窗口控制程序1.设计目的与要求在屏幕上开出三个窗口,它们的行列坐标如下图所示。(5,10)(15,30)(5,50

28、)(15,70)(18,15)(22,65)光标首先定位在右窗口最下面一行的行首(15,50),如果从键盘输入字符,则显示在右窗口,同时也显示在下窗口的最下面一行。若需要将字符显示于左窗口,则先按下左键,接着再从键盘输入字符,字符就会从左窗口的最下行开始显示,同时下窗口也显示左窗口的内容。当一行字符显示满后,窗口自动向上卷动一行,输入字符继续显示于最低一行,窗口最高一行向上卷动后消失。2. 设计正文本实验增加的特色为删除功能 del: mov ah,03h int 10h dec dl push dx scroll dh,dl,dh,dl,0 pop dx pos_curse dh,dl mo

29、v ry,dl jmp input 除增加此功能外,还学会了如何改变窗口内的颜色和窗口外的背景颜色:clear macro a,b,c,d ;宏指令clear 清屏 mov ah,6mov al,0 ;初始化窗口mov ch,a ;左上角行号mov cl,b ;左上角列号mov dh,c ;右下角行号mov dl,d ;右下角列号mov bh,7 ;卷入行属性;改变属性值可以改变窗口内的颜色int 10h ;bios调用,屏幕初始化endmscroll macro cont,ulrow,ulcol,lrrow,lrcol;宏指令 scroll向上卷动一行 mov ah,6 mov al,con

30、t ;上卷行数mov ch,ulrow ;左上角行号mov cl,ulcol ;左上角列号mov dh,lrrow ;右下角行号mov dl,lrcol ;右下角列号mov bh,70h ;卷入行属性 ;改变属性值可以改变窗口外的颜色int 10h ;bios调用,上卷endm3. 设计截图4.设计总结 本实验是通过软件实验设计书的指导,参考网上的资料写出来的,增加了删除功能,每一次的增加新特色,我都觉得特别有意思,不仅可以更加深入的了解实验的本质,而且还可以通过自己的努力实现不一样的功能。之前还改错了地方,不能实现颜色的改变,后来询问同学得知是改变属性值来改变窗口内外的颜色的。附录:data

31、s segmentcury db 50 ;光标初始位置curx db 15lx db 15 ;记录左窗口当前光标位置,初始化为左窗口初始位置ly db 10rx db 15 ;记录右窗口当前光标位置,初始化为右窗口初始位置 ry db 50dwx db 22 ;记录下窗口当前光标位置,初始化为下窗口初始位置dwy db 15ulrow db 0ulcol db 0lrrow db 0lrcol db 0windownum db 1datas endsclear macro a,b,c,d ;宏指令clear 清屏 mov ah,6mov al,0 ;初始化窗口mov ch,a ;左上角行号mo

32、v cl,b ;左上角列号mov dh,c ;右下角行号mov dl,d ;右下角列号mov bh,7 ;卷入行属性int 10h ;bios调用,屏幕初始化endsscroll macro cont,ulrow,ulcol,lrrow,lrcol;宏指令 scroll向上卷动一行 mov ah,6 mov al,cont ;上卷行数mov ch,ulrow ;左上角行号mov cl,ulcol ;左上角列号mov dh,lrrow ;右下角行号mov dl,lrcol ;右下角列号mov bh,70h ;卷入行属性 int 10h ;bios调用,上卷endmpostc macro y,x

33、;宏指令 postc 光标定位 mov ah,2mov dh,x ;行mov dl,y ;列mov bh,0 ;页号int 10h ;bios调用,置光标位置endmcodes segmentassume cs:codes,ds:datasstart:main proc far push dssub ax,axpush ax mov ax,datasmov ds,axclear 0,0,24,79scroll 10,5,10,15,30scroll 10,5,50,15,70scroll 4,18,15,22,65postc cury,curxinput: ;输入键盘上的字符mov ah,0i

34、nt 16h ;bios调用,从键盘读字符,ah=扫描码cmp ah,4bh ;判断输入字符是否为左向键jnz no_leftpostc ly,lxmov windownum,2 jmp inputno_left:cmp ah,4dhjnz no_right ;判断输入字符是否为右向键postc ry,rxmov windownum,1 jmp inputno_right:cmp ah,01 ;判断输入字符是否为esc jz exit ;在正确的窗口打印字符 mov ah,0ah mov bh,0 mov cx,1 int 10h postc dwy,dwx mov ah,0ah mov bh

35、,0;在下窗口输出 mov cx,1 int 10h inc dwy;判断下窗口是否上卷 cmp dwy,65 jle isright scroll 1,19,15,22,65 mov dwy,15isright: ;判断是否在右窗口 cmp windownum,1 jnz displeft dispright: ;判断右窗口是否上卷 inc ry cmp ry,70 jle rightexit scroll 1,6,50,15,70 mov ry,50 开始rightexit: ;右窗口输出 postc ry,rx jmp inputdispleft: ;判断左窗口是否上卷 inc ly c

36、mp ly,30 jle leftexit scroll 1,6,10,15,30 mov ly,10leftexit: ;左窗口输出 postc ly,lx jmp inputexit: mov ah,4ch int 21hmain endpcodes endsend start3. 中断程序设计 1.设计目的与要求(1).编写一个内部中断服务程序使其能够显示以“0”结尾的字符串利用显示器功能调用int 10h。字符串缓冲区首地址为入口参数利用dsdx传递此参数。 (2).编写一个可屏蔽的外部中断服务程序中断请求来自8259a的irq0在新的外部中断服务程序新08h中断中使得每55ms的中断

37、在屏幕上显示一串信息“a 8259a interrupt”显示10次后恢复原中断服务程序返回dos。 2.设计正文(1) 内部中断内部中断没有做什么改变,是按照书上的例子输入的,实现的功能也同书上。 ;80h内部中断服务程序;显示字符串(以0结尾);入口参数:ds:dx=缓冲区首地址new80hproc ;过程定义sti ;开中断push ax ;保护寄存器push bxpush simov si,dxnew1:mov al,si ;获取欲显示字符串cmp al,0 ;为0结束jz new2mov bx,0 ;用rom-bios调用显示一个字符mov ah,0ehint 10hinc si ;

38、 显示下一个字符jmp new1new2:pop si ;恢复寄存器pop bxpop axiret ;中断返回new80hendp ;中断服务程序结束(2) 外部中断增加的功能其实和电话号码本的计数功能很相似,是在出现中断之前,先实现256次计数功能,在出现10次中断,实际出现的中断总数为255,最后一次256不显示。计数的部分代码为:out_put_counter: call crlf mov ah,09h mov dx,offset string int 21h call crlf push ax push bx push dx mov ah,0 mov al,counter mov b

39、x,10 push bxagain1:cmp ax,0jz again2sub dx,dxdiv bxadd dl,30hpush dxjmp again1again2:pop dxcmp dx,10jz again3mov ah,2int 21hjmp again2again3: call crlfpop dxpop bxpop ax 3.设计截图内部中断外部中断 4.设计总结通过本次中断的实验,让我了解了很多在课堂上没怎么学会的中断,更加深入的明白中断的实现到底是怎么回事。外部中断的实现中加入了计数功能。每一次不同的实验,增加不同的东西,让我受益匪浅。附录:datas segment ;此

40、处输入数据段代码string db start count:$intmsgdba 8259a interrupt ! ,0dh,0ah,0counterdb 0 datas endsstacks segment ;此处输入堆栈段代码stacks endscodes segment assume cs:codes,ds:datas,ss:stacksstart: mov ax,datas mov ds,ax ;此处输入代码段代码 mov ax,3508h int 21h push es push bx cli push ds mov ax,seg new08h mov ds,ax mov dx,offset new08h mov ax,2508h int 21h pop ds in al,21h push ax and al,0feh out 21h,al mov counter,0 sti out_put_counter: call crlf mov ah,09h mov dx,offset string int 21h call crlf push ax push bx push dx mov ah,0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论