版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录
摘要............................................................1
1概述............................................................2
2程序设计......................................................2
2.1系统程序综述...........................................................2
2.2各模块框图.............................................................2
3具体设计......................................................6
3.1各模块说明.............................................................6
3.2各模块具体设计.........................................................7
4程序调试......................................................10
4.1运行界面分析..........................................................10
4.2调试过程及分析........................................................13
5心得体会......................................................14
附录程序清单..................................................15
参考文献........................................................25
本科生课程设计成果评定表.......................................26
摘要
随着电子技术的进展,计算机在现代科学技术的进展中起着越来越重要的作
用。多媒体技术、网络技术、智能信息处理技术、自适用掌握技术、数据挖掘与
处理技术等都离不开计算机。在此设计中采用DOS21H中断类型的10号键盘功
能调用,将从键盘接收的表示年份数值的字符串按字节存入缓冲区。将字符串中
的每个字符转换为对应的十进制数值(采用0—9这10个数的ASCII码值比其本
身大30H的关系),采用推断某年是否为闰年的表达式,输出该年是否为闰年的
信息。
解决本问题的关键是找到推断闰年的方法。推断闰年的规章是:假如某一年
能被4整除但不能被100整除或者该年能被400整除,则该年为闰年。
推断某年是否为闰年的汇编语言的表达式为:
(((AX)MOD4EQ0)AND((AX)MOD100NEO))OR((AX)
MOD400EQ0)
本课程设计的主程序依据以上的表达式设计的,而且创新地增加了推断该年
份的生肖属性模块。
关键词:闰年汇编语言微机原理中断
推断闰年
1概述
本次课程的内容是采用DOS21H中断类型的10号键盘功能调用,将健盘
接受到的年份数值的字符串按字节存入缓冲区。将字符串中的每个字符转换为对
应的十进制数值(采用0-9这10个数的ASCH码值比其本身大30H的关系),
采用推断某年是否为闰年的表达式,输入该年是否为闰年的信息。要求输入具体
的年份后,输出是否为闰年的提示信息,并且可接着输入年份连续推断,按Q
或q键退出程序。由于此程序比较简洁,我们对输入的年份限定了一个范隹I,当
所输入的年份超出这个范围,或者输入的根本就不是年份时,系统就会提示错误
并重新输入。此外增加了一段推断所输入的年份的生肖属性模块。当输入2022
年时,dos界面会显示“2022isayearofHorse
2.程序设计
2.1系统程序综述
闰年的具体算法为:假如该年份的数值能被4整除却不能被100整除,或者
该年份的数值能被400整除,则该数值代表的年份为闰年。推断生肖年的核心算
法为:用该年份的数值除以12,若余数为0,则说明是猴年,以此类推。
2.2各模块框图
此程序虽然不难,但也不是很短,因此为了让程序条理清楚,我们将整段程
序分为四个模块:MAIN、INPUT、JUDGE及WHICHYEAR。各模块的程序流
程图分别如图2-1、2-2.2-3及2-4所示。
图2TMAIN模块流程图
图2-2INPUT模块流程图
N
是闺年y——<是否整除?:>
图2-3JUDGE模块流程图
开始
将所输入的年份存入AX
用AX除以12
对应属相字符串地址
输出显示属相的名称
_1[__
f结束:
图2-4WHICHYEAR模块流程图
3具体设计
3.1各模块说明
主模块MAIN用来显示提示输入以及输入的字符内容,最终输出做出的推断
并确定是否退出程序;INPUT子模块用来将数字字符串转换为数字,以便进行
下面的程序操作,同时对输入的年份格式进行推断,若格式错误则输出4Input
illegal!’,并要求重新输入年份;JUDGE子模块用来推断所输入的年份是否为闰
年,若输入闰年2000则输出42000isleapyear!',若输入非闰年1900则输出'1900
isnotle叩year!';WHICHYEAR子模块用来推断所输入的年份是什么生肖年,
若输入2022则输出'2022isayearofRabbit!
3.2各模块具体设计
在主模块MAIN中分别调用三个子模块INPUT、JUDGE、WHICHYEAR,
做出推断后显示是否退出的提示信息,按下任意键连续,按下Q或q键则退出程
序。
MAIN主模块的部分程序代码如下。
LOPO:
CALLINPUT
CALLJUDGE
CALLWHICHYEAR
LEADX,MESS
MOVAH,09H
INT21H
MOVAH,08H
INT21H
CMPAL/Q'
JEEXIT
CMPAL,'q'
JEEXIT
LEADX,NEWLINE;回车、换行
MOVAH,09H
INT21H
JMPLOPO
INPUT子模块首先推断输入的年份是否正确,由于我们的要求是从190()年
到210()年,因此输入的年份必需是4位的,若不是系统会提示错误,这个功能
由以下程序代码完成。
MOVDL,BYTEPTRINBUFFfl]
CMPDL,4
JNEERROR
此外,推断所输入的年份是否在19()0年到2100年之间的程序代码如下。
CMPAXJ900
JBERROR
CMPAX,2IOO
JAERROR
JMPS2
由于输入的年份是字符串,因此需要转换为数。数字所对应的ASCII值与他
们相差30H,所以只需要将所输入的字符减30H就可以得到相应的数值。若输入
的是非数字,那么经转换后得到的数值就不再0到9之间,此时系统会提示错误。
LOP1:
MOVDLJ0
MULDL
MOVDL,BYTEPTR[BX]
SUBDL,30H
CMPDL,0
JBERROR
CMPDL,9
JAERROR
ADDAX,DX
INCBX
LOOPLOP1
JUDGE子模块用来推断所输入的年份是否为闰年,先用转换后的数值除以
4,若不能整除,则确定不是闰年,若可以整除贝!再用其除以100,若不能整除,
则确定是闰年,若能整除则说明不是闰年。最终用转换后的数值除以400,若可
以整除,则确定是闰年,否则就不是闰年。其核心算法如下。
MOVDX,0
MOVCX,AX
MOVBX,4
DIVBX
CMPDX,()
JNENOTLEAP
MOVAX,CX
MOVBXJOO
DIVBX
CMPDX,0
JNEISLEAP
MOVAX,CX
MOVBX,4(X)
DIVBX
CMPDX,0
JNENOTLEAP
在WHICHYEAR子模块中,用转换后的数值除以12,若余数为0,则说明
是猴年;若余数是1,则说明是鸡年;若余数是2,则说明是狗年,以此类推。
LOP3:
MOVDL,BYTEPTR[BX]
MOVAH,02H
INT2IH
INCBX
LOOPLOP3
POPAX
MOVDX,0
MOVBXJ2
DiVBX
CMPDX,0
JEMONKEYYEAR
CMPDXJ
JEROOSTERYEAR
CMPDX,2
JEDOGYEAR
CMPDX3
JEBOARYEAR
CMPDX,4
JERATYEAR
CMPDX,5
JEOXYEAR
CMPDX,6
JETIGERYEAR
CMPDX,7
JERABBITYEAR
CMPDX,8
JEDRAGONYEAR
CMPDX,9
JESNAKEYEAR
CMPDXJO
JEHORSEYEAR
JMPGOATYEAR
4程序调试
4.1运行界面分析
执行程序后的初始界面如图4-1所示。
C:\fIMDOfS\syste«32\od.exe-Exl
Pleaseinputtheyeai»<1900-2100>:
图4-1
输入年份2022后执行程序,界面如图4-2所示。
C:\fINDO¥S\systea32\cBd.eze-I°|x|
leaseinputtheyear<1,900-2100〉:19ab
nputillegal?
pleaseinputtheyear<^00^2^0^20O
2014isnotleapyear?
|2H14sayeai'oft.he
Ifyout;anttoquitpleaseress...q.
Pressotherkeytocontinue!
图4-2
此时按下除Q和q的任意键可以连续执行程序,输入年份1900后再次执行
程序,界面如图4-3所示。
C:\¥Hn)0¥S\syste»32\c»d.exe
leasejinput._theyear<1900-2100>:[L9ab
putillegal?
p1ea
20l4inputtheyear<1900-2100>:2014
―
20l4notleapyear?
ayearoftheHorse?
Ifyouwanttoquitpleaseress...q/Q...
Pressotherkeutocontinue
Pleaseinputtheyear<1900-2100〉
1900isnotleapyear?
1900isauearoftheRat?
Ifyouwanttoquitplease
PressotherkeytocontinueHHHHMHHHi
图4-3
按下除Q和q的任意键可以连续执行程序,若此时输入的年份不是4位数的
或者输入的是字母、符号等,系统会提示错误并要求重新输入,界面如图4-4所
示。
图4-4
输入了正确格式的年份后连续执行程序,然后按下Q或者q可以退出程序。
4.2调试过程及分析
最初在调试时,大部分的年份都可以推断正确,但对于1900、2000、2100
等这些特殊年份,有时候推断正确有时候推断错误。后来经过检查发觉是JUDGE
子模块程序错误,经过长时间的修改后,排解了错误,可以止确推断闰年。
后来在程序中加入了WHICHYEAR子模块后再调试时,发觉不管输入哪个
年份,推断得到的都是猴年。检查后发觉是由于在执行JUDGE子模块后AX寄
存器的值为0,用0去除以12后得到的余数总是0,因此得到的都是猴年。在
JUDGE子模块中加入了一对PUSHAX和POPAX后顺当解决了此问题。
5心得体会
这是我其次次做课程设计,经过第一次的熬炼,我对课程设计的基本要
求有了更清楚的了解C在设计的过中仍旧遇到了许多问题,但最终通过自己的
思索与询问他人,我胜利的完成了整体设计要求。通过前期自己查资料,思索
课题,我学到了许多课外的学问。经过几天的修改,我完成了要求的设计方案,
画出了设计流程图。接下来我依据流程图完成了程序的编写,程序编完后用了
一段时间对程序进行调试。在调试的过程中,我遇到了一些问题,刚开头程序
并不能很好的运行,经过错误分析与不断修改,最终解决了问题,程序能够正
常运行并输出正确的结果。通过本次试验,我对循环语句、分支语句和子程序
有了进一步的了解,明确了它们各自的功能及具体的运用状况。特殊是在子程
序设计时,应认真考虑哪些寄存器是必需保存的,哪些寄存器是不必要或不应
当保存的。一般说来,子程序中用到的寄存器是应当保存的。但是,假如使用
寄存器在主程序和子程序之间传送参数的话,则这种寄存器就不肯定需要俣存,
特殊是用来向主程序回送结果的寄存器,就更不应当因保存和恢复而破坏了应
当向主程序传送的信息。在试验中体现出对指令不娴熟,因此应当在以后的学
习中进一步的学习,编出实现功能更好的,让自己满足的程序来。
经过这次课程设计,大大地提高了我的分析解决问题的力量,在这一过程中,
我依据课程设计题目所给定的总题要求,独立设计、分析和调试程序,在面对问
题时,能够急躁思索,解决了许多问题,从中也学到了许多书面上所没有讲明的
问题。在运用汇编语言理论学问去解决问题时,也对以前学过的学问点有更深一
层的了解。总之,这次课程设计,让我学到了许多有用的学问,对我以后的学习
有很大的关心与提高。而且我深刻地熟悉到学好专业学问的重要性,也理解了理
论联系实际的含义,并且检验了自己的学习成果。设计的整个过程,熬炼了我们
的思索与运用的学问力量,并旦学习到做讨论的急躁与专注力,要有一丝不苟的
态度,科学不行有半点马虎。这次设计,让我熟悉到自己对于学问的运用和连接
还不够娴熟,我将在以后的学习中连续努力、不断完善,为今后的进展打下了良
好的基础。
附录程序清单
DATASEGMENT
INBUFFDB5,?,5DUP(?)淀义输入缓冲区
PROMPTDB0DH,0AH,'Pleaseinputtheyear(l900-2100):','$'
ERRMSGDB'Inputillegal!\'$'
YESDB'isleapyearS'/S'
NODBrisnotleapyear!';$'
MESSDB'Ifyouwanttoquitpleasepress...q/Q...,
DB0AH,0DH,'Pressotherkeytocontinue','$'
NEWLINEDB13,10,$
ZlDB*isayearoftheRabbit!',0DH,0AH,$
Z2DB'isayearoftheDragon!',0DH,0AH/$'
Z3DB'isayearoftheSnake!1,0DH,0AH;$'
Z4DB,isayearoftheHorse!1,0DH,0AH,'$'
Z5DB1isayearoftheGoat!',0DH,0AH,'$'
Z6DB*isayearoftheMonkey!',0DH,()AH,$
Z7DB*isayearoftheRooster!*,0DH,0AH:$'
Z8DB,isayearoftheDog!,,0DH,0AH;$'
Z9DB,isayearoftheBoar!;0DH,0AH:$'
ZI0DB*isayearoftheRat!',0DH,0AH,'$'
ZllDB'isayearoftheOx「,0DH,0AH,$
Z12DB*isayearoftheTiger!\0DH,0AH,'$'
DATAENDS
CODESEGMENT
MAINPROCFAR
ASSUMECS:CODE,DS:DATA
START:
PUSHDX
SUBAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
LOPO:
CALLINPUT,调用INPUT子模块
CALLJUDGE;调用JUDGE子模块
CALLWHICHYEAR;调用WHICHYEAR子模块
LEADX,MESS;显示提示信息
MOVAH,09H多字符输出
INT21H
MOVAH,08H;键盘输入无回显
INT21H
CMPAL:Q';输入Q或q退出程序
JEEXIT
CMPAL,'q'
JEEXIT
LEADX,NEWLINE;回车、换行
MOVAH,09H
1NT21H
.IMPLOPO
EXIT:
RET
MAINENDP
INPUTPROCNEAR
PUSHBX
PUSHCX
PUSHDX
SI:
LEADX,PROMPT;输入年份提示
MOVAH,09H
INT21H
LEADX,INBUFF
MOVAH,0AH
INT2IH
MOVDL,BYTEPTRINBUFF[I1;若输入的生份不是4为就退出程序
CMPDL,4
JNEERROR
MOVCX,4
LEABX,INBUFF
ADDBX,2
MOVAX,0
MOVDX,0
LOP1:
MOVDL,10
MULDL
MOVDL.BYTEPTR[BX]
SUBDL,30H输入字符的ASCII值减去3()H得到对应的数值
CMPDL,0;数值小于0则系统提示错误
JBERROR
CMPDL,9;数值大于9则系统提示错误
JAERROR
ADDAX,DX
INCBX
LOOPLOP1
CMPAXJ900;组合后的数值小于1900则系统提示错误
JBERROR
CMPAX,2100;组合后的数值大于2100则系统提示错误
JAERROR
JMPS2
ERROR:;系统提不错误信息
LEADX,NEWLINE
MOVAH,09H
INT2IH
LEADX,ERRMSG
MOVAH,09H
INT21H
LEADX,NEWLINE
MOVAH,09H
INT21H
JMPS1
S2:
MOVCX,AX
LEADX,NEWLINE
MOVAH,09H
INT21H
MOVAX,CX
POPDX
POPCX
POPBX
RET
INPUTENDP
JUDGEPROCNEAR
PUSHBX
PUSHCX
PUSHDX
PUSHAX
PUSHAX
MOVCX,4
LEABX,INBUFF
ADDBX,2
LOP2:
MOVDL,BYTEPTR[BX]
MOVAH,02H
INT21H
INCBX
LOOPLOP2
POPAX
MOVDX,0
MOVCX,AXN^AX中的值暂存在CX中
MOVBX,4
DIVBX;年份对应的数值除以4
CMPDX,0
JNENOTLEAP
MOVAX,CX
MOVBXJOO;年份对应的数值除以10()
DIVBX
CMPDX,0
JNEISLEAP
MOVAX,CX
MOVBX,400;年份对应的数值除以400
DIVBX
CMPDXQ
JNENOTLEAP
ISLEAP:;显示闰年提示信息
LEADX,YES
MOVAH,09H
INT21H
JMPS3
NOTLEAP:;显示非闰年提示信息
LEADX,NO
MOVAH,09H
INT2IH
S3:
LEADX,NEWLINE
MOVAH,09H
INT21H
POPAX
POPDX
POPCX
POPBX
RET
JUDGEENDP
WHICHYEARPROCNEAR
PUSHBX
PUSHCX
PUSHDX
PUSHAX
MOVCX,4
LEABX.INBUFF
ADDBX,2
LOP3:
MOVDL,BYTEPTR[BX]
MOVAH,02H
INT21H
INCBX
LOOPLOP3
POPAX
MOVDX,0
MOVBX,12
DIVBX,年份对应的数值除以12
CMPDX,0;余数为0则为猴年
JEMONKEYYEAR
CMPDX,1;余数为1则为鸡年
JEROOSTERYEAR
CMPDX,2;余数为2则为狗年
JEDOGYEAR
CMPDX,3;余数为3则为猪年
JEBOARYEAR
CMPDX,4;余数为4则为鼠年
JERATYEAR
CMPDX,5;余数为5则为牛年
JEOXYEAR
CMPDX,6;余数为6则为虎年
JETIGERYEAR
CMPDX,7;余数为7则为兔年
JERABBITYEAR
CMPDX,8;余数为8则为龙年
JEDRAGONYEAR
CMPDX,9;余数为9则为蛇年
JESNAKEYEAR
CMPDXJO;余数为1()则为马年
JEHORSEYEAR
JMPGOATYEAR;否则,则为羊年
MONKEYYEAR:;显示猴年提示信息
LEADX.Z6
MOVAH,09H
INT21H
JMPS4
ROOSTERYEAR;,显示鸡年提示信息
LEADX,Z7
MOVAH,09H
INT21H
JMPS4
DOGYEAR:;显示狗年提示信息
LEADX,Z8
MOVAH,09H
INT2IH
JMPS4
BOARYEAR:;显示猪年提示信息
LEADX.Z9
MOVAH,09H
INT21H
JMPS4
RATYEAR:;显示鼠年提示信息
LEADX,Z10
MOVAH,09H
INT21H
JMPS4
OXYEAR:;显示牛年提示信息
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【完整版主题班会课件】交通安全教育主题班会课件
- 《石油天然气工程设计防火规范》解读
- 辽宁省鞍山市铁西区2026-2027学年9月上学期学情调查八年级英语试卷(含答案)
- 【2026年9月】健康科普课件:运动与饮食的黄金搭配
- 2026年燃气安检测试题及答案
- 2026年语言智力测试题及答案
- 2026年通信知识基础测试题及答案
- 2026年助学贷款诚信测试题及答案
- 2026年华卫 情商 测试题及答案
- 2026年保守知识测试题及答案
- 《踝关节撞击综合征》课件
- 《中西方哲学对比》课件
- 《成人无创通气设备相关面部压力性损伤风险评估与预防指南》解读课件
- 保险金信托协议模板
- 文明礼仪伴我行班会省公开课一等奖新名师比赛一等奖课件
- 竹节桩桩基施工方案预制静压桩样本
- 订购单模板(订货单模板)
- 广东省通用安装工程综合定额(2018)Excel版
- 前言 马克思主义中国化时代化的历史进程与理论成果
- 航空航天概论导弹系统
- 护理文书书写规范
评论
0/150
提交评论