汇编课程设计星期判断Word格式文档下载.docx
《汇编课程设计星期判断Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《汇编课程设计星期判断Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
四、程序源代码
stacksSEGMENTstack
DB200DUP(0)
stacksENDS
datasegment
Yeardw0
Monthdb0
Daydb0
tempdb10dup(0)
countdw?
ErrMsgdb0dh,0ah,'
Inputwrong!
pleaseinputagain!
'
'
$'
str1db0dh,0ah,'
pleaseinputyearmonthday:
0dh,0ah,'
$'
str2db0dh,0ah,'
WhetherornottocontinueinquiriesYes/No'
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;
输入你的选择(键盘输入并回显)
cmpal,'
Y'
jestart
y'
;
输入y或Y继续程序
N'
jeexit
n'
输入n或N退出程序
jmpsel
exit:
movah,4ch
int21h;
退出
;
主程序
GetYearMonthDayprocnear;
子程序输入正确的年月日
pushax
pushcx
pushsi
pushdi;
压栈
inputagain:
movYear,0
movMonth,0
movDay,0
movsi,0;
把年月日重新归零
repeatY:
输入年
cmpal,0dh;
换行
jeEndY;
回车结束年的输入
cmpal,20h;
判断是否是是空格键SP
空格结束年的输入
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,2;
显示输出
movdl,0dh
movdl,0ah
回车
jmpinputagain;
跳回到inputagain重新输入年月日
EndY:
movbx,10;
把10存入bx
movdi,si;
把si的值传给di
再把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
si自加1
cmpsi,di;
比较si和di
jneNextYBit;
不相等转移
主要实现把年按千位,百位,十位,各位存放
pushdx
movah,2
movdl,0dh;
movdl,0ah;
popdx
jmpskiplap;
跳到月的输入
ExitDos0:
jmpExitDos;
skiplap:
si清零
repeatM:
输入月数
cmpal,0dh
jeEndMon;
cmpal,20h
空格结束输入
cmpal,1bh
jeExitDos1;
ESC退出程序
cmpal,30h
jbErr1;
小于0报错
cmpal,39h
jaErr1;
大于9报错
转为二进制存贮
movtemp[si],al;
jmprepeat;
重新输入下一个字符
Err1:
jmpErr
ExitDos1:
jmpExitDos
EndMon:
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报错
把月按十位,各位存贮
jmpskiplap1
skiplap1:
movsi,0
repeatD:
movah,1
jeEndDay;
jeExitDos;
jbErr2;
jaErr2
jmprepeatD;
Err2:
jmpErr1
EndDay:
NextDBit:
jcxzskipD
lpmul1:
looplpmul1
skipD:
addDay,al
jneNextDBit
callGetrightday;
调用子程序确定每个月的最大天数
moval,[si];
把寄存器si中的值存入al
cmpDay,al;
用输入的day和al比较
jaErr2;
若day大于al则报错
把日按十位,各位存贮
popdi
popsi
popcx
popax
ret
ExitDos:
GetYearMonthDayendp
************闰年**********
Getrightdayprocnear;
此子程序用来判断年份是否为闰年
pushbx;
保存寄存器状态
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
movcc,dx;
把此刻的余数赋给cc,便于后面天数计算
jnzlab2;
不为100的倍数,则为闰年
再判断是否为400的倍数
movbx,400
mov