星期判别参考源程序.doc_第1页
星期判别参考源程序.doc_第2页
星期判别参考源程序.doc_第3页
星期判别参考源程序.doc_第4页
星期判别参考源程序.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

闰年判断主要代码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 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 ;把Y-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 ;把Y-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的值和星期的对应关系a的值 0 1 2 3 4 5 6星期 星期日 星期一 星期二 星期三 星期四 星期五 星期六五、程序源代码stack SEGMENT stackDB 200 DUP(0)stack ENDSdata segmentYear dw 0Month db 0Day db 0temp db 10 dup(0)count dw ?ErrMsg db 0dh,0ah,Input wrong!please input again!, $str1 db 0dh,0ah,please input year month day:0dh,0ah,$str2 db 0dh,0ah,Whether or not to continue inquiries Yes/No,0dh,0ah,$weekstr0 db Today is Sunday,$weekstr1 db Today is Monday,$weekstr2 db Today is Tuesday,$weekstr3 db Today is Wednesday,$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,str1 ;提醒你输入年月日mov ah,9hint 21h ;显示字符串call GetYearMonthDay ;调用子程序输入正确的年月日call display ;调用子程序通过计算得出星期sel: lea dx,str2 ;提醒你选择退出程序还是继续mov ah,9hint 21hmov ah,1 ;输入你的选择(键盘输入并回显)int 21hcmp al,Yje startcmp al,y ;输入y或Y继续程序je startcmp al,Nje exitcmp al,n ;输入n或N退出程序je exitjmp selexit:mov ah,4chint 21h ;退出;*主程序GetYearMonthDay proc near ;子程序输入正确的年月日push axpush cxpush sipush di ;压栈inputagain:mov Year,0mov Month,0mov Day,0mov si,0 ;把年月日重新归零repeatY:mov ah,1 ;输入年int 21hcmp al,0dh ;换行je EndY ;回车结束年的输入cmp al,20h ;判断是否是是空格键SPje EndY ;空格结束年的输入cmp al,1bh ;判断是否是退出ESCje ExitDos0 ;退出键则退出程序cmp al,30h ;和0比较jb Err ;小于0转到错误提示cmp al,39h ;和9比较ja Err ;大于9转到错误提示sub al,30h ;把读入的数据转化为二进制保存到tempsi中mov tempsi,alinc si ;si加1jmp repeatYErr: lea dx,ErrMsg ;提示错误mov ah,9hint 21hmov ah,2 ;显示输出mov dl,0dhint 21h ;换行mov dl,0ahint 21h ;回车jmp inputagain ;跳回到inputagain重新输入年月日EndY:mov bx,10 ;把10存入bxmov di,si ;把si的值传给dimov si,0 ;再把si清零NextYBit:mov ah,0mov al,tempsi ;再把存在tempsi中的数据存入almov count,di ;把di中的转到countsub count,si ; count=count-sidec count ; count-1mov cx,count ;把自减后的count存入cxjcxz skipY ;cx为0转移lopmul:mul bx ; *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 21hmov dl,0ah ;回车int 21hpop dxjmp skiplap ; 跳到月的输入ExitDos0:jmp ExitDos ;退出skiplap:mov si,0 ;si清零repeatM:mov ah,1 ;输入月数int 21hcmp al,0dhje EndMon ;换行cmp al,20hje EndMon ;空格结束输入cmp al,1bhje ExitDos1 ;ESC退出程序cmp al,30hjb Err1 ;小于0报错cmp al,39hja Err1 ;大于9报错sub al,30h ;转为二进制存贮mov tempsi,al ;把读入的数据转化为二进制保存到tempsi中inc si ;si加1jmp repeatM ;重新输入下一个字符Err1: jmp ErrExitDos1: jmp ExitDosEndMon:mov di,si ;把si的值传给dimov si,0 ;再把si清零mov bl,10 ;把10存入blNextMBit:mov al,tempsimov 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 21hmov dl,0ah ;换行int 21hpop dxjmp skiplap1skiplap1:mov si,0repeatD:mov ah,1int 21hcmp al,0dhje EndDay ;换行cmp al,20hje EndDay ;空格结束输入cmp al,1bhje ExitDos ;ESC退出程序cmp al,30hjb Err2 ;小于0报错cmp al,39h ;大于9报错ja Err2sub al,30h ;转为二进制存贮mov tempsi,al ;把读入的数据转化为二进制保存到tempsi中inc si ;si加1jmp repeatD ;重新输入下一个字符Err2: jmp Err1EndDay:mov di,si ;把si的值传给dimov si,0 ;再把si清零mov bl,10 ;把10存入blNextDBit:mov al,tempsimov count,disub count,sidec countmov cx,countjcxz skipDlpmul1:mul blloop lpmul1skipD:add Day,alinc sicmp si,dijne NextDBitcall Getrightday ;调用子程序确定每个月的最大天数mov al,si ;把寄存器si中的值存入alcmp Day,al ;用输入的day和al 比较ja Err ;若day大于al则报错;-把日按十位,各位存贮push dxmov ah,2mov dl,0dhint 21hmov dl,0ahint 21hpop dxpop dipop sipop cxpop axretExitDos:mov ah,4chint 21hGetYearMonthDay endp;*闰年*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 cc,dx ;把此刻的余数赋给cc,便于后面天数计算cmp dx,0jnz lab2 ;不为100的倍数,则为闰年mov ax,cx ;再判断是否为400的倍数mov bx,400div bxmov d,dx ;把此刻的余数赋给d,便于后面天数计算cmp dx,0jz lab2 ;为400的倍数,则为闰年lab1: ;确定平年各月的天数cmp Month,1je l1cmp Month,3je l1cmp Month,5je l1cmp Month,7je l1cmp 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 ;判断结束l1: mov al,31mov si,aljmp lab3l2: mov al,30mov si,aljmp lab3lab2: ;确定闰年各月的天数cmp Month,1je l1cmp Month,3je l1cmp Month,5je l1cmp Month,7je l1cmp Month,8je l1cmp Month,10je l1cmp Month,12je l1cmp Month,4je l2cmp Month,6je l2cmp Month,9je l2cmp Month,11je l2mov al,29mov si,al ;闰年的2月为29天jmp 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 cx,ax ;把Y-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 ;把Y-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取整加入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 bl,7div bxmov a,dx ;把由公式的来的和除以7,取余cmp a,0 ;由余数确定星期je s0cmp a,1je s1cmp a,2je s2cmp a,3je s3cmp a,4je s4cmp a,5je s5lea dx,weekstr6mov ah,9hint 21hjmp exit1s0: lea dx,weekstr0 ;显示各个星期mov ah,9hint 21hjmp exit1s1: lea dx,weekstr1mov ah,9hint 21hjmp exit1s2: lea dx,weekstr2mov ah,9hint 21hjmp exit1s3: lea dx,weekstr3mov ah,9hint 21hjmp exit1s4: lea dx,weekstr4mov ah,9hint 21hjmp exit1s5: lea dx,weekstr5mov ah,9hint 21hexit1:retdisplay endpcode endsend start运行结果:dseg segment Year dw 0 Month db 0 Day db 0 temp db 10 dup(0) count dw ? ErrMsg db Input wrong!please input again!, $ str1 db 0dh,0ah,please input year month day:$ str2 db 0dh,0ah,bye-bye!$ str3 db 0dh,0ah,Whether or not to continue inquiries Yes/No,$ a db ? weekstr0 db Today is Sunday,$ weekstr1 db Today is Monday,$ weekstr2 db Today is Tuesday,$ weekstr3 db Today is Wednesday,$ weekstr4 db Today is Thursday,$ weekstr5 db Today is Friday,$ weekstr6 db Today is Saturday,$ w db ? dseg ends cseg segment assume cs:cseg,ds:dseg start: mov ax,dseg mov ds,ax 指向源地址 lea dx,str1 提示输入年月日 mov ah,9 int 21h call GetYearMonthDay 调用输入年月日子程序 call display 调用显示子程序 sel: lea dx,str3 mov ah,9 调用用9号功能显示字符串 int 21h mov ah,1 int 21h 键盘接受数据 cmp al,Y je start 跳转的程序标志入口 4 cmp al,y je start cmp al,N je exit 跳转到程序结束 cmp al,n je exit jmp sel exit: lea dx,str2 mov ah,9 int 21h mov ah,4ch int 21h ;* GetYearMonthDay proc near push ax 保存寄存器状态 push cx push si push di inputagain: ;键盘输入数据 mov Year,0 m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论