自动判断闰年_第1页
自动判断闰年_第2页
自动判断闰年_第3页
自动判断闰年_第4页
自动判断闰年_第5页
已阅读5页,还剩23页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录

摘要............................................................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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论