汇编课程设计月历显示程序.docx
- 文档编号:9007201
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:27
- 大小:75.43KB
汇编课程设计月历显示程序.docx
《汇编课程设计月历显示程序.docx》由会员分享,可在线阅读,更多相关《汇编课程设计月历显示程序.docx(27页珍藏版)》请在冰点文库上搜索。
汇编课程设计月历显示程序
华北科技学院
课程设计说明书
课程名称:
汇编语言
班级:
计算机B08-1姓名:
__蒋良_
学号:
__200807024110
设计题目:
___月历显示程序
设计时间:
_12月13号至12月24号
指导教师:
______李冬艳________
评语:
_________________________________
_________________________________________
_________________________________________
_________________________________________
_________________________________________
评阅成绩:
____评阅教师:
_____
1课程设计目的
进行程序设计方法和技能的基本训练,巩固在课堂上学到的有关程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。
二、课程设计要求
1.要求编写并调试通过一个小型软件,实现对软件或硬件的操作。
2.遵循模块化、结构化的程序设计方法。
3.要求程序必须正确。
4.程序简明易懂,多运用输入输出提示,出错信息及必要的注释。
5.要求程序结构合理,语句使用得当。
6.适当追求编程技巧和程序运行效率。
三、课程设计题目:
月历显示程序
四、课题分析
本程序主要实现了从键盘获取正确的年份/月份后,在屏幕上以月历的形式显示出当月。
本次课题设计主要通过克服一下问题实现了目的功能:
1年份/月份的获取与输出(小于10与大于等于10两种情况);
2闰年的判断,遵循四年而闰,百年不闰,四百再闰的规则;
3不同月份所含日数并不相同,分为四种情况:
30、31、28、29;
4计算出输入月份第一天为星期几,并依照此进行排列日期与计算显示出的空格数目
5、输入错误后的提示以及从新输入
五、流程图
1、主流程图
六、实现过程
1.提示输入年月
a)输入格式:
yyyy/mm
b)合法性检查:
1980≤yyyy≤2099,c)1≤mm≤12
d)年份字符串转换成二进制数保存到变量year,e)month中
f)其他需要定义的变量:
KBUF—键盘输入缓冲区
MSG1DB'Pleaseinputtheyear(1980-2099):
$'
MSG2DB'Pleaseinputthemonth(01-12):
$'
MSG0DB'Thecalender:
',10,13,'$'
CRDB10,13,'$'
YEARDW?
MONTHDB?
WEEKDB?
DAYDW?
2.显示月历
g)可采用成批显示的方法:
先填充,h)再用9号功能显示
i.定义字符串变量
YMdb‘yyyy.mm’,0DH,0AH
Headdb‘SunMonTueWedThuFriSat’,0DH,0AH
Line1db‘’,0DH,0AH
Line2db‘’,0DH,0AH
Line3db‘’,0DH,0AH
Line4db‘’,0DH,0AH
Line5db‘’,0DH,0AH,’$’
ii.往Line到Line5中填充当月日期(Fill_date)
iii.用9号DOS功能调用显示字符串YM
weeksdb'montuewedthufrisausun',0dh,0ah,'$'
3、每月有几天?
这涉及到填充多少个日期数字
1.计算出来后用一个变量保存:
days
2.计算方法:
a)1,b)3,c)5,d)7,e)8,f)10,g)12月:
31天
h)4,i)6,j)9,k)11月:
30天
l)2月:
闰年29天,m)非闰年28天。
计算每月日数:
DAYSPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVAL,MONTH
CMPAL,1
JEDD1
CMPAL,3
JEDD1
CMPAL,5
JEDD1
CMPAL,7
JEDD1
CMPAL,8
JEDD1
CMPAL,10
JEDD1
CMPAL,12
JEDD1
CMPAL,2
JEDD2
MOVDAY,30
JMPDD4
DD1:
MOVDAY,31
JMPDD4
DD2:
MOVBL,SIGN
CMPBL,0
JEDD3
MOVDAY,29
JMPDD4
DD3:
MOVDAY,28
DD4:
POPDX
POPCX
POPBX
POPAX
RET
DAYSENDP
4、给定的年份是否为闰年?
闰年的判别方法:
i.能够被100和400整除
ii.不iii.能被100整除,iv.但可以被4整除
闰月判定代码:
RUNNIANPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVAX,YEAR
MOVDX,0
MOVBX,100
DIVBX
CMPDX,0
JERR1
MOVBL,4
DIVBL
CMPAH,0
JERR2
MOVSIGN,0
RET
RR1:
MOVBX,400
DIVBX
CMPDX,0
JERR2
MOVSIGN,0;不是闰年
RET
RR2:
MOVSIGN,1;是闰年
POPDX
POPCX
POPBX
POPAX
RET
RUNNIANENDP
2月份的天数若是闰年则改为29。
iv.当月的1号是星期几?
这涉及到从星期几开始填充(每个日期占5个字节)
1.计算出来后用一个变量保存:
week
2.计算方法:
(适用于公元1582年以后的任意一年)
S=X-1+(X-1)/4-(X-1)/100+(X-1)/400+C
其中X是年份数,C是前几个月的总天数再加1(用days_of_month表计算)。
除法均取整数。
求出S后,除以7,余几就是星期几,即week=S%7。
v.上述两个值计算出来后,vi.就可以开始往Line中填充。
填充时需注意:
1.从week列开始顺序填充,2.填充days个日期;
3.每行填7个日期,4.但Line1只填充7-week个列;
5.每列占5个字节,6.将日期填在每列的第2、3字节处(SSddS)
5、主程序流程:
1.输入年月(含合法性检查和数值转换):
;-------输入年份
l:
SHOWMSG1
MOVCX,0
INPUTYEAR1000
INPUTYEAR100
INPUTYEAR10
INPUTYEAR1
MOVYEAR,CX
SHOWCR
;-------输入月份
SHOWMSG2
MOVCL,0
MOVAH,01H
INT21H
SUBAL,30H
MOVBL,10
MULBL
MOVCL,AL
MOVAH,01H
INT21H
SUBAL,30H
ADDCL,AL
MOVMONTH,CL
SHOWCR
MOVCX,YEAR
MOVDH,MONTH
MOVDL,1
MOVAH,2BH
INT21H
CMPAL,0FFH
JENEXT1
MOVAH,2AH
INT21H
MOVWEEK,AL
SHOWCR
JMPNEXT2
NEXT1:
SHOWERROR1
showCR
JMPL
NEXT2:
CALLRUNNIAN
CALLDAYS
2.显示月历(含填充和显示):
1.判别是否闰年:
2.修改days_of_month表:
闰年将2月天数改为29,否则改为28
3.计算当月的1号是星期几:
4.填充字符串:
qian:
pushax
movax,20h;输出空格
andax,00ffh
movdl,al
movah,2
int21h
loopqian
movAX,NUM
movah,0
movbx,ax
popcx
movcx,DAY
movax,1
;movbx,5
s:
;输出日期
cmpax,10
jlgewei
callupten
jmph
gewei:
pushax
pushcx
addax,30h
andax,00ffh
movdl,al
movah,2
int21h
movcx,4
k:
;输出字体间间隔的空格
movax,20h
andax,00ffh
movdl,ah
movah,2
int21h
loopk
popcx
popax
h:
incbx
cmpbx,7
jnew
callhuiche
w:
;定义断点
INCAX
loops
movax,4c00h
int21h
6、对月历显示程序的功能扩充设想:
1显示任意年份的年历(允许用户输入年份)。
2改为仿图形界面。
3增加打印功能(最好打印在一张纸上,4行3列)。
七、程序源代码:
datasegment
MSG1DB'Pleaseinputtheyear(1980-2099):
$'
MSG2DB'Pleaseinputthemonth(01-12):
$'
MSG0DB'Thecalender:
',10,13,'$'
CRDB10,13,'$'
YEARDW?
MONTHDB?
WEEKDB?
DAYDW?
NUMDW?
SIGNDB?
;SIGN=0表不是闰年
ERROR1DB'INSTALLERROR!
!
!
$'
huandb0dh,0ah,'$';回车换行
weeksdb'montuewedthufrisausun',0dh,0ah,'$'
dataends
SHOWMACROSTR
LEADX,STR
MOVAH,09H
INT21H
ENDM
INPUTYEARMACROX
MOVAH,01H
INT21H
SUBAL,30H
MOVAH,00H
MOVBX,X
MULBX
ADDCX,AX
ENDM
stacksegmentstack
db1024dup(?
)
stackends
codesegment
assumecs:
code,ds:
data,ss:
stack
mainprocfar
start:
pushds
xorax,ax
pushax
movax,data
movds,ax
movax,stack
movss,ax
MOVAH,0
MOVAL,03H
INT10H
MOVAH,06h;6号功能:
屏幕初始化或上卷
MOVAL,0;全屏幕为空白
MOVBH,1FH;卷入行属性(前景色、背景色之类的)
MOVCX,0;左上角行号/左上角列号
MOVDH,24;右下角行号
MOVDL,79;右下角列号
INT10h;调用BIOS
;-------输入年份
l:
SHOWMSG1
MOVCX,0
INPUTYEAR1000
INPUTYEAR100
INPUTYEAR10
INPUTYEAR1
MOVYEAR,CX
SHOWCR
;-------输入月份
SHOWMSG2
MOVCL,0
MOVAH,01H
INT21H
SUBAL,30H
MOVBL,10
MULBL
MOVCL,AL
MOVAH,01H
INT21H
SUBAL,30H
ADDCL,AL
MOVMONTH,CL
SHOWCR
MOVCX,YEAR
MOVDH,MONTH
MOVDL,1
MOVAH,2BH
INT21H
CMPAL,0FFH
JENEXT1
MOVAH,2AH
INT21H
MOVWEEK,AL
SHOWCR
JMPNEXT2
NEXT1:
SHOWERROR1
showCR
JMPL
NEXT2:
CALLRUNNIAN
CALLDAYS
SHOWMSG0
SHOWCR
leadx,weeks
movah,9
int21h
pushcx
MOVAL,WEEK
CMPAL,0
JENEXT3
DECAL
JMPNEXT4
NEXT3:
MOVAL,6
NEXT4:
MOVNUM,AX
MOVBL,5
MULBL
movcx,AX
qian:
pushax
movax,20h;输出空格
andax,00ffh
movdl,al
movah,2
int21h
loopqian
movAX,NUM
movah,0
movbx,ax
popcx
movcx,DAY
movax,1
;movbx,5
s:
;输出日期
cmpax,10
jlgewei
callupten
jmph
gewei:
pushax
pushcx
addax,30h
andax,00ffh
movdl,al
movah,2
int21h
movcx,4
k:
;输出字体间间隔的空格
movax,20h
andax,00ffh
movdl,ah
movah,2
int21h
loopk
popcx
popax
h:
incbx
cmpbx,7
jnew
callhuiche
w:
;定义断点
INCAX
loops
movax,4c00h
int21h
;--------------------------------------
RUNNIANPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVAX,YEAR
MOVDX,0
MOVBX,100
DIVBX
CMPDX,0
JERR1
MOVBL,4
DIVBL
CMPAH,0
JERR2
MOVSIGN,0
RET
RR1:
MOVBX,400
DIVBX
CMPDX,0
JERR2
MOVSIGN,0;不是闰年
RET
RR2:
MOVSIGN,1;是闰年
POPDX
POPCX
POPBX
POPAX
RET
RUNNIANENDP
;--------------------------------------
DAYSPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVAL,MONTH
CMPAL,1
JEDD1
CMPAL,3
JEDD1
CMPAL,5
JEDD1
CMPAL,7
JEDD1
CMPAL,8
JEDD1
CMPAL,10
JEDD1
CMPAL,12
JEDD1
CMPAL,2
JEDD2
MOVDAY,30
JMPDD4
DD1:
MOVDAY,31
JMPDD4
DD2:
MOVBL,SIGN
CMPBL,0
JEDD3
MOVDAY,29
JMPDD4
DD3:
MOVDAY,28
DD4:
POPDX
POPCX
POPBX
POPAX
RET
DAYSENDP
;---------------------------------------
huicheprocnear;当输出七个数后回车换行
pushax
leadx,huan
movah,9
int21h
movbx,0
popax
ret
huicheendp
;-------------------------------
uptenprocnear;当输出的数为两位数时
pushax
pushcx
pushbx
movcl,10
divcl
addax,3030h
movbx,ax
movdl,bl
movah,02h
int21h
movdl,bh
movah,02h
int21h
popbx
popcx
pushcx
movcx,3
kong:
movax,20h
andax,00ffh
movdl,ah
movah,2
int21h
loopkong
popcx
popax
ret
uptenendp
mainendp
codeends
endstart
八、结果显示
初始界面:
键入正确的年份后:
键入正确年份和月份后:
输入年份/月份出错:
八、感想、收获及体会
在本次课程设计中遇到的一些问题:
1、对于文件的打开中存在一些问题:
因为本次课程设计中显示的大概模式是一个记事本,所以窗口中有人为的“画”上一个边框,但是在打开一个文件,读取并显示在屏幕上时就出现了问题。
因为本次课设的DOS窗口使用的是80x25的16色文本,每一行除却左右两边的边框只有78列,而对于所要打开的文件如果一次读取的字节数超过78的话,则文件中的内容在在屏幕上显示的时候会将边框覆盖。
如果每次限制读取的字节数在78以内,然后每次光标定位的每一行的行首,这样的话,又会出现这样的问题:
如果第一次读的78个字节中有回车换行的话,在屏幕中显示的时候它会自动回车换到第二行,同样将边框覆盖,而且在第二次读的时候重新定位到第二行的行首,这样将上次所读出的字符给覆盖了。
对此,由于时间以及个人能力的限制,这个问题被暂时解决了而不是完美的解决:
所读取的文件中不适用回车Enter,所需要的间隔用空格来填充。
2、多次使用BIOS功能,其中感触最深的一点是使用16H的0号功能从键盘获得字符,这个与DOS功能中的21H中的1号功能从键盘输入字符最大的区别就是21H中1号功能是返回的是输入字符的ASCII码,是区分大小写的,这给输入字符时造成了极大的不方便;当然16H的0号功能返回的是字符的扫描码和字符码。
3、程序中本来对于选中所有的子菜单(除edit外)的响应是一致的,但是后来将新建和打开的功能修改了一下,加了两个子程序结果有时候Help菜单的子菜单的显示和选择就会出现问题,但是这个问题还是时有时无,因此让人很是苦恼;对于保存功能也稍修改了一下,但是对于保存功能,只要修改Help菜单的子菜单的选择就必出现问题,但碍于找不到原因,只好把这个功能不做修改。
4、程序中输入向下的方向键(即↓)时,本来功能设置的是打开子菜单(子菜单未打开时)或向下移动选中子菜单(子菜单已打开时),但是这个功能却不能用,对此我研究思考了许久,还是未能找出原因,只好先将这个问题放置到了一边,还望老师见谅。
当然了,实际上这个程序做的并不是很尽善尽美,程序中还存在着一些问题,但是毕竟世界上没有十全十美的东西,所以我们只能尽可能的做到最好。
收获以及体会:
通过此次课程设计,我更加体会到了使用DEBUG调试程序的好处。
以前程序短,差不多就一百多行,我可以一句一句的分析、找错,但是课程设计动辄几百行,甚至这次课设我的程序达到了一千多行,对于这样大的一个程序一句一句分析显然是不太显示的事情,这就体现了DEBUG的好处,也更显示了DEBUG的重要性。
通过此次课程设计,我学到了很多,因为很多东西在学习课本时是不做要求的,但是课程设计中却要用到。
比如说文件的打开、新建、写、读和移动指针,我们在学习课本时这一章根本就没有讲到但是这里却要用到,这就需要我们自学。
再比如BIOS的一些功能,我们平常用的汇编基本上全是只有黑白版本的,但是通过使用BIOS中的10H的0号功能,通过设置AL的值设置DOS窗口的显示方式,通过设置BH的值可以设置字符属性等等。
再比如说结构体,当然了本次课程设计中并没有用到结构体但是在查找资料时也稍微学习了解了一下。
当然了,在本次程序中我体会最深的还是与同学的互相帮助,虽然说我们要独立完成自己的课设,但是这并不代表我们遇到问题解决不了的时候就还要自己一个在在那苦思冥想,可能你只是钻到了死胡同里出不来,那样的话你想一个小时、一天、一个星期也许都想不出来,而旁观者清当局者迷,可能别人的一句话就解决了你的问题。
而且在帮助别人的时候我们自己也能学到很多东西,搞清楚很多可能以前自己也不是很清楚的知识点。
所以说独立虽好,但若光是闭门造车的话也不行,我们要多与同学交流。
总而言之,这次课程设计告诉我们学习不要只是局限于课本,局限于老师课堂上讲的知识,我们要学会利用身边一切的资源学习这门语言,这样才能学好一门语言。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 课程设计 月历 显示 程序