
汇编课程设计__星期判断.doc
26页1目目 录录概述 ………………………………………………………… 1一 设计内容与要求 ……………………………………… 1 二 设计思想………………………………………………… 1三 程序流程图 …………………………………………… 2四 程序源代码 …………………………………………… 3五 设计过程中遇到的问题及解决方法…………………… 24六 设计心得………………………………………………… 241星期判断程序星期判断程序学生:欧斌(理工学部 10 级,学号 201041919232)概述概述判断星期程序是一个简单实用的应用程序,只要按程序要求,输入正确的年月日,该程 序就会正确显示当天是星期几,当输入错误的年月日信息时,改程序会提示输入错误,并 且提示重新输入,当一次输入操作完成后,按 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:日;[ ]代表取整,即只要整数部分。
)再通 过调用,显示出来2三、程序流程图三、程序流程图开 始输入年月日信息保存数据判断提示 输入错误, 是否继续显示星期运用蔡勒公式求星期几结束是否继续续续判断是 否正确NYNY3四、程序源代码四、程序源代码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/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','$'4weekstr6 db 'Today is Saturday','$'a dw ?b dw ?cc dw ?d dw ?w db ?data ends ;定义了变量和信息code segmentassume cs:code,ds:data,ss:stacksstart:mov ax,datamov ds,axlea dx,str1 ;提醒你输入年月日mov ah,9h ;显示字符串int 21h call GetYearMonthDay ;调用子程序输入正确的年月日call display ;调用子程序通过计算得出星期sel: lea dx,str2 ;提醒你选择退出程序还是继续mov ah,9h5int 21hmov ah,1 ;输入你的选择(键盘输入并回显)int 21hcmp al,'Y'je startcmp al,'y' ;输入 y 或 Y 继续程序je startcmp al,'N'je exitcmp al,'n' ;输入 n 或 N 退出程序je exitjmp selexit:mov ah,4chint 21h ;退出;主程序GetYearMonthDay proc near ;子程序输入正确的年月日push axpush cxpush sipush di ;压栈6inputagain: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 ;把读入的数据转化为二进制保存到 temp[si]中mov temp[si],alinc si ;si 加 1jmp repeatY7Err: ;出错调用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,temp[si] ;再把存在 temp[si]中的数据存入 almov count,di ;把 di 中的转到 countsub count,si ; count=count-sidec count ; count-1mov cx,count ;把自减后的 count 存入 cx8jcxz 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 ;退出9skiplap: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 temp[si],al 。












