汇编汇编语言课程设计电子时钟.docx
《汇编汇编语言课程设计电子时钟.docx》由会员分享,可在线阅读,更多相关《汇编汇编语言课程设计电子时钟.docx(27页珍藏版)》请在冰豆网上搜索。
汇编汇编语言课程设计电子时钟
课程设计任务书
专业
计算机科学与技术
班级
姓名
设计起止日期
设计题目:
电子时钟
设计任务(主要技术参数):
[1]硬件环境:
CPU:
1.6GH以上
内存:
4GB以上
[2]软件环境:
操作系统:
Windows8
运行环境:
masm.Exe
[3]设计任务:
要求有显示位置:
屏幕中央;日期显示格式"时:
分:
秒";12/24时制可调;在显示屏上显示提示语“CURRENTTIMEIS:
”和当前时间;整点和半点报时功能。
指导教师评语:
成绩:
签字:
年月日
电子时钟
1.课程设计目的
汇编语言是面向机器的程序设计语言。
在汇编语言中,用助记符代替操作码,用地址符号或标号代替地址码。
这样用符号代替机器语言的二进制代码,就把机器语言变成了汇编语言。
汇编语言能够最大限度的发挥硬件的性能。
本次课程设计我做的是计算机时钟模拟显示程序的设计,要求有显示位置:
屏幕中央;日期显示格式"时:
分:
秒";12/24时制可调;在显示屏上显示提示语“CURRENTTIMEIS:
”和当前时间。
在这次课程设计中我加入了整点和半点报时功能。
使得程序更加完善。
2.设计思路
2.1设计任务及要求
(1)使用汇编语言设计一个运行于计算机的时钟模拟显示软件,软件应实现模拟显示时钟。
(2)根据任务书的要求,可知需要设计的计算机时钟模拟显示程序是基于汇编语言的WINDOWS应用程序设计,程序运行成功后,页面出现数字式的时钟。
具体过程如下首先界面中间出现“TIMESYSTEMIS:
”提示输入12/24时制。
输入以后会出现“CURRENTTIMEIS:
”提示输入初值时间其格式为:
时(XX):
分(XX):
秒(XX)。
接着就会在界面出现所设的初值开始计时其输出格式为XX:
XX:
XX。
并且到半点或整点会报时。
。
此模拟时钟外观简洁明了,功能和实际运用到的时钟的基本功能一样,用起来非常方便、快捷。
2.2设计原理
1.12/24时制的设置
调用DOS操作系统模块1,输入12/24时制的第一位即高位,再调用DOS操作系统模块1输入12/24时制的第二位即低位。
然后将输入的两个ASCII码值转换为压缩BCD码存入定义的变量X中,用于与12H比较并跳转到相应进制显示的程序中。
2.时钟起始时间的设置
先调用设置光标子程序和清除屏幕子程序,调用DOS操作系统模块9,在显示屏上显示提示符“CURRENTTIMEIS:
”,再调用DOS操作系统模块10,提示要输入时钟的起始时间,输入时间的格式是“时(XX):
分(XX):
秒(XX)”。
输入的时间以字符串形式放在已定义的存储器缓冲区,继而调用TRAN1和MUL10子程序,将存放在存储器缓冲区的ASCII字符转换成压缩BCD码,并将时、分、秒的值放置在寄存器CH、DH、DL中。
3.延时程序
调用TIME延时1S子程序(并未精确计算),累加到存放秒值的寄存器DL中,并进行十进制调整。
在累加的过程中,不断地对时、分、秒进行比较,秒不能等于60,分不能等于60,时不能等于12或24.秒等于限值时,则使秒值为0并且分值加1;时等于限值时,先置零然后就转显示屏输出。
4.时间显示
调用DOS操作系统模块9,可用来显示存储器内字符串。
由于显示的字符串必须为ASCII编码,因为要调用TRAN2转换子程序将寄存器CH、DH、DL内压缩BCD码字符串转换成ASCII码字符串,字符串最后以字符“$”结束,并按时、分、秒的顺序送存储器缓冲区内。
调用DOS操作系统模块9时,(DS:
DX)应指向字符串首址。
程序一旦进入运行,就将不间断地在显示屏显示时间,要想使程序停止运行,可同时在键盘按下Ctrl和Break二键。
5.半点、整点报时
当分达到30时,转到报时程序;当分到0时,转到报时程序;其余的情况都不用跳到报时程序而是正常执行输出。
2.3程序流程图
根据以上程序流程相应的说明,在程序编写前,我们应先画出程序流程图本程序的流程图如图1所示。
图1程序流程图
2.4程序设计
2.4.112/24时制程序设计
很明显要想实现此功能必须使用分支结构程序,调用DOS操作系统模块1,输入12/24时制的第一位即高位,再调用DOS操作系统模块1输入12/24时制的第二位即低位。
然后将输入的两个ASCII码值转换为压缩BCD码存入定义的变量X中,用于与12H比较并跳转到相应进制显示的程序中。
其程序片段如下:
MOVAH,1 ;DOS功能模块,从键盘输入字符
INT21H
MOVBL,AL;将输入的数据12,24转换为压缩BCD码存放在变量S中
ANDBL,0FH
SHLBL,1
SHLBL,1
SHLBL,1
SHLBL,1
MOVAH,1
INT21H
MOVCL,AL
ANDCL,0FH
ORCL,BL
MOVS,CL
MOVAH,1;输入最后一个回车字符
INT21H
……
CMPS,12H
JNZAGAIN1;24进制则跳转到AGAIN1执行24进制显示的程序
2.4.2时钟起始时间的设置
先调用设置光标子程序和清除屏幕子程序,调用DOS操作系统模块9,在显示屏上显示提示符“CURRENTTIMEIS:
”,再调用DOS操作系统模块10,提示要输入时钟的起始时间,输入时间的格式是“时(XX):
分(XX):
秒(XX)”。
输入的时间以字符串形式放在已定义的存储器缓冲区,继而调用TRAN1和MUL10子程序,将存放在存储器缓冲区的ASCII字符转换成压缩BCD码,并将时、分、秒的值放置在寄存器CH、DH、DL中。
其程序片段如下:
MOVDX,OFFSETCT ;DOS功能模块,显示字符串,提示从键盘输入
MOVAH,9
INT21H
MOVDX,OFFSETBUFFER
MOVAH,10 ;DOS功能模块,从键盘输入字符串到缓冲区
INT21H
MOVBX,OFFSETBUFFER+2
CALLTRAN1;时转换为BCD数
INCBX
INCBX
CALLTRAN1;分转换为BCD数
INCBX
INCBX
CALLTRAN1;秒转换为BCD数
MOVBX,OFFSETBUFFER+2;原输入缓冲区的BCD数转换压缩BCD
MOVAL,[BX];数的同时将输入缓冲区的数据传给
CALLMUL10;时-CH,分-DH,秒-DL
2.4.3延时程序设计
调用TIME延时1S子程序(并未精确计算,因机器的主频不同会有差异),累加到存放秒值的寄存器DL中,并进行十进制调整。
在累加的过程中,不断地对时、分、秒进行比较,秒不能等于60,分不能等于60,时不能等于12或24.秒等于限值时,则使秒值为0并且分值加1;时等于限值时,先置零然后就转显示屏输出。
其程序片段如下:
TIMEPROC
PUSHCX
PUSHAX
MOVAX,25000;嵌套循环AX为外循环,CX为内循环
WAITED:
MOVCX,24000
GOON:
LOOPGOON
DECAX
JNZWAITED
POPAX
POPCX
RET
TIMEENDP
2.4.4时间显示程序设计
调用DOS操作系统模块9,可用来显示存储器内字符串。
由于显示的字符串必须为ASCII编码,因为要调用TRAN2转换子程序将寄存器CH、DH、DL内压缩BCD码字符串转换成ASCII码字符串,字符串最后以字符“$”结束,并按时、分、秒的顺序送存储器缓冲区内。
调用DOS操作系统模块9时,(DS:
DX)应指向字符串首址。
其程序片段如下:
DISPLAY:
MOVBX,OFFSETBUFFER
INCBX
INCBX
CALLIOCLR
CALLIOSET
MOVAL,CH;将小时的压缩BCD数转化为ASCII码在存储器中进行修改
CALLTRAN2
INCBX
MOVAL,':
';在中间添加一个‘:
’
MOV[BX],AL
INCBX
MOVAL,DH
CALLTRAN2
INCBX
MOVAL,':
'
MOV[BX],AL
INCBX
MOVAL,DL
CALLTRAN2
CMPDH,30H;到了30分钟不跳转,其余都跳到NEXT2
JNZNEXT2
2.4.5半点、整点报时
当分达到30时,转到报时程序;当分到0时,转到报时程序;其余的情况都不用跳到报时程序而是正常执行输出。
报时时会在时间后面接着显示“*:
)”并发出嘀的一声。
其半点、整点报时程序片段如下:
INCBX
MOVAL,'*';在输入缓冲区后面增加字符“*:
)”用于显示
MOV[BX],AL
INCBX
MOVAL,':
'
MOV[BX],AL
INCBX
MOVAL,')'
MOV[BX],AL
INCBX
MOVAL,07H;在输入缓冲区后面加入07H=bel,报时
MOV[BX],AL
JMPNEXT3
2.5开发环境
2.5.1软、硬件环境
软件环境:
操作系统:
Windows8.164位(DirectX11)、
BIOS系统
DOS系统
硬件环境:
处理器:
英特尔第五代酷睿i5-5200U@2.40GHz双核
内存:
4GB(戴尔DDR31333MHz)
主硬盘:
希捷ST500LM012HN-M500MBB(500GB/5400转/分)
显示器:
戴尔Inspiron(15.6英寸)
2.5.2MASM开发环境
Masm是汇编编译器,是微软公司开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发的优点,支持伪指令和宏汇编,最后编译生成obj文件,通过link工具连接成可执行文件exe。
使用步骤为:
a使用编辑软件TE.EXE进行源程序的编写。
b使用汇编软件MASM.EXE对源程序汇编。
c使用连接软件LINK.EXE对目标文件进行连接。
d使用调试软件DEBUG.EXE对可执行程序进行调试。
3.调试过程和运行结果分析
3.1调试过程
(1)编写源程序,并命名为dianzizhong.asm,并保存于默认文件夹中。
(2)打开文件dianzizhong.asm,编译使之生成目标文件,检查源程序中的错误改正,直到编译无错误出现为止。
(3)点击菜单栏中运行里的连接,再点击运行,输入相应的字符就会显示相应的结果。
(4)首先屏幕上显示提示语“TIMESYSTEMIS:
”用户输入12或者24即可实现12或24进制的转换。
(5)屏幕上显示“CURRENTTIMEIS:
”提示语,用户输入当前时间其输入格式为时(XX):
分(XX):
秒(XX)。
(6)屏幕上显示从我们设定的时间开始计时。
3.2运行结果显示
(1)当进入显示界面是屏幕上会出现提示语“TIMESYSTEMIS:
”,在此窗口我们输入12或者24进制。
其显示结果如图2所示。
图212/24进制选择界面
(2)当我们输入12或24进制时的窗口界面如图3和图4所示。
图3输入12进制界面
图4输入24进制的界面
(3)当输入进制信息以后,现在的提示语为“CURRENTTIMEIS:
”,现在再输入时间,其窗口界面如图5所示。
图5提示输入时间的界面
(4)当输入了时间后的显示结果如图6所示。
图6完成输入时间的界面
(5)最后,会显示设置的初始时间并开始计时。
其结果如图7所示。
图7计时的界面
(6)到了半点和整点时报时的显示结果如图8和图9所示。
图8半点报时
图9整点报时
3.3所遇到的问题与解决
1、对延时时间的设置:
当计算机执行命令时,虽然快,但还是需要一定的时间。
此时间与计算机的主频有关系,我们采用循环的方式来进行延时。
但我们所使用的计算机的CPU主频比8086高,故需要内外两个循环来实现,内循环为24000,外循环为25000,这样延时约为1S。
程序如下:
TIMEPROC
PUSHCX
PUSHAX
MOVAX,25000;嵌套循环AX为外循环,CX为内循环
WAITED:
MOVCX,24000
GOON:
LOOPGOON
DECAX
JNZWAITED
POPAX
POPCX
RET
TIMEENDP
2、开始光标不在屏幕中央,原因是IOSET子程序中的光标设计的位置不对,重新改变DX后,光标到达屏幕中央。
IOSET子程序如下:
IOSETPROC;设置光标位置
PUSHAX
PUSHBX
PUSHDX
MOVDX,0C20H;DH=光标所在行号,DL=光标所在列号MOVBH,00;BH=光标所在页号
MOVAH,02
INT10H
POPDX
POPBX
POPAX
RET
IOSETENDP
3、检查错误过程中,系统提示“outofmemory”
1)、原因:
在某些程序段存在只有现场保护没有现场恢复
2)、解决办法:
通过系统运行,发现错误的行数,找到相应的位置,添加现场恢复语句。
4、刚开始选择进制的功能的时候,只设置了两次DOS字符输入功能的调用因此只能输入两个字符,而当输入第二个字符以后提示语立即不见,根本看不到。
因此为了在输入进制的两个字符以后,添加一个回车以完成输入则必须设置三次DOS字符输入功能调用。
其程序如下:
MOVAH,1 ;DOS功能模块,从键盘输入字符
INT21H;第一次调用
MOVBL,AL;将输入的数据12,24转换为压缩BCD码存放在变量S中
ANDBL,0FH
SHLBL,1
SHLBL,1
SHLBL,1
SHLBL,1
MOVAH,1
INT21H;第二次调用
MOVCL,AL
ANDCL,0FH
ORCL,BL
MOVS,CL
MOVAH,1;输入最后一个回车字符
INT21H;第三次调用
5.在输入了进制信息以后并没有调用函数IOCLR因此在显示窗口中显示了多个信息,并不美观,后来我在输入了进制信息以后加了CALLIOCLR、CALLIOSET的调用程序。
对屏幕进行清屏,并且设置光标位置。
程序片段如下:
MOVAH,1;输入最后一个回车字符
INT21H
CALLIOCLR
CALLIOSET
MOVDX,OFFSETCT ;DOS功能模块,显示字符串,提示从键盘输入
MOVAH,9
INT21H
3.4结果分析
经验证,在第一个提示窗口“TIMESYSTEMIS:
”中输入进制为12或则24,会实现12/24进制的转换。
在第二提示窗口“CURRENTTIMEIS:
”中输入初始时间能正确的设置初试时间。
并且我们在窗口中显示了“CURRENTTIMEIS:
”,满足任务的要求。
设置的时间程序能够正常的运行,达到了设计目的。
并且时间在屏幕的正中央显示。
在半点以及整点的时候在时间末尾处显示“*:
)”的提示符号,并且发出报警声。
实现了半点,整点报时的功能。
总的来说,此程序基本上完成了设计要求。
4.心得体会
经过以上步骤,课程设计所要求设计的电子钟显示设计软件便成功完成了,它能显示数字式的时钟,并且能设置初值和时钟进制。
整个页面简洁清晰,方便用户读取,且操作简捷,符合课程设计中的各项要求。
通过这次课程设计,我们对日常生活中司空见惯的时钟的工作原理有了一个比较深入的了解,将书本中的知识更好地与实际生活中的应用结合在了一起。
通过这次微机原理课程设计学到了很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
而且我第一次感受到在写一个程序的时候,一定要事先把程序原理方框图画出来的重要性。
在课程设计中碰到的那些需要很多代码才能完成的任务,画程序方框图是很有必要的。
因为通过程序方框图,在做设计的过程中,我们每一步要做什么,每一步要完成什么任务都有一个很清楚的思路,而且在程序测试的过程中也有利于查错。
本次课程设计的过程中遇到了很多问题,比如时间走得太快、光标的位置无法定位等等。
对每个问题的解决都是一种对知识的重新整理和考察。
我更加感到愉悦的,此次的课程设计锻炼了我的编程能力。
到此为止,我们接近一周的课程设计也告一段落。
通过这次课程设计,使我认识到理论与实际相结合的重要性,对课本上的只是在实际生活中的运用也有了进一步的了解,同时基本上能够掌握汇编语言编程中编程的步骤,可以说是从中受益匪浅。
通过本次课设我也学到很多课堂上学不到的调试知识。
很感谢学校给我们提供了这么好的学习机会,感谢老师的指导,从老师的身上学到了对知识真正严谨细致的态度,让我受益匪浅。
5.参考文献
[1]杨文显,宓双,胡建人.新编汇编语言程序设计[M],北京:
清华大学出版社,2010:
20-58
[2]朱玉龙,任文览等.汇编语言程序设计[M],北京:
清华大学出版社,2003:
67-89
[3]沈美明等.IBM-PC汇编语言及程序设计实验教程[M],北京:
清华大学出版社,2001:
45-67
[4]钱晓捷等.汇编语言程序设计[M],北京:
电子工业出版社,2000:
1-24
[5]李珍香等.汇编语言程序设计案例精编[M],北京:
中国水利水电出版社,2004:
5-16
[6]白小明.汇编语言程序设计[M],北京:
中国铁道出版社,2009:
56-76
6.附录:
源程序
DATSEGMENT
BUFFERDB20
DB?
DB20DUP(?
)
TSDB'TIMESYSTEMIS:
$'
CTDB'CURRENTTIMEIS:
$'
SDB?
DATENDS
STASEGMENTPARASTACK'STACK'
STAPNDB100DUP(?
)
TOPEQULENGTHSTAPN
STAENDS
CODSEGMENT
STARTPROCFAR
ASSUMECS:
COD,DS:
DAT,SS:
STA
MOVAX,DAT
MOVDS,AX
MOVAX,STA
MOVSS,AX
MOVAX,TOP
MOVSP,AX
CALLIOCLR
CALLIOSET
MOVDX,OFFSETTS;DOS功能模块,显示字符串’TIMESYSTEMIS:
’
MOVAH,9
INT21H
MOVAH,1;DOS功能模块,从键盘输入字符
INT21H
MOVBL,AL;将输入的数据12,24转换为压缩BCD码存放在变量S中
ANDBL,0FH
SHLBL,1
SHLBL,1
SHLBL,1
SHLBL,1
MOVAH,1
INT21H
MOVCL,AL
ANDCL,0FH
ORCL,BL
MOVS,CL
MOVAH,1;输入最后一个回车字符
INT21H
CALLIOCLR
CALLIOSET
MOVDX,OFFSETCT;DOS功能模块,显示字符串,提示从键盘输入
MOVAH,9
INT21H
MOVDX,OFFSETBUFFER
MOVAH,10;DOS功能模块,从键盘输入字符串到缓冲区
INT21H
MOVBX,OFFSETBUFFER+2
CALLTRAN1;转换小时为BCD数
INCBX
INCBX
CALLTRAN1;转换分钟BCD数
INCBX
INCBX
CALLTRAN1;转换秒BCD数
MOVBX,OFFSETBUFFER+2;原输入缓冲区的BCD数转换压缩BCD
MOVAL,[BX];数的同时将输入缓冲区的数据传给
CALLMUL10;CH,DH,DL
MOVCH,AL
INCBX
INCBX
MOVAL,[BX]
CALLMUL10
MOVDH,AL
INCBX
INCBX
MOVAL,[BX]
CALLMUL10
MOVDL,AL
AGAIN:
CALLTIME
CMPS,12H
JNZAGAIN1;24进制跳转到AGAIN1
MOVAL,DL
ADDAL,1
DAA
MOVDL,AL
CMPAL,60H
JNEDISPLAY
MOVDL,0
MOVAL,DH
ADDAL,1
DAA
MOVDH,AL
CMPAL,60H
JNEDISPLAY
MOVDH,0
MOVAL,CH
ADDAL,1
DAA
MOVCH,AL
CMPAL,12H
JNEDISPLAY
MOVCH,0
JMPDISPLAY
AGAIN1:
MOVAL,DL
ADDAL,1
DAA
MOVDL,AL
CMPAL,60H
JNEDISPLAY
MOVDL,0
MOVAL,DH
ADDAL,1
DAA
MOVDH,AL
CMPAL,60H
JNEDISPLAY
MOVDH,0
MOVAL,CH
ADDAL,1
DAA
MOVCH,AL
CMPAL,24H
JNEDISPLAY
MOVCH,0
DISPLAY:
MOVBX,OFFSETBUFFER
INCBX
INCBX
CALLIOCLR
CALLIOSET
MOVAL,CH;将小时的压缩BCD数转化为
CALLTRAN2;ASCII码在存储器中进行修改
INCBX
MOVAL,':
';在中间加一个字符‘:
’
MOV[BX],AL
INCBX
MOVAL,DH
CALLTRAN2
INCBX
MOVAL,':
'
MOV[BX],AL
INCBX
MOVAL,DL
CALLTRAN2
CMPDH,30H;到了30分钟不跳转,其余都跳到NEXT2
JNZNEXT2
NEXT1:
CMPDL,0;秒为0不跳其余跳到NEXT3
JNZNEXT3
INCBX
MOVAL,'*'
MOV[BX],AL
INCBX
MOVAL,':
'
MOV[BX],AL
INCBX
MOVAL,')'
MOV[BX],AL
INCBX
MOVAL,07H;在输入缓冲区加入07H,报时
MOV[BX],AL
JMPNEXT3
NEXT2:
CMPDH,0
JNZNEXT3
JMPNEXT1