1、四、程序源代码stacks SEGMENT stackDB 200 DUP(0)stacks 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/Noweekstr0 db Today
2、is Sundayweekstr1 db Today is Mondayweekstr2 db Today is Tuesdayweekstr3 db Today is Wednesdayweekstr4 db Today is Thursdayweekstr5 db Today is Fridayweekstr6 db Today is Saturdaya dw ?b dw ?cc dw ?d dw ?w db ?data ends ;定义了变量和信息code segmentassume cs:code,ds:data,ss:stacksstart:mov ax,datamov ds,axl
3、ea dx,str1 ;提醒你输入年月日mov ah,9h ;显示字符串int 21h call GetYearMonthDay ;调用子程序输入正确的年月日call display ;调用子程序通过计算得出星期sel: lea dx,str2 ;提醒你选择退出程序还是继续mov ah,9hint 21hmov ah,1 ;输入你的选择(键盘输入并回显)cmp al,Yje starty ;输入y或Y继续程序Nje exitn输入n或N退出程序jmp selexit:mov ah,4chint 21h ;退出;主程序GetYearMonthDay proc near ;子程序输入正确的年月日p
4、ush axpush cxpush sipush di ;压栈inputagain:mov Year,0mov Month,0mov Day,0mov si,0 ;把年月日重新归零repeatY:输入年cmp al,0dh ;换行je EndY ;回车结束年的输入cmp al,20h ;判断是否是是空格键SP空格结束年的输入cmp al,1bh ;判断是否是退出ESCje ExitDos0 ;退出键则退出程序cmp al,30h ;和0比较jb Err ;小于0转到错误提示cmp al,39h ;和9比较ja Err ;大于9转到错误提示sub al,30h ;把读入的数据转化为二进制保存到t
5、empsi中mov tempsi,alinc si ;si加1jmp repeatYErr: ;出错调用lea dx,ErrMsg ;提示错误mov ah,2 ;显示输出mov dl,0dhmov dl,0ah回车jmp inputagain ;跳回到inputagain重新输入年月日EndY:mov bx,10 ;把10存入bxmov di,si ;把si的值传给di再把si清零NextYBit:mov ah,0mov al,tempsi ;再把存在tempsi中的数据存入almov count,di ;把di中的转到countsub count,si ; count=count-sidec
6、 count ; count-1mov cx,count ;把自减后的count存入cxjcxz skipY ;cx为0转移lopmul:mul bx ; *10,主要实现把年按千位,百位,十位,各位存放loop lopmul ;cx-1循环skipY:add Year,ax ;把ax中存入的年的值赋给year si自加1cmp si,di ; 比较si和dijne NextYBit ; 不相等转移主要实现把年按千位,百位,十位,各位存放push dxmov ah,2mov dl,0dh ;mov dl,0ah ;pop dxjmp skiplap ; 跳到月的输入ExitDos0:jmp E
7、xitDos ;skiplap:si清零repeatM:输入月数cmp al,0dhje EndMon ;cmp al,20h空格结束输入cmp al,1bhje ExitDos1 ;ESC退出程序cmp al,30hjb Err1 ;小于0报错cmp al,39hja Err1 ;大于9报错转为二进制存贮mov tempsi,al ;jmp repeat ;重新输入下一个字符Err1: jmp ErrExitDos1: jmp ExitDosEndMon:mov bl,10 ;把10存入blNextMBit:mov al,tempsimov count,disub count,sidec c
8、ountmov cx,countjcxz skipMlpmul:mul blloop lpmulskipM:add Month,alinc sicmp si,dijne NextMBitcmp Month,12 ;大于12报错把月按十位,各位存贮jmp skiplap1skiplap1:mov si,0repeatD:mov ah,1je EndDay ;je ExitDos ;jb Err2 ;ja Err2jmp repeatD ;Err2 : jmp Err1EndDay:NextDBit:jcxz skipDlpmul1:loop lpmul1skipD:add Day,aljne N
9、extDBitcall Getrightday ;调用子程序确定每个月的最大天数mov al,si ;把寄存器si中的值存入alcmp Day,al ;用输入的day和al 比较ja Err2 ;若day大于al则报错把日按十位,各位存贮pop dipop sipop cxpop axretExitDos:GetYearMonthDay endp*闰年*Getrightday proc near ;此子程序用来判断年份是否为闰年push bx ;保存寄存器状态mov 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,100mov cc,dx ;把此刻的余数赋给cc,便于后面天数计算jnz lab2 ;不为100的倍数,则为闰年再判断是否为400的倍数mov bx,400mov
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1