《微机原理与接口技术》课程设计说明书钟表显示汇编语言程序设计_第1页
《微机原理与接口技术》课程设计说明书钟表显示汇编语言程序设计_第2页
《微机原理与接口技术》课程设计说明书钟表显示汇编语言程序设计_第3页
《微机原理与接口技术》课程设计说明书钟表显示汇编语言程序设计_第4页
《微机原理与接口技术》课程设计说明书钟表显示汇编语言程序设计_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、钟表显示汇编语言程序设计1 设计目的与要求1.1设计目的:(1)理解掌各个中断的使用方法,通过对一些较大程序的编写,加深对汇编语言的认识,尤其是对中断的理解。(2)掌握一定的汇编语言知识,培养自己的动手操作能力,同时培养学生应用计算机解决实际问题的能力。(3)学习程序设计的基本思路和方法。1.2 设计要求: 设计汇编语言程序,实现系统时间显示功能,具体功能要求如下: (1)设计一个界面显示系统方框。 (2)单击“t”键显示本机系统的时间。 (3)单击“esc键退出程序。1.3 程序内容第一部分:定义显示界面。第二部分:调用系统时间,并将调用的用二进制表示的时间数转换成ascii码,并将时间数存

2、入内存区。第三部分:将存在系统内存区的时间数用显示字符串的形式显示出来。第四部分:获取键盘的按键值,以esc键退出系统返回dos。2 总体方案论证这次的任务,一共设计了两种方案。方案一主要是调用2ch号dos中断读系统时间,把各相关寄存器中的内容转换为十进制ascii码输出,分别将小时数、分钟数、秒数存入显示缓冲区,调用dos字符串显示功能将时间显示出来,然后定位光标的开始位置,结合着将时间显示在我们预先定义好的位置上。方案二同样调用2ch号dos中断读系统时间,只是方案二简单点,没有把小时数、分钟数、秒数分开,直接将系统当下的时间存入了显示缓冲区,调用dos字符串显示功能将时间显示出来,然后

3、定位光标的开始位置,结合着将时间显示在我们预先定义好的位置上。经过对比,我觉得方案一好点们虽然复杂一些,但是大体的思路很清楚。 总体思路就是调用2ch号dos中断读系统时间,把各相关寄存器中的内容转换为十进制ascii码输出,分别将小时数、分钟数、秒数存入显示缓冲区,调用dos字符串显示功能将时间显示出来,然后定位光标的开始位置,结合着将时间显示在我们预先定义好的位置上。由于获取了的系统时间不会自动刷新,所以我们要设计成循环的方式来不断获取系统的时间,这样就形成了会跳动的电子钟了。程序一旦进入运行,就会显示一个精美的方框,显示按键提示,按t就将不间断地在显示屏显示时间,要想程序停止运行,可同时

4、在键盘按下esc键退出。在本程序中,时钟的精确度为秒。其中dos调用功能中,编号为2ch的功能是取时间,出口参数:cx:dx=时间。程序中会有四个子程序:子程序bin100ut 功能:把二进制数转换为十进制ascii码输出;子程序stdout 功能:标准输出一个字符;子程序clrscr 功能:清屏;子程序setcurs 功能:设置光标位置。2.1 子程序bin10out子程序bin100ut的功能就是把二进制数转换为十进制ascii码输出。基本原理:首先要完成二进制到十进制数的转换,一般采用“除10取余”法来完成,其大致过程如下:将待转换的数(在ax中)除以10,得到第一个商和余数,此第一个余

5、数就是所求的十进制数的个位;再用第一个商除以10,得到第二个商和余数,此第二个余数就是所求十进制数的十位;重复这一过程直至商为0,此时的余数就是所求十进制数的最高位。在内存中分配一缓冲区,用来存放以上分离出来的十进制数的每一位,然后再逐个转换成ascii码,转换成ascii码的过程很简单,就是给每个十进制位加上30h即可;最后送显示器输出。从转换的过程可以看出,先分离出来的是十进制数的低位,要后显示;后分离出来的是十进制数的高位,应该先显示。因此在编程时,我们可以利用堆栈操作中“先进后出、后进先出”的特性,当分离出各十进制位时依次入栈,要逐个转换成ascii码送显示时依次出栈。 子程序bin1

6、00ut流程图如图2-1所示。 图2-1 子程序bin100ut流程图2.2子程序stdout 子程序stdout的功能是显示输出。在编写这一段程序时,我用到了int 21 02h号中断,int 21的功能是系统功能调用,入口参数:ah=调用号。编号02h的功能就是显示输出,入口参数:dl=输出字符。一旦了解了这一功能,显示输出子程序便可解决,程序如下所示。程序:stdout proc push dx mov dl,al mov ah,2 int 21h pop dxretstdout endp 子程序stdout流程图如图2-2所示。 图2-2 子程序stdout流程图2.3子程序clrsc

7、r子程序clrscr的功能是清屏。在子程序clrscr中,我用到了显示器驱动程序(int 10h)中ah=6的功能。ah=6的功能是当前页上滚,入口参数:al=行数,(从窗口底部算起,空白的行数);al=0为整个窗口空白;(ch,cl)=滚动区域的左上角行、列;(dh,dl)=滚动区域的右下角的行、列;bh=空白页的属性。以上是对int 10 ah=6中断的简述,在本课题中用到清屏程序是为了使屏幕显示更加美观,同时改变bh的数值,便可改变字体颜色,程序中即让ax=0600h,左上角的行列号为(ch,cl)=(0,0),右下角的行列号为dx=184fh。其实在这里也可以用到ah=7的功能,它们的

8、功能都是初始化屏幕或滚屏,ah=6为向上滚屏,ah=7为向下滚屏,其它功能一样。子程序clrscr流程图如图2-3所示。 图2-3 子程序clrscr流程图2.4子程序setcurs子程序setcurs 的功能是设置光标位置。在子程序setcurs中,我用到了显示器驱动程序(int 10h)中ah=2的功能。ah=2的功能是设置光标位置,入口参数:(dh,dl)=行、列;bh=页号(图形模式为0)。为了使显示的时间在dos屏幕中的中间显示,dx设置为0a24h,即dh=0ah,dl=24h,就是在0ah行,24h列。如果想改变时间显示的位置,只要改变dx的数值就可以达到目的。由于在第零页中定位

9、,可用sub bh,bh来完成此操作。子程序setcurs流程图如图2-4所示。 图2-4 子程序setcurs流程图综上所述,为系统显示时钟的几个重要子程序,缺一不可,但实现这些功能其实还有很多其它中断可以完成,在这里不一一介绍。课程题目中设计通过点击esc键退出程序,在这里简单介绍一下,首先要用到int 21 0bh号中断,改中断的功能是检查标准输入状态,出口参数al=00无键入,al=ff有键入。同时还要用到int 21 08h号中断,该中断的功能是键盘输入字符(无回应显示),出口参数:al=输出字符。在此设计中要求点击esc键退出,先在ascii码表中查询esc的ascii值,查表得1

10、bh,即al=1bh。退出程序(exit)用的是int 21 4ch号中断,该中断的功能是终止当前程序并返回调用程序,入口参数:al=退出码。通过以上的几个功能调用就可以实现点击esc键退出程序的功能。 3 主程序流程图 主程序流程图如图3-1所示。 图3-1 主程序流程图主程序将几个子程序有效的结合在一起,其中要注意的是最后一步(点击esc退出),因为如果设计不好循环,会影响系统提取时间,导致时间停止不走动,综上所述,便基本完成了设计要求。4 调试过程(1)编译汇编源文件,命名为徐联杏.asm。(2)asm将生成一个obj文件,如果有程序有错误,则提示不能生成obj文件,那么就要检查源程序中

11、的错误,并改正。(3)点击连接,然后点击运行,即可显示结果。结果如图4-1所示。 图4-1 程序运行结果(4)如果要退出程序,点击esc键即可。分析:调试屏幕上显示的提示语与系统时间的位置都可通过前面介绍的内容来改变,点击esc键退出也可改变,同时字体颜色也可选为自己喜欢的颜色。5 编程时遇到的问题及解决方法在课程设计中遇到的最大的困难是如何产生中断,用什么形式的中断实现功能,对中断向量表的装载还比较模糊,对中断的初始化、具体设置、中断返回还不是很清楚,程序设计一度陷入停滞状态,不知如何是好。我们又重新翻阅了周佩玲主编的微机原理与接口技术及网上的很多关于中断的介绍与例题,重点研究了中断过程,通

12、过对这一内容的学习,我们终于对中断有了详细的认识,在设计程序时也容易了很多,最后在设计退出程序的时候也遇到了一点困难,设计的程序可以点击esc键退出,但时间却不走动了,但通过对程序的修改与调试,最后加入循环后便解决了这一问题。6 心得体会这次课程设计历时两周,从中发现了自己很多问题,看见自己的知识有很多漏洞,虽然做过微机原理实验,但实际经验还是很缺乏。说到设计,很多人都有恐惧感,但我一听见设计就很高兴,当看到自己设计的东西在软件上仿真成功的时候,就有一种成就感。在这次的设计中,我感觉有同学们的帮助很重要,这次设计的时间虽然有些仓促,但是我们的热情依然很高,在大量资料和老师的帮助下选定了方案,之

13、前想的可能是用硬件来实现,但后来听老师一讲,知道原来是用纯软件来实现,一开始一点头绪都没有,但查了一些资料后,心里就有些底了。其实在编程中,我们借鉴了很多现成的子程序,比如二进制数的转换,这些子程序的设计是固定的,因此可以直接从指导资料中调用,至于设置光标的子程序,只需要修改几个参数就可以,这大大方便了我们的设计,为我们节省了很多的时间。平常上课都只是听老师讲讲,觉的很多东西很简单,但真正做起来,真的发现了很多问题,后来通过自己查资料和摸索解决了一些问题。刚开始的时候,做起来也比较得心应手,但是程序的原理与结构必须明白,这并不是为了应付答辩,而是如果只知道原理,那么万一编程的时候有一点错误,就

14、没有办法完成任务。通过这次课程设计,使我对系统时钟显示的程序有了更深一步的了解,对它的各个模块都有所研究,把死板的课本知识变得生动有趣,激发了学习的积极性,加深了对理论知识的理解,以前对汇编语言的认识比较模糊,现在通过自己做实验,基本了解了它的使用,培养了自己的实践动手能力。对于课程设计我总结了五点:首先它是一个对知识回顾的过程,而我们在复习中还能学到新的知识;第二是开拓了我们的思路,为了使我们的设计更简单更完善,我们大家都开动了脑筋,在不断的尝试中获得最终方案;第三是给了我们实践的机会,我就是因为缺少实践经验,以为在课堂上学的东西就可以解决问题,致使之后在编程中预到了很多困难;第四是给了我们

15、创新的机会,老师让我们大胆的去创新,去尝试,使我们有动力有信心去完成自己的想法;第五是使我感觉到了学无止境,真的是一山还比一山高,好的方案层出不穷,这使我在以后的学习中不会再只限于课本,要多查资料,多学习,才能完善自己。 通过这次设计,我想说,我真的付出很多,确实很辛苦,但我很开心最后我认为大学应该多做一些这样的课题,我相信我们会越做越好。参考文献1 周佩玲,彭虎,傅忠谦微机原理与接口技术北京:电子工业出版社,20062 雷丽文,朱晓华,蔡征宇,缪均达微机原理与接口技术北京:电子工业出版社,19983 李文英,刘星,宋蕴新,李勤微机原理与接口技术北京:清华大学出版社,20014 杨吉祥微型计算

16、机原理西安:电子科技大学出版社,20015 仇玉章等32位微型计算机原理与接口技术北京:清华大学出版社,2000附录系统时钟显示源程序: stack segment stack dw 200 dup (?) stack endsdata segment space db 1000 dup ( ) pattern db 6 dup ( ),02ah,26 dup (02ah),02ah,6 dup ( ) db 6 dup ( ),023h,26 dup (20h),023h,6 dup ( ) db 6 dup ( ),02ah,26 dup (02ah),02ah,6 dup ( ) dbu

17、ffer db 8 dup (:),12 dup ( ) dbuffer1 db 20 dup ( ) str db 0dh,0ah, please input time(t) or quit(esc): $ data endscode segment assume cs:code,ds:data,ss:stackstart : mov ax,0001h ;设置显示方式为40*25彩色文本方式 int 10h mov ax,data mov ds,ax mov es,ax mov bp,offset space mov dx,0b00h mov cx,1000 mov bx,0040h mov

18、 ax,1300h int 10h mov bp,offset pattern ;显示矩形条 mov dx,0b00h mov cx,120 mov bx,004eh mov ax,1301h int 10h lea dx,str ;显示提示信息 mov ah,9 int 21h mov ah,1 ;从键盘输入单个字符 int 21hlop: call setcurs ;主程序,设置光标位置,输出时间 mov ah,2ch ;调用系统时间 int 21h push dx ;dx中的时间秒和百分秒入栈 mov dl,ch mov dh,0 call bin10out ;调用二进制转十进制输出时间

19、小时 mov dl,: mov ah,2 int 21h mov dl,cl mov dh,0 call bin10out ;输出时间分钟 mov dl,: mov ah,2 int 21h pop dx ;秒和百分秒出栈 mov dl,dh mov dh,0 call bin10out ;输出时间秒esc: mov ah,0bh ;若输入esc,则退出程序 int 21h cmp al,0ffh jnz lop ;循环输出每个当前时间 mov ah,8 int 21h cmp al,1bh je exit jmp esc exit: mov ah,4ch int 21hclrscr proc

20、 ;清屏子程序 push ax push bx mov ax,0600h ;al=0整个窗口空白 mov bh,0fh sub cx,cx ;左上角行号,列号 mov dx,184fh ;右下角行号,列号 int 10h pop bx pop ax retclrscr endp setcurs proc ;设置光标位置 push ax push bx push dx mov ah,02h ;调用bios2号中断 sub bh,bh ;在第0页中定位 mov dx,0c0eh int 10h pop dx pop bx pop ax retsetcurs endp bin10out proc ;二进制转十进制ascuii码输出子程序 push di push dx push cx push ax mov cx,0 lea di,dbuffer1 ;去缓冲区首地址bin1: push cx mov ax,dx mov dx,0 mov cx,

温馨提示

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

评论

0/150

提交评论