1、汇编毕业课程设计月历显示程序华 北 科 技 学 院课程设计说明书课程名称: 汇编语言 班级: 计算机B08-1 姓名:_蒋良 _设计题目:_ 月历显示程序 设计时间:_ 12月13号 至 12月24号 指导教师:_ 李冬艳 _ _ 评 语:_ _评阅成绩: 评阅教师: 1 课程设计目的进行程序设计方法和技能的基本训练,巩固在课堂上学到的有关程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。二、课程设计要求 1要求编写并调试通过一个小型软件,实现对软件或硬件的操作。 2遵循模块化、结构化的程序设计方法
2、。3.要求程序必须正确。4.程序简明易懂,多运用输入输出提示,出错信息及必要的注释。5.要求程序结构合理,语句使用得当。6.适当追求编程技巧和程序运行效率。三、课程设计题目: 月历显示程序四、课题分析本程序主要实现了从键盘获取正确的年份月份后,在屏幕上以月历的形式显示出当月。本次课题设计主要通过克服一下问题实现了目的功能:1 年份月份的获取与输出(小于10与大于等于10两种情况);2 闰年的判断,遵循四年而闰,百年不闰,四百再闰的规则;3 不同月份所含日数并不相同,分为四种情况:30、31、28、29;4 计算出输入月份第一天为星期几,并依照此进行排列日期与计算显示出的空格数目5、输入错误后的
3、提示以及从新输入五、流程图1、主流程图六、实现过程1. 提示输入年月a) 输入格式:yyyymmb) 合法性检查:1980yyyy2099,c) 1mm12d) 年份字符串转换成二进制数保存到变量year,e) month中f) 其他需要定义的变量:KBUF键盘输入缓冲区 MSG2 DB Please input the month(01-12):$ CR DB 10,13,$ YEAR DW ? MONTH DB ? WEEK DB ? DAY DW ?2. 显示月历g) 可采用成批显示的方法:先填充, Mon Tue Wed Thu Fri Sat , 0DH, 0AHLine1 db ,
4、 0DH, 0AHLine2 db , 0DH, 0AHLine3 db , 0DH, 0AHLine4 db , 0DH, 0AHLine5 db , 0DH, 0AH, $ii. 往Line到Line5中填充当月日期(Fill_date)iii. 用9号DOS功能调用显示字符串YMweeks db mon tue wed thu fri sau sun,0dh,0ah,$3、每月有几天? 这涉及到填充多少个日期数字1. 计算出来后用一个变量保存:days2. 计算方法:a) 1,b) 3,c) 5,d) 7,e) 8,f) 10,g) 12月: 31天: push ax mov ax,20
5、h ;输出空格 and ax,00ffh mov dl,al mov ah,2 int 21h loop qian mov AX,NUM mov ah,0 mov bx,ax pop cx mov cx,DAY mov ax,1 ;mov bx,5 s: ;输出日期 cmp ax,10 jl gewei call upten jmp db 0dh,0ah,$;回车换行 weeks db mon tue wed thu fri sau sun,0dh,0ah,$data endsSHOW MACRO STR LEA DX,STR MOV AH,09H INT 21H ENDMINPUTYEAR
6、MACRO X MOV AH,01H INT 21H SUB AL,30H MOV AH,00H MOV BX,X MUL BX ADD CX,AXENDMstack segment stack db 1024 dup(?)stack endscode segment assume cs:code,ds:data,ss:stack main proc far start: push ds xor ax,ax push ax mov ax,data mov ds,ax mov ax,stack mov ss,ax MOV AH,0 MOV AL,03H INT 10H MOV AH,06h ;6
7、号功能:屏幕初始化或上卷 MOV AL,0 ;全屏幕为空白 MOV BH,1FH ;卷入行属性 (前景色、背景色之类的) MOV CX,0 ;左上角行号左上角列号 MOV DH,24 ;右下角行号 MOV DL,79 ;右下角列号 INT 10h ;调用BIOS l: SHOW MSG1 MOV CX,0 INPUTYEAR 1000 INPUTYEAR 100 INPUTYEAR 10 INPUTYEAR 1 MOV YEAR,CX SHOW CR SHOW MSG2 MOV CL,0 MOV AH,01H INT 21H SUB AL,30H MOV BL,10 MUL BL MOV CL
8、,AL MOV AH,01H INT 21H SUB AL,30H ADD CL,AL MOV MONTH,CL SHOW CR MOV CX,YEAR MOV DH,MONTH MOV DL,1 MOV AH,2BH INT 21H CMP AL,0FFH JE NEXT1 MOV AH,2AH INT 21H MOV WEEK,AL SHOW CR JMP NEXT2 NEXT1: SHOW ERROR1 show CR JMP L NEXT2: CALL RUNNIAN CALL DAYS SHOW MSG0 SHOW CR lea dx,weeks mov ah,9 int 21h p
9、ush cx MOV AL,WEEK CMP AL,0 JE NEXT3 DEC AL JMP NEXT4 NEXT3: MOV AL,6 NEXT4: MOV NUM,AX MOV BL,5 MUL BL mov cx,AXqian: push ax mov ax,20h ;输出空格 and ax,00ffh mov dl,al mov ah,2 int 21h loop qian mov AX,NUM mov ah,0 mov bx,ax pop cx mov cx,DAY mov ax,1 ;mov bx,5 s: ;输出日期 cmp ax,10 jl gewei call upten
10、jmp mov ah,9 int 21h mov bx,0 pop ax ret proc near ;当输出的数为两位数时push axpush cx push bxmov cl,10div cladd ax,3030hmov bx,axmov dl,blmov ah,02hint 21hmov dl,bhmov ah,02hint 21hpop bxpop cxpush cxmov cx,3kong: mov ax,20h and ax,00ffh mov dl,ah mov ah,2 int 21h loop kongpop cx pop axretupten endpmain endp
11、code endsend start八、结果显示初始界面:键入正确的年份后:键入正确年份和月份后:输入年份月份出错:八、感想、收获及体会 在本次课程设计中遇到的一些问题:1、对于文件的打开中存在一些问题:因为本次课程设计中显示的大概模式是一个记事本,所以窗口中有人为的“画”上一个边框,但是在打开一个文件,读取并显示在屏幕上时就出现了问题。因为本次课设的DOS窗口使用的是80x25的16色文本,每一行除却左右两边的边框只有78列,而对于所要打开的文件如果一次读取的字节数超过78的话,则文件中的内容在在屏幕上显示的时候会将边框覆盖。如果每次限制读取的字节数在78以内,然后每次光标定位的每一行的行首
12、,这样的话,又会出现这样的问题:如果第一次读的78个字节中有回车换行的话,在屏幕中显示的时候它会自动回车换到第二行,同样将边框覆盖,而且在第二次读的时候重新定位到第二行的行首,这样将上次所读出的字符给覆盖了。对此,由于时间以及个人能力的限制,这个问题被暂时解决了而不是完美的解决:所读取的文件中不适用回车Enter,所需要的间隔用空格来填充。2、多次使用BIOS功能,其中感触最深的一点是使用16H 的0号功能从键盘获得字符,这个与DOS功能中的21H 中的1号功能从键盘输入字符最大的区别就是21H 中1号功能是返回的是输入字符的ASCII码,是区分大小写的,这给输入字符时造成了极大的不方便 ;当
13、然16H 的0号功能返回的是字符的扫描码和字符码。3、程序中本来对于选中所有的子菜单(除edit外)的响应是一致的,但是后来将新建和打开的功能修改了一下,加了两个子程序结果有时候Help菜单的子菜单的显示和选择就会出现问题,但是这个问题还是时有时无,因此让人很是苦恼;对于保存功能也稍修改了一下,但是对于保存功能,只要修改Help菜单的子菜单的选择就必出现问题,但碍于找不到原因,只好把这个功能不做修改。4、程序中输入向下的方向键(即)时,本来功能设置的是打开子菜单(子菜单未打开时)或向下移动选中子菜单(子菜单已打开时),但是这个功能却不能用,对此我研究思考了许久,还是未能找出原因,只好先将这个问
14、题放置到了一边,还望老师见谅。当然了,实际上这个程序做的并不是很尽善尽美,程序中还存在着一些问题,但是毕竟世界上没有十全十美的东西,所以我们只能尽可能的做到最好。收获以及体会: 通过此次课程设计,我更加体会到了使用DEBUG调试程序的好处。以前程序短,差不多就一百多行,我可以一句一句的分析、找错,但是课程设计动辄几百行,甚至这次课设我的程序达到了一千多行,对于这样大的一个程序一句一句分析显然是不太显示的事情,这就体现了DEBUG的好处,也更显示了DEBUG的重要性。通过此次课程设计,我学到了很多,因为很多东西在学习课本时是不做要求的,但是课程设计中却要用到。比如说文件的打开、新建、写、读和移动
15、指针,我们在学习课本时这一章根本就没有讲到但是这里却要用到,这就需要我们自学。再比如BIOS的一些功能,我们平常用的汇编基本上全是只有黑白版本的,但是通过使用BIOS中的10H的0号功能,通过设置AL的值设置DOS窗口的显示方式,通过设置BH的值可以设置字符属性等等。再比如说结构体,当然了本次课程设计中并没有用到结构体但是在查找资料时也稍微学习了解了一下。当然了,在本次程序中我体会最深的还是与同学的互相帮助,虽然说我们要独立完成自己的课设,但是这并不代表我们遇到问题解决不了的时候就还要自己一个在在那苦思冥想,可能你只是钻到了死胡同里出不来,那样的话你想一个小时、一天、一个星期也许都想不出来,而旁观者清当局者迷,可能别人的一句话就解决了你的问题。而且在帮助别人的时候我们自己也能学到很多东西,搞清楚很多可能以前自己也不是很清楚的知识点。所以说独立虽好,但若光是闭门造车的话也不行,我们要多与同学交流。总而言之,这次课程设计告诉我们学习不要只是局限于课本,局限于老师课堂上讲的知识,我们要学会利用身边一切的资源学习这门语言,这样才能学好一门语言。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2