汇编课设 显示系统时间汇编语言程序设计.docx
《汇编课设 显示系统时间汇编语言程序设计.docx》由会员分享,可在线阅读,更多相关《汇编课设 显示系统时间汇编语言程序设计.docx(14页珍藏版)》请在冰豆网上搜索。
![汇编课设 显示系统时间汇编语言程序设计.docx](https://file1.bdocx.com/fileroot1/2022-11/21/fcdf103a-15b9-4d92-9451-4d91acf33301/fcdf103a-15b9-4d92-9451-4d91acf333011.gif)
汇编课设显示系统时间汇编语言程序设计
课程设计报告
课程名称汇编语言程序设计
课题名称显示系统时间
专业计算机科学与技术
班级计算机0901
学号200903010128
姓名饶发强
指导教师唐北平
2011年12月23日
湖南工程学院
课程设计任务书
课程名称汇编语言程序设计
课题显示系统时间
专业班级计算机0901
学生姓名
学号200903010128
指导老师唐北平
审批
任务书下达日期2011年12月1日
任务完成日期2011年12月23日
目录
一、课题主要功能………………………………………………………………………4
二、课题的功能模块的划分………………………………………………………5
三、课题主要功能实现………………………………………………………………6
四、上机调试……………………………………………………………………………8
五、心得体会………………………………………………………………………………9
六、附录(原程序)…………………………………………………………………10
1.课题的主要内容
我做的是第三个课题:
利用INT1CH(大约每秒中断18.2次)编写一个中断驻留程序,要求在屏幕的右上角显示计算机中当前系统时间,显示格式为
时:
分:
秒:
1/100秒
2.课题的功能模块的划分
显示系统时间程序可以大致分为三个模块:
1.利用1ch号功能来重定位中断程序的入口地址
2.调用21号中断的31h程序结束并驻留功能,使得显示时间的子程序常驻内存
3.显示系统时间模块
功能模块图如下:
系统按每秒18。
2次的频率调用
N
Y
3.主要功能实现
1.重定位入口地址
;重定位中断程序的入口地址
leadx,showtime
movax,segshowtime
movds,ax
movax,251ch
int21h
2.程序驻留并结束
;调用21号中断的31h程序结束并驻留功能
movax,3100h
movdx,proclen
int21h
3.显示系统时间
showtimeproc
pushax
pushbx
pushds
pushes
movax,cs
movds,ax
movax,0b800h
moves,ax
movax,2c00h;调用21h号中断的2ch功能
int21h
;输出时钟
movbl,':
'
movbh,ch
calladjust
moves:
[120],al
moves:
[120+2],ah
moves:
[120+4],bl
;输出分钟
movbh,cl
calladjust
moves:
[120+6],al
moves:
[120+8],ah
;输出秒钟
movbh,dh
calladjust
moves:
[120+12],al
moves:
[120+14],ah
moves:
[120+16],bl
;输出毫秒
movbh,dl
calladjust
moves:
[120+18],al
moves:
[120+20],ah
popes
popds
popbx
popax
iret
showtimeend
显示系统时间的流程图如下:
4.上机调试
程序运行结果如下:
调试过程遇到了一些问题,主要的是显示结果为乱码的情况,通过debug调试,发现原来是把两位数的时间转换为两个对应的字符输出时出现了问题,原来在《汇编语言》---王爽写得那本书上看到介绍CMOS存取块时说过其中就保存有当前的系统时间,我也自己用代码实现过,应为那里面保存两位的时间是用组合型BCD码来实现的,受它的影响在实现调用系统时间中断功能时也想它是不是也是这样实现的,或者根本就是调用了它的值,后来才发现自己想错了,该过之后就得出了上面真确的结果。
在编写程序过程中也出现一些编译错误,但我认为这些都是最低级的错误,和容易就能通过编译器的提示把它解决,这里就没说了。
5.心的体会
在开始写代码前,我首先认真的阅读了群里老师发过来的那个与之类似的程序,它是随机的输出0到9之间的整数。
但刚一开始阅读那个源程序我就发现其中有好多的错误,而且程序不完整,所以我决定先把这个示例程序调试出来,然后再写自己的那个程序。
刚开始有好多的地方看不懂,有加之有些地方程序本身有问题,所以觉得我做的第三题应该有难度。
但有一句说的好:
明知山有虎,偏向虎山行,学习最忌讳的就是知难而退,对自己没有信心。
学习不能被眼前的一点小小的困难就吓倒,而爬不起来,那么如果一直这样下去你是很难学到有用的东西的,或者说是很难在这方面有一定的成绩的。
学了一学期的汇编,一个这么小小的程序还不能完成那真是白学了,况且平时花在这门课程上的时间也不少。
于是,我不断的鼓励自己,一定能做得出来的,看不懂的地方我就到网上去查,问身边的同学,经过一下午的努力终于把那示例程序调试了出来。
也大致清楚了我要做的那题的基本思路,后来根据那个示例程序的提示,在晚上就把它弄出来了。
通过这一次的课设练习,对汇编了解了很多,更加的巩固了以前学习的那些基础知识,同时我也发现在写汇编程序中要注意的很多细节:
1.对重要的语句块,子程序必须记得的写注释,不然很难让人看懂,除非你不想让别人看懂它,上机的过程中,一同学要我帮他去看一下他在网上下载过来的源程序,整个程序下来就没有看到一个注释,200多行的代码,让人怎么看啊!
!
!
!
2.要合理,真确的利用自定义的堆栈来保护好寄存器的值,只要把入口参数,和子程序中要用到的寄存器的值保护起来就好了,输出参数是不能保护的,在调试程序的过程中我就出现了应为把输出参数也保护起来的低级的错误。
3.合理的利用debug功能,会是你在调试程序过程中事半功倍。
刚开始认为调用系统时间中断,保存在对应寄存器中的值是用组合型BCD码形式保存的(因为CMOS中存取的系统时间就是用组合型BCD码来存取的)。
于是我直接通过移位操着得到其高四位,低四位的值,并输出来,发现结果时乱码,后来通过debug功能,查看对应寄存器中的值,发现原来就是用十进制形式保存的,直接除以10就可以得到其余数和商,输出即可。
六.源程序
assumecs:
code,ds:
code
stacksegment
db128dup(?
)
stackends
codesegment
start:
;ss段寄存器的装入
movax,stack
movss,ax
movsp,128
;重定位中断程序的入口地址
leadx,showtime
movax,segshowtime
movds,ax
movax,251ch
int21h
;调用21号中断的31h程序结束并驻留功能
movax,3100h
movdx,proclen
int21h
showtimeproc
pushax
pushbx
pushds
pushes
movax,cs
movds,ax
movax,0b800h
moves,ax
movax,2c00h;调用21h号中断的2ch功能
int21h
;输出时钟
movbl,':
'
movbh,ch
calladjust
moves:
[120],al
moves:
[120+2],ah
moves:
[120+4],bl
;输出分钟
movbh,cl
calladjust
moves:
[120+6],al
moves:
[120+8],ah
;输出秒钟
movbh,dh
calladjust
moves:
[120+12],al
moves:
[120+14],ah
moves:
[120+16],bl
;输出毫秒
movbh,dl
calladjust
moves:
[120+18],al
moves:
[120+20],ah
popes
popds
popbx
popax
iret
showtimeendp
;入口参数为bh,出口参数为ah,al
;因为调用2ch中断得到的时间是用十六进制表示的,所以直接除以10得到商和余数
adjustproc
movah,0
moval,bh
movbh,10
divbh
addah,30h
addal,30h
ret
adjustendp
proclenequ$-showtime
codeends
endstart
另外附上用直接调用70,71号端口显示系统时间的源程序:
assumecs:
code,ds:
code
stacksegment
db128dup(?
)
stackends
codesegment
start:
movax,stack
movss,ax
movsp,128
leadx,showtime
movax,segshowtime
movds,ax
movax,251ch
int21h
movax,3100h
movdx,proclen
int21h
showtimeproc
pushax
pushbx
pushds
pushes
movax,cs
movds,ax
movax,0b800h
moves,ax
movah,':
'
moval,4
out70h,al
inal,71h
callintchar
moves:
[120],bh
moves:
[120+2],bl
moves:
[120+4],ah
moval,2
out70h,al
inal,71h
callintchar
moves:
[120+6],bh
moves:
[120+8],bl
moves:
[120+10],ah
moval,0
out70h,al
inal,71h
callintchar
moves:
[120+12],bh
moves:
[120+14],bl
popes
popds
popbx
popax
iret
showtimeendp
intcharproc
pushcx
movbh,al
movbl,bh
movcl,4
shrbh,cl
andbl,0fh
addbh,30h
addbl,30h
popcx
ret
intcharendp
proclenequ$-showtime
codeends
endstart
计算机科学与技术系课程设计评分表
课程名称:
项目
评价
设计方案的合理性与创造性
设计与调试结果
设计说明书的质量
答辩陈述与回答问题情况
课程设计周表现情况
综合成绩
教师签名:
日期:
(注:
1.此页附在课程设计报告之后;2.综合成绩按优、良、中、及格和不及格五级评定。
)