汇编课程设计星期判断.docx
- 文档编号:856011
- 上传时间:2022-10-13
- 格式:DOCX
- 页数:17
- 大小:41.52KB
汇编课程设计星期判断.docx
《汇编课程设计星期判断.docx》由会员分享,可在线阅读,更多相关《汇编课程设计星期判断.docx(17页珍藏版)》请在冰豆网上搜索。
汇编课程设计星期判断
概述…………………………………………………………1
一 设计内容与要求………………………………………1
二 设计思想…………………………………………………1
三 程序流程图……………………………………………2
四 程序源代码……………………………………………3
五 设计过程中遇到的问题及解决方法……………………24
六 设计心得…………………………………………………24
星期判断程序
概述
判断星期程序是一个简单实用的应用程序,只要按程序要求,输入正确的年月日,该程序就会正确显示当天是星期几,当输入错误的年月日信息时,改程序会提示输入错误,并且提示重新输入,当一次输入操作完成后,按Y继续,按N结束。
一、设计内容与要求
输入年、月、日,能够判断当日的星期数,并进行输出。
(可设某年的1月1日为起点,
二、设计思想
年月日信息储在一个数据区里,并对年月日信息进行判断,看是否为正确的年月日信息,然后根据蔡勒公式W=[C/4]-2C+y+[y/4]+[13*(M+1)/5]+d–1(其中w:
星期;w对7取模得:
0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六;c:
世纪减1(年份前两位数);y:
年(后两位数);m:
月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:
日;[]代表取整,即只要整数部分。
)再通过调用,显示出来。
三、程序流程图
四、程序源代码
stacksSEGMENTstack
DB200DUP(0)
stacksENDS
datasegment
Yeardw0
Monthdb0
Daydb0
tempdb10dup(0)
countdw?
ErrMsgdb0dh,0ah,'Inputwrong!
pleaseinputagain!
','$'
str1db0dh,0ah,'pleaseinputyearmonthday:
',0dh,0ah,'$'
str2db0dh,0ah,'WhetherornottocontinueinquiriesYes/No',0dh,0ah,'$'
weekstr0db'TodayisSunday','$'
weekstr1db'TodayisMonday','$'
weekstr2db'TodayisTuesday','$'
weekstr3db'TodayisWednesday','$'
weekstr4db'TodayisThursday','$'
weekstr5db'TodayisFriday','$'
weekstr6db'TodayisSaturday','$'
adw?
bdw?
ccdw?
ddw?
wdb?
dataends;定义了变量和信息
codesegment
assumecs:
code,ds:
data,ss:
stacks
start:
movax,data
movds,ax
leadx,str1;提醒你输入年月日
movah,9h;显示字符串
int21h
callGetYearMonthDay;调用子程序输入正确的年月日
calldisplay;调用子程序通过计算得出星期
sel:
leadx,str2;提醒你选择退出程序还是继续
movah,9h
int21h
movah,1;输入你的选择(键盘输入并回显)
int21h
cmpal,'Y'
jestart
cmpal,'y';输入y或Y继续程序
jestart
cmpal,'N'
jeexit
cmpal,'n';输入n或N退出程序
jeexit
jmpsel
exit:
movah,4ch
int21h;退出
;主程序
GetYearMonthDayprocnear;子程序输入正确的年月日
pushax
pushcx
pushsi
pushdi;压栈
inputagain:
movYear,0
movMonth,0
movDay,0
movsi,0;把年月日重新归零
repeatY:
movah,1;输入年
int21h
cmpal,0dh;换行
jeEndY;回车结束年的输入
cmpal,20h;判断是否是是空格键SP
jeEndY;空格结束年的输入
cmpal,1bh;判断是否是退出ESC
jeExitDos0;退出键则退出程序
cmpal,30h;和0比较
jbErr;小于0转到错误提示
cmpal,39h;和9比较
jaErr;大于9转到错误提示
subal,30h;把读入的数据转化为二进制保存到temp[si]中
movtemp[si],al
incsi;si加1
jmprepeatY
Err:
;出错调用
leadx,ErrMsg;提示错误
movah,9h
int21h
movah,2;显示输出
movdl,0dh
int21h;换行
movdl,0ah
int21h;回车
jmpinputagain;跳回到inputagain重新输入年月日
EndY:
movbx,10;把10存入bx
movdi,si;把si的值传给di
movsi,0;再把si清零
NextYBit:
movah,0
moval,temp[si];再把存在temp[si]中的数据存入al
movcount,di;把di中的转到count
subcount,si;count=count-si
deccount;count-1
movcx,count;把自减后的count存入cx
jcxzskipY;cx为0转移
lopmul:
mulbx;*10,主要实现把年按千位,百位,十位,各位存放
looplopmul;cx-1循环
skipY:
addYear,ax;把ax中存入的年的值赋给year
incsi;si自加1
cmpsi,di;比较si和di
jneNextYBit;不相等转移
;主要实现把年按千位,百位,十位,各位存放
pushdx
movah,2
movdl,0dh;换行
int21h
movdl,0ah;回车
int21h
popdx
jmpskiplap;跳到月的输入
ExitDos0:
jmpExitDos;退出
skiplap:
movsi,0;si清零
repeatM:
movah,1;输入月数
int21h
cmpal,0dh
jeEndMon;换行
cmpal,20h
jeEndMon;空格结束输入
cmpal,1bh
jeExitDos1;ESC退出程序
cmpal,30h
jbErr1;小于0报错
cmpal,39h
jaErr1;大于9报错
subal,30h;转为二进制存贮
movtemp[si],al;把读入的数据转化为二进制保存到temp[si]中
incsi;si加1
jmprepeat;重新输入下一个字符
Err1:
jmpErr
ExitDos1:
jmpExitDos
EndMon:
movdi,si;把si的值传给di
movsi,0;再把si清零
movbl,10;把10存入bl
NextMBit:
moval,temp[si]
movcount,di
subcount,si
deccount
movcx,count
jcxzskipM
lpmul:
mulbl
looplpmul
skipM:
addMonth,al
incsi
cmpsi,di
jneNextMBit
cmpMonth,12;大于12报错
jaErr1;把月按十位,各位存贮
pushdx
movah,2
movdl,0dh;回车
int21h
movdl,0ah;换行
int21h
popdx
jmpskiplap1
skiplap1:
movsi,0
repeatD:
movah,1
int21h
cmpal,0dh
jeEndDay;换行
cmpal,20h
jeEndDay;空格结束输入
cmpal,1bh
jeExitDos;ESC退出程序
cmpal,30h
jbErr2;小于0报错
cmpal,39h;大于9报错
jaErr2
subal,30h;转为二进制存贮
movtemp[si],al;把读入的数据转化为二进制保存到temp[si]中
incsi;si加1
jmprepeatD;重新输入下一个字符
Err2:
jmpErr1
EndDay:
movdi,si;把si的值传给di
movsi,0;再把si清零
movbl,10;把10存入bl
NextDBit:
moval,temp[si]
movcount,di
subcount,si
deccount
movcx,count
jcxzskipD
lpmul1:
mulbl
looplpmul1
skipD:
addDay,al
incsi
cmpsi,di
jneNextDBit
callGetrightday;调用子程序确定每个月的最大天数
moval,[si];把寄存器si中的值存入al
cmpDay,al;用输入的day和al比较
jaErr2;若day大于al则报错
;把日按十位,各位存贮
pushdx
movah,2
movdl,0dh
int21h
movdl,0ah
int21h
popdx
popdi
popsi
popcx
popax
ret
ExitDos:
movah,4ch
int21h
GetYearMonthDayendp
;************闰年**********
Getrightdayprocnear;此子程序用来判断年份是否为闰年
pushbx;保存寄存器状态
pushcx
pushdx
movsi,offsetw
movax,Year
movcx,ax;把转换后的年份的数值存入cx
movdx,0;计算年份是否为4的整数倍
movbx,4
divbx
movb,dx;把此刻的余数赋给b,便于后面天数计算
cmpdx,0
jnzlab1;不能被4整除,不为闰年
movax,cx;接着判断年份是否为100的倍数
movbx,100
divbx
movcc,dx;把此刻的余数赋给cc,便于后面天数计算
cmpdx,0
jnzlab2;不为100的倍数,则为闰年
movax,cx;再判断是否为400的倍数
movbx,400
divbx
mov
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 课程设计 星期 判断