




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持闰年判断主要代码Getrightday proc near ;此子程序用来判断年份是否为闰年push bx ;保存寄存器状态push cxpush dxmov si, offset wmov ax,Yearmov cx,ax ;把转换后的年份的数值存入cxmov dx,0 ;计算年份是否为 4的整数倍mov bx,4div bxmov b, dx ;把此刻的余数赋给b,便于后面天数计算cmp dx,0jnz lab1 ;不能被4整除,不为闰年mov ax,cx ;接着判断年份是否为100的倍数mov bx ,100div bxmov
2、cc,dx ;把此刻的余数赋给cc,便于后面天数计算cmp dx,0jnz lab2 ;不为100的倍数,则为闰年mov ax,cx ;再判断是否为400的倍数mov bx,400div bxmov d,dx ;把此刻的余数赋给d,便于后面天数计算cmp dx,0jz lab2 ;为400的倍数,则为闰年闰年判断流程图蔡勒(Zeller)公式主要代码dec yearmov ax,yearmov cx,ax ; year 自减 1 再存入 cxmov dx,0mov bl ,4div bxadd cx,ax ;把丫-1/4 的商加入 cxxor ax,axxor bx,bxmov ax ,yea
3、rmov dx,0mov bl ,100div bxsub cx,ax ;用cx中的值减去Y-1/100的商xor ax,axxor bx,bxxor dx,dxmov ax ,yearmov bx,400div bxadd cx,ax ;把丫-1/400 的商加入 cxxor ax,axmov dx,0mov bx,0inc monthmov al,monthmov bl, 13mul bl ;月加1后乘以13xor bx,bxmov bl ,5div bxadd cx,ax ;把上面得到的月除以5取整加入cx蔡勒(Zeller)公式运用流程图说明:是只把前面得出的结果赋值给后者a的值和星期
4、的对应关系a 的值 0 1 2 3 4 5 6星期星期日星期一星期二星期三星期四星期五星期六五、程序源代码stack SEGMENT stack DB 200 DUP(0) stack ENDS data segment Year dw 0 Month db 0 Day db 0 temp db 10 dup (0) count dw ?0dh,0ah,'$'ErrMsg db 0dh,0ah,'Input wrong!please input again!',' $' str1 db 0dh,0ah,'please input year
5、 month day:' 0dh ,0ah,'$' str2 db 0dh,0ah,'Whether or not to continue inquiries Yes/No', weekstr0 db 'Today is Sunday','$'weekstr1 db 'Today is Monday','$' weekstr2 db 'Today is Tuesday','$' weekstr3 db 'Today is Wednesday',
6、*' weekstr4 db 'Today is Thursday','$' weekstr5 db 'Today is Friday','$' weekstr6 db 'Today is Saturday','$' a dw ? b dw ? cc dw ? d dw ? w db ? data ends ;定义了变量和信息code segmentassume cs: code ,ds: data ,ss: stackstart :mov ax,datamov ds,axlea dx, s
7、trl ;提醒你输入年月日mov ah,9hint 21 h ;显示字符串call GetYearMonthDay ;调用子程序输入正确的年月日call display ;调用子程序通过计算得出星期sel: lea dx,str2 ;提醒你选择退出程序还是继续mov ah,9hint 21 hmov ah,1 ;输入你的选择(键盘输入并回显)int 21 hcmp al,'Y'je startcmp al,'y'输入y或Y继续程序je startcmp al,'N'je exitcmp al,'n'输入n或N退出程序je exit
8、jmp selexit :mov ah,4ch主程序int 21 h ;退出* ;GetYearMonthDay proc near ;子程序输入正确的年月日push axpush cxpush sipush di ;压栈inputagain :mov Year,0mov Month ,0mov Day ,0mov si, 0 ;把年月日重新归零repeatY :mov ah,1 ;输入年int 21 hcmp al, 0dh ;换行je EndY ;回车结束年的输入cmp al,20h ;判断是否是是空格键SPje EndY ;空格结束年的输入cmp al, 1bh ;判断是否是退出 ESC
9、je ExitDosO ;退出键则退出程序cmp al, 30h ;和 0 比较jb Err ;小于0转到错误提示cmp al, 39h ;和 9 比较temp si中ja Err ;大于9转到错误提示sub al,30 h ;把读入的数据转化为二进制保存到mov temp si, alinc si ; si 力口 1jmp repeatYErr: lea dx,ErrMsg ;提示错误mov ah,9hint 21 h16文档收集于互联网,如有不妥请联系删除mov ah,2 ;显示输出mov dl,0dhint 21 h ;换行mov dl ,0ahint 21 h ;回车jmp input
10、again ;跳回到 inputagain 重新输入年月 日EndY:mov bx ,10 ;把 10 存入 bxmov di ,si ;把si的值传给 dimov si, 0 ;再把si清零NextYBit :mov ah,0mov al,temp si;再把存在temp si中的数据存入 almov count, di ;把 di 中的转至1J countsub count, si ; count=count- sidec count ; count- 1mov cx,count ;把自减后的 count 存入 cxjcxz skipY ; cx 为 0 转移lopmul :mul bx
11、; * 10,主要实现把年按千位,百位,十位,各位存放loop lopmul ; cx-1 循环skipY:add Year ,ax ;把ax中存入的年的值赋给yearinc si ; si 自力口 1cmp si, di ; 比较 si 和 dijne NextYBit ;不相等转移; 主要实现把年按千位,百位,十位,各位存放push dxmov ah,2mov dl ,0dh ;换行int 21 hmov dl ,0ah ;回车int 21 hpop dxjmp skiplap ;跳到月的输入ExitDos0 :jmp ExitDos ;退出skiplap :mov si, 0 ; si
12、清零repeatM :mov ah,1 ;输入月数int 21 hcmp al, 0dhje EndMon ;换行cmp al,20hje EndMon ;空格结束输入cmp al, 1bhje ExitDos1 ;ESC 退出程序cmp al,30hjb Err1 ;小于0报错cmp al,39hja Err1 ;大于9报错sub al,30 h ;转为二进制存贮mov temp si, al ;把读入的数据转化为二进制保存到temp si中inc si ; si 力口 1jmp repeatM ;重新输入下一个字符Err1 : jmp ErrExitDos1 : jmp ExitDosEn
13、dMon :mov di ,si ;把si的值传给 dimov si, 0 ;再把si清零mov bl ,10 ;把 10 存入 blNextMBit :mov al,temp simov count, disub count, sidec countmov cx,countjcxz skipMlpmul :mul blloop lpmulskipM :add Month ,alinc sicmp si, dijne NextMBitcmp Month ,12 ;大于 12 报错ja Err1; 把月按十位,各位存贮push dxmov ah,2mov dl ,0dh ;回车int 21 hm
14、ov dl,0ah ;换行int 21 hpop dxjmp skiplaplskiplapl :mov si, 0repeatD :mov ah,1int 21 hcmp al, 0dhje EndDay ;换行cmp al,20hje EndDay ;空格结束输入cmp al, 1bhje ExitDos ; ESC 退出程序cmp al,30hjb Err2 ;小于0报错cmp al,39h ;大于9报错ja Err2temp si中sub al,30 h ;转为二进制存贮mov temp si, al ;把读入的数据转化为二进制保存到inc si ; si 力口 1jmp repeat
15、D ;重新输入下一个字符Err2 : jmp Err1EndDay :mov di ,si ;把si的值传给 dimov si, 0 ;再把si清零mov bl ,10 ;把 10 存入 blNextDBit : mov al,temp si mov count, di sub count, si dec count mov cx,count jcxz skipD lpmul1 : mul bl loop lpmul1 skipD : add Day,al inc si cmp si, di jne NextDBit call Getrightday ;调用子程序确定每个月的最大天数mov a
16、l,si;把寄存器si中的值存入 alcmp Day,al ;用输入的 day和al比较ja Err ;若day大于al则报错; 把日按十位,各位存贮push dx mov ah,2 mov dl ,0dh int 21 h mov dl ,0ah int 21 h pop dx pop di pop si pop cx pop ax ret ExitDos : mov ah,4ch int 21 h GetYearMonthDay endp;* 闰年 *Getrightday proc near ;此子程序用来判断年份是否为闰年push bx ;保存寄存器状态push cxpush dxmo
17、v si, offset wmov ax,Yearmov cx,ax ;把转换后的年份的数值存入cxmov dx,0 ;计算年份是否为4的整数倍mov bx,4div bxmov b, dx ;把此刻的余数赋给b,便于后面天数计算cmp dx,0jnz lab1 ;不能被4整除,不为闰年mov ax,cx ;接着判断年份是否为100的倍数mov bx ,100div bxmov cc,dx ;把此刻的余数赋给cc,便于后面天数计算cmp dx,0jnz lab2 ;不为100的倍数,则为闰年mov ax,cx ;再判断是否为400的倍数mov bx,400div bxmov d,dx ;把此刻
18、的余数赋给d,便于后面天数计算cmp dx,0jz lab2 ;为400的倍数,则为闰年lab1 :;确定平年各月的天数 cmp Month , 1je 11cmp Month ,3je 11cmp Month ,5je 11cmp Month ,7je 11cmp Month ,8je l1cmp Month ,10je l1cmp Month ,12je l1cmp Month ,4je l2cmp Month ,6je l2cmp Month ,9je l2cmp Month , 11je l2mov al ,28mov si, al ;平年2月为28天jmp lab3 ;判断结束11:
19、 mov al,31mov si, aljmp lab312: mov al,30mov si, aljmp lab3lab2:;确定闰年各月的天数cmp Month , 1je l1cmp Month ,3je l1cmp Month ,5je 11cmp Month ,7je 11cmp Month ,8je 11cmp Month ,10je 11cmp Month ,12je l1cmp Month ,4je l2cmp Month ,6je l2cmp Month ,9je l2cmp Month , 11je l2mov al ,29mov si, al ;闰年的2月为29天jmp
20、 lab3lab3: pop dx ;恢复寄存器状态pop cxpop bxretGetrightday endpdisplay proc near ;子程序利用年月日计算星期,利用蔡勒cmp month ,2jg lab11 ;月大于2直接计算add month , 12sub year, 1 ;小于等于2则月加12,年再减1再计算lab11 :xor ax,axxor bx,bxxor cx,cxxor dx,dx ;先把各种要用的寄存器清零dec yearmov ax,yearmov cx,ax ; year 自减 1 再存入 cxmov dx,0mov bl ,4div bxadd c
21、x,ax ;把丫-1/4 的商加入 cxxor ax,axxor bx,bxmov ax ,yearmov dx,0mov bl ,100div bxsub cx,ax ;用cx中的值减去Y-1/100的商xor ax,axxor bx,bxxor dx,dxmov ax ,yearmov bx,400div bxadd cx,ax ;把丫-1/400 的商加入 cxxor ax,axmov dx,0mov bx,0inc monthmov al,monthmov bl, 13mul bl ;月加1后乘以13xor bx,bxmov bl ,5div bxadd cx,ax ;把上面得到的月除
22、以5取整加入cxxor ax,axxor dx,dxcmp month ,13ja noaddd ;当此时month大于13时,即月为1、2月时不用考虑加 1cmp b, 0jne noadddcmp cc,0jne adddcmp d, 0je addd ;当是闰年而且月为3到12时,day要加1addd :add day ,1 ; day + 1jmp dodnoaddd :jmp dod ; day 不用加 1dod:mov al ,dayadd cx,ax ;把 day 送个 cxxor ax,axxor bx,bxxor dx,dx ;把要用到的寄存器先清零mov ax ,cxmov
23、 bl ,7 div bxmov a,dx ;把由公式的来的和除以7,取余cmp a,0 ;由余数确定星期je s0cmp a, 1je s1 cmp a,2je s2 cmp a,3je s3cmp a,4je s4cmp a,5je s5lea dx,weekstr6mov ah,9hint 21 hjmp exit150: lea dx ,weekstr0 ;显示各个星期mov ah,9hint 21 hjmp exit151: lea dx,weekstr1mov ah,9hint 21 hjmp exit152: lea dx,weekstr2mov ah,9hint 21 hjmp
24、 exit153: lea dx,weekstr3mov ah,9hint 21 hjmp exit154: lea dx,weekstr4mov ah,9hint 21 hjmp exit155: lea dx,weekstr5mov ah,9hint 21 hexit1 :retdisplay endpcode endsend start运行结果:文档来源为 :从网络收集整理.word 版本可编辑.欢迎下载支持dseg segmentYeardw 0Monthdb 0Daydb 0temp db 10 dup(0) count dw ?ErrMsg db 'Input wrong!
25、please input again!',' $ str1 db 0dh,0ah,"please input year month day:$" str2 db 0dh,0ah,'bye-bye!$' str3db0dh,0ah,'WhetherornottocontinueinquiriesYes/No','$'adb?weekstr0db'Today is Sunday','$'weekstr1db'Today is Monday','$'we
26、ekstr2db'Today is Tuesday','$'weekstr3db'Today is Wednesday','$'weekstr4db'Today is Thursday','$'weekstr5db'Today is Friday','$'weekstr6db'Today is Saturday','$'w db ?dseg endscseg segmentassume cs:cseg,ds:dseg start:mov
27、 ax,dsegmov ds,ax指向源地址lea dx,str1提示输入年月日mov ah,9int 21hcall GetYearMonthDay调用输入年月日子程序call display调用显示子程序sel: lea dx,str3mov ah,9调用用9 号功能显示字符串int 21hmov ah,1int 21h键盘接受数据cmp al,'Y'je start 跳转的程序标志入口4cmp al,'y' je start cmp al,'N' je exit 跳转到程序结束cmp al,'n' je exitjmp sel exit:lea dx,str2mov ah,9i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论