西安工业大学课程设计用纸课程名称:汇编语言程序设计课程英文名称:PROGRAMMINGBYASSEMBLELANGUAGE一.设计目的:1.理解掌握定时/计数器和中断的使用方法。2.掌握微机常用的输入输出方式及接口技术。3.掌握一定的汇编语言知识,培养自己的动手操作能力。4.学习程序设计的基本思路和方法。二.程序内容:第一部分:定义显示界面。第二部分:调用系统时间,并将调用的用二进制表示的时间数转换成ASCII码,并将时间数存入内存区。第三部分:将存在系统内存区的时间数用显示字符串的形式显示出来。第四部分:获取键盘的按键值,以ESC键退出系统返回DOS。三.程序设计原理:首先在数据段开辟一显示缓冲区,用来存储系统时间。调用DOS中断,返回系统时间,并将来返回的二进制时间转换成ASCII码,方便时间显示时的调用。分别将来小时数、分钟数、秒数存入显示缓冲区,并最终存入一结束字符号’$’。调用DOS字符串显示功能将时间显示西安工业大学课程设计用纸出来。并调用屏幕I/O中断,定位光标的开始位置,结合着将时间显示在我们预先定义好的位置上。由于获取了的系统时间不会自动刷新,所以我们要设计成刷新的方式来不断获取系统的时间,这样就形成了会跳动的电子钟了。调用延时TIME延时中断服务程序,累加到存放秒值的寄存器DL中,并进行十进制调整。在累加的过程中,不断地对时、分、秒值进行比较,秒不能等于60,分不能等于60,时不能等于24。秒等于限制值时,则使秒值为0分值加1;分等于限制值时,则使分值为0时值加1;时等于限制值时,则使时值为0;时、分、秒值都不超过限制值时,就转显示屏输出。时间显示的刷新要配合延时程序进行,为了得到良好的显示效果,延时程序要尽量接近1秒,但又不能超过一秒,所以本程序调用了一段较精确的时间延迟程序。利用BIOSS设计窗口,选择适当的背景和前景等,使屏幕显示更加完美。程序一旦进入运行,就将不间断地在显示屏显示时间,要想程序停止运行,可同时在键盘按下ESC键返回DOS系统。四.程序流程图如下:DATASEGMENT;设置数据段BUF1DB'THETIMEISNOW:$'BUF5DB'@@@@@^^^^^^^@@@@@@$'BUF6DB'&&&&&######&&&&&&$'BUF7DB'00oo00$'BUF8DB'00(::)00$'BUF9DB'00~~00$'BUF10DB'00!!00$'BUF3DB'CLASS:040402206$'BUF4DB'NAME:hulingwei$'BUF2DB10DB10DUP(?)DATAENDSSTACKSEGMENTSTACK;设置堆栈段DB100DUP(?)STACKENDSCODESEGMENT;设置代码段ASSUMECS:CODE,DS:DATA,SS:STACKCURSORMACROROW,CLM;设置光标位置MOVAH,2MOVBH,0MOVDH,ROWMOVDL,CLMINT10HENDMWINMACROROWL,CLML,ROWR,CLMR,COLOR;设置窗口,位置,颜色MOVAH,6MOVAL,0MOVCH,ROWLMOVCL,CLMLMOVDH,ROWRMOVDL,CLMRMOVBH,COLORINT10HENDMASCBCDMACROREGINCBXINCBXMOVREG,[BX]MOVCL,4SHLREG,CLINCBXMOVAL,[BX]ANDAL,0FHORREG,ALENDMBCDASCMACROREGINCBXINCBXMOVAL,REGMOVCL,4SHRAL,CLORAL,30HMOV[BX],ALINCBXMOVAL,REGANDAL,0FHORAL,30HMOV[BX],ALENDMINCBCDMACROREG,COUNT;BCD数加1MOVAL,REGINCALDAAMOVREG,ALCMPAL,COUNTJNZDISPYMOVREG,0ENDMSTRDSPYMACROADRSLEADX,ADRSMOVAH,9INT21HENDMCLOCKPROCFARSTART:PUSHDS;显示字符串MOVAX,0PUSHAXMOVAX,DATAMOVDS,AXWIN0,0,24,79,7WIN6,9,18,70,01000001B;设置窗口CURSOR6,25;设置光标STRDSPYBUF5;显示字符串CURSOR7,25;设置光标STRDSPYBUF6CURSOR8,25STRDSPYBUF7CURSOR9,25STRDSPYBUF8CURSOR10,25STRDSPYBUF9CURSOR11,25STRDSPYBUF10CURSOR6,9STRDSPYBUF3CURSOR7,9STRDSPYBUF4CURSOR14,32STRDSPYBUF1CURSOR15,36LEADX,BUF2MOVAH,0AHINT21H;从键盘接收当前时间LEABX,BUF2ASCBCDCH;小时值ASCII到BCD;存CHASCBCDDH;分值ASCII到BCD;存DHASCBCDDL;秒值ASCII到BCD;存DLTIMER:CALLDELY;延时1秒INCBCDDL,60H;(DL)+1,并判;大于等于60?INCBCDDH,60H;(DH)+1,并判;大于等于60?INCBCDCH,24H;(CH)+1,并判;大于等于60?DISPY:LEABX,BUF2BCDASCCH;时值BCD转到ASCIIBCDASCDH;分值BCD转到ASCIIBCDASCDL;秒值BCD转到ASCIIINCBXMOVAL,'$'MOV[BX],ALPUSHDXCURSOR15,36;设置光标STRDSPYBUF2+2;显示时,分,秒值POPDXMOVAH,01HINT16HCMPAL,1BHJZXXORAL,ALJMPTIMERX:MOVAH,4CHINT21HRETDELYPROCPUSHCXPUSHCXMOVE4600X1:DECCX,0FFFFHX2:DECCXJNEX2DECAXJNEX1POPAXPOPCXRETDELYENDPCLOCKENDPCODEENDPENDSTART六.调试过程:开始显示提示符从键盘上接收当前时,分,秒时,分,秒值ASCII码转换为BCD码,分别存入CH,DH,DL延时1秒DL加1,DAA调整(DH)=60H?DL清零,DH加1,DAA调整(DH)=60H?DH清零,CH加1,DAA调整(CH)=24H?CH清零时,分,秒值BCD码转换为ASCII码,输出显示1)编译源文件,命名为HULINGWEI。ASM2)采用命令格式。MASMHULINGWEI。ASM将生成一个OBJ文件,检查源程序中的错误,并改正。3)键入连接命令:LINKHULINGWEI。OBJ,再次键入HULILNGWEI回车,即可显示结果。4)时间在运行中出现了不准确性,对程序的循环次调整后,时间能正常运行。七.时遇到的问题及解决方法在课程设计中遇到的最大的困难是如何产生中断,对中断向量表的装载还比较模糊,对中断的初始化、具体设置、中断返回还不是很清楚,程序设计一度陷入停滞状态,不知如何是好。我们又重新翻阅了杨素行主编的《微型计算机系统原理及应用》及周明德主编的《微型计算机的原理及应用》,重点研究了《中断》,通过对这一章的学习,我们终于对中断有了详细的认识,在设计程序西安工业大学课程设计用纸时也容易了很多。八.心得体会这是我第一次用汇编语言来设计一个小程序,历时一周终于完成,其间有不少感触。1.借鉴鲁迅先生曾说过要拿来,对,在这次课程设计中,就要拿来不少子程序,比如将ASCII码转换成BCD码,将BCD码转换成压缩BCD码,将压缩BCD码转换成ASCII码等,这些子程序的设计是固定的,因此可以直接从指导资料中调用,至于设置光标的子程序,只需要修改几个参数就可以,这大大方便了我们的设计,为我们节省了很多的时间。2.合作这个时代不欢迎孤独的英雄,因为一个人的能力毕竟有限,惟有善于合作的团队才能发挥出最大的能量。在这次课程设计中,我真正体会到了合作的重要性,我们这个班级在这次程序设计中总在一起,从要实现的功能到流程图的绘制,从程序的编写到程序的检查,从程序的调试到实验报告的写作,其间每一个过程都凝聚了我们班级的力量。在遇到棘手的问题时,我们总是一起讨论,一起把问题解决;在西安工业大学课程设计用纸我遇到不很明白的程序时,是同学们耐心地给我讲解;在我面对有错的程序不知所措时,也是同学们帮我一步步地调试,耐心的指导,直至程序能正常运行。3.指导老师提供的资料很重要这次课程设计的大部分程序,都可以在王老师提供的资料中找到,这对我们的程序设计很有帮助,从这些资料中,我们可以看出这个时钟程序的基本流程,修改一些程序就可以实现这个时钟的基本功能,添加一些程序就可以实现这个时钟的附加功能,可以说,如果没有王老师提供的源程序,我们将面临很大的困难。4.考核方式很正规在程序设计完之后,不仅仅是交上设计报告就可以过关,还必须要经过王老师得面试。杨老师在面试时就我们编写的程序提问了几个问题,以考察我们是否真正了解了这个程序,面是很严格,表现不好就不能过关。在这次面试中,我认识到自己对一些细节还不是很清楚,还有待于进一步提高;通过这次课程设计,我明白了做任何事情都要脚踏实地,认真钻研,严格谨慎。向在这次课程设计中给与指导和帮助的王老师表示衷心的感谢!九.参考文献。周明德。微型计算机原理及应用。北京。清华大学出版社。2002扬素行。微型计算机系统原理及应用。北京。清华大学出版社。2004