已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汇编语言课程实习报汇编语言课程实习报 告告 实习题目实习题目 万年历显示程序万年历显示程序 学生姓名学生姓名 班级 学号 班级 学号 院系院系 信息学院计算机系信息学院计算机系 指导老师指导老师 叶晓霞叶晓霞 提交时间提交时间 一 一 课题内容和要求课题内容和要求 题目描述 用汇编语言编写一个有简单界面显示的日历 要求输入年月日后 将该月的完整日历显示出来 包括星期几 且每月的星期六 日用不同颜色来 表示 并且要求显示输入的日期 基本要求 1 设计一个简单的接受键盘输入年月日信息的界面 2 输入年月日后 将该月的完整日历显示出来 包括星期几 且每月的六 日 3 实物演示时要求讲出程序原理和设计思想 4 程序运行良好 界面清晰 提高要求 1 界面色彩鲜明 友好 能够突出显示主题 2 用不同的色彩明显表示出输入的日期 3 错误输入要有提示及处理 结果显示清晰 合理 二 二 需求和思路分析需求和思路分析 本课题要求设计一个显示万年历的程序 即要输入年月日后 将这个月的 完整日历显示出来 包括这个月的每一天是星期几也要显示 公历每年有 12 个月 其中 1 3 5 7 8 10 12 月为大月 每月 31 天 4 6 9 11 月 为小月 每月 30 天 公历有闰年平年之分 若某年是闰年 则该年 2 月有 29 天 全年有 366 天 若某年是平年 则该年 2 月有 28 天 那么首先要做的就 是完成通过键盘输入得到要显示的年月日 能够将年月日储存起来同时将输入 的日期显示出来这个功能 在这里可以调用 INT 21H 的 0AH 的功能将键入的一 串字符送入用户程序的缓冲区 0AH 功能要求键入的字符串必须以 回车 做 为结束标志 换句话说 按下回车键后 本次功能调用结束 由于题目的要求 错误输入要有提示及处理 所以也要考虑到所输入的年月日是否有符合日常逻 辑 如果输入不正确 要显示出错误输入信息 并且提示重新输入年月日 本课题的重点的地方和难点的地方就是怎么将输入的日期的当月的完整日 历给显示出来 那么就得在屏幕上先显示出星期一到星期日 在设计时将 SUN SAT 在屏幕上显示出来 然后在下面依次显示完这个月的所有天数 而且 要正确显示 在显示每个月的第一天的时候 首先要能够确定第一天是星期几 这样才能够正确的向下显示 并且显示这个月的最后一天不能够超出这个月的 最大天数 在这里也就要考虑到各个月不同天数的情况 尤其是二月 闰年的 二月有 29 天 在确定输入的那个月的第一天是星期几可以通过蔡勒公式求得 计算某一天是星期几 如下 W C 4 2C y y 4 13 M 1 5 d 1 C 是世纪数减 1 y 是年份后两位 M 是月份 d 是日数 计算出 来的结果模取 7 求得这个月的第一天是星期几后 会发现如果是星期一的话 最后算得的 W 的值为 1 依次类推 星期日的 W 值为 0 那么可以根据 W 值来确 定要显示的行和列 最后限定一下要显示的这个月的最后一天 那么日历就可 以正确的显示出来了 在用蔡勒公式计算的时候要注意 1 月和 2 月按上一年的 13 月和 14 月来算 这时 C 和 y 均按上一年取值 日历的显示也要注意光标的定位 设置星期六 日两列的字体为红色 打 印出当前显示的是哪一年的哪一个月 打印出 MON TUR 等字样 以标注哪天是 星期几 根据月的大小进行循环的输出日期 在此过程中 要注意一位数与两 位数对格式的影响 最后显示出来的界面要清洁 三 概要设计三 概要设计 1 程序系统整体流程图 开始 输入年月日 年月日是否正确 显示输入的该月 的日历 是 否提示输入错误 重新输入 结束 2 程序系统每个子程序的流程图 1 二进制转十进制子程序 开始 DI BL BL 30H BL 0 BH BX 10 BX AX BX AX 0 AX DI 1 DI CX 1 CX CX 0 否 存储AX里面的值 是 2 判断闰年子程序 开始 年份 AX 0 DX AX 400 余数在DX 保护现场 DX 0 年份能被4除尽 年份能被100除尽 1 CF 恢复现场 0 CF 是 否 否 是 否 是 返回 3 求输入的日期对应月的第一天是星期几 开始 年份 AX DX 0 保护现场 AX BX AX AX CX BX AX AX 100 余数在DX中 CX AX CX AX 1 AX AX BX AX 4 余数在DX中 AX 400 商在AX中 CX AX CX CX AX DX 0 AX 7 余数在 DX 中 DX CX 恢复现场 返回 四 详细设计四 详细设计 1 输入年月日模块 本课题要求输入年月日就显示该月的日历 首先要做的是通过键盘来输入 日期 在程序中使用INT 21H的0AH的功能调用 它的功能是等待键入一串字符 送入用户程序的数据缓冲区 0AH功能要求键入的字符串以 回车 做为结束标 志 按下回车以后 本次功能调用结束 光标返回当前行始格 回车 符留在 缓冲区当中 对缓冲区的格式有如下要求 缓冲区要设置在程序数据段 调用 前 缓冲区的首址偏移量应赋给DX寄存器 缓冲区首单元应预置 允许接收的 字符个数 包括回车键在内 用户键入回车之后 由0AH功能把实际键入的字 符个数 不包括回车键 写入STR1 1单元 键入的字符串从STR1 2单元开始依 次存放 因此缓冲区的容量要不小于键入的键入的串的长度 包括回车键 2 在程序中这么定义的 STR1 DB 9 DB DB 9 DUP 比如要输入20090327 这样只能输入像这种格式的8个字符 这样输入就完成了 但是由于输入的是年月日 也要判断其是否符合现实 也就要对输入的年月日 进行处理 如果输入不正确就提示出错 并且重新输入 判断输入的是否正确 有以下几个方面要考虑 首先输入的月只能在01 12里面的情况 日的最小天数 要不小于1 最大不能超过刚才输入的月的最大天数 在程序里 我是通过这样 的方法实现的 我把12个月的天数定义为BUF1 DB31 31 30 31 30 31 31 30 31 30 31 其中 就是2月的天数 由于不知道 输入的年是否是闰年 所以2月的最大天数在这里还未知 下面要做的就是首先 判断输入的年是否是闰年 程序中通过CALL PR调用判断平年还是闰年的程序 关于通过什么算法来判断是否闰年的这里就不再详细的介绍了 算法的流程图 已经在上面给出了 通过算法判断得出输入的年是否是闰年 如果是闰年那么 就将29存到刚才定义的BUF1里面 如是平年就将28存到BUF1里 这样通过输入 的月就可以知道每个月的最大天数了 比如输入的是1月 那么就调用BUF1里面 第一个数据就知道1月的最大天数31天了 一个输入年月日的模块也就完成了 也能够判断输入是否正确 2 显示日历模块 课题中对于显示也作了要求 日历的显示 注意光标的定位 设置星期六 日两列的字体为红色 打印出当前显示的是哪一年的哪一个月 打印出 MON TUR等字样 以标注哪天是星期几 根据月的大小进行循环的输出日期 在此过程中 要注意一位数与两位数对格式的影响 另外 打印到星期天要输 出换行 要打印出MON TUR等字样 以标注哪天是星期几 首先定义一个数据缓冲区 WEEK DB SUN MON TUE WED THU FRI SAT 然后在后面直接用显示功能 使其在屏幕中显示出来 下面做的就是要输出输 入的月的所有天数 这里关键先要判断这个月的第一天是星期几 算法在上面 流程图中也给出了 通过算法得出月的第一天是星期几 然后往下依次输出其 最大天数从上面的BUF1中获取 对于题中给的要求 设置星期六 日两列的字 体为红色 这个只需在显示日历的时候 判断要显示的是否是第一列和最后一 列 如果是就运用BIOS的INT 10H的06H功能就能将其颜色设置成红色 其入口 参数AL 上卷行数 AL 0 整个窗口空白 BH 卷入行属性 CH CL 左上角行号 列号 DH DL 右下角行号 列号 对于上面的输入日期的颜色以及程序运行的 背景颜色也都是通过这种方法实现的 3 源程序代码 DATAS SEGMENT A1 DB A2 DB Calendar A3 DB designer Wubinghui A4 DB Please input the date A5 DB Please input the date like 20090101 STR1 DB 9 DB DB 9 DUP A6DW 0 A7 DB 0 A8DB Date B DW C1 DW 0 C2 DB 0 G DB 0 N DB P DW Y DB WEEK DB SUN MON TUE WED THU FRI SAT YEAR DW MONTH DW DAY DW WRONG DB The date you input is wrong Please try again ROW DB 1 BUF1 DB 31 31 30 31 30 31 31 30 31 30 31 BUF2 DB 1 2 3 4 5 6 7 8 9 10 11 12 BUF3 DB 1 0AH 0DH DB 2 0AH 0DH DB 3 0AH 0DH DB 4 0AH 0DH DB 5 0AH 0DH DB 6 0AH 0DH DB 7 0AH 0DH DB 8 0AH 0DH DB 9 0AH 0DH DB 10 0AH 0DH DB 11 0AH 0DH DB 12 0AH 0DH DB 13 0AH 0DH DB 14 0AH 0DH DB 15 0AH 0DH DB 16 0AH 0DH DB 17 0AH 0DH DB 18 0AH 0DH DB 19 0AH 0DH DB 20 0AH 0DH DB 21 0AH 0DH DB 22 0AH 0DH DB 23 0AH 0DH DB 24 0AH 0DH DB 25 0AH 0DH DB 26 0AH 0DH DB 27 0AH 0DH DB 28 0AH 0DH DB 29 0AH 0DH DB 30 0AH 0DH DB 31 0AH 0DH DATAS ENDS STACKS SEGMENT STACKS ENDS CODES SEGMENT ASSUME CS CODES DS DATAS SS STACKS START MOV AX DATAS MOV DS AX MOV AH 0 设置显示方式 MOV AL 3 80 25彩色文本方式 INT 10H MOV AH 6 MOV AL 0 MOV CH 0 MOV CL 0 清整个屏幕 MOV DH 80 MOV DL 80 MOV BH 10110000B 前四位定义背景色 后四位定义前景色 INT 10H MOV DH ROW MOV DL 2 CALL GBIAO LEA DX A1 CALL NINE ADD ROW 2 MOV DH ROW MOV DL 1 CALL GBIAO LEA DX A2 CALL NINE ADD ROW 2 MOV DH ROW MOV DL 8 CALL GBIAO LEA DX A3 CALL NINE ADD ROW 2 MOV DH ROW MOV DL 1 CALL GBIAO LEA DX A5 CALL NINE ADD ROW 2 REINPUT MOV AH 6 输入日期显示蓝色 MOV AL 0 MOV CH ROW MOV CL 23 MOV DH ROW MOV DL 30 MOV BH 10110001B INT 10H MOV DH ROW MOV DL 1 CALL GBIAO LEA DX A4 CALL NINE MOV DH ROW MOV DL 23 CALL GBIAO LEA DX STR1 输入日期 保存在缓冲区STR1中 MOV AH 10 INT 21H ADD ROW 2 LEA DI STR1 2 DI指向日期输入串的首地址 MOV CX 4 MOV AX 0 P1 MOV BL DI 取字符送到BL SUB BL 30H 字符减去30H 转化为真值 MOV BH 0 MOV P 10 MUL P ADD AX BX INC DI DI指向下一个字符 DEC CX 长度减一 JNZ P1 MOV YEAR AX CALL PR 调用判断平年还是闰年的程序 JC L1 有进位 借位 跳转到L1 输出闰年 否则顺序 执行 是平年 LEA DI BUF1 MOV DI 1 BYTE PTR 28 平年把28送入BUF1中 JMP L2 L1 LEA DI BUF1 MOV DI 1 BYTE PTR 29 闰年把29送入BUF1中 L2 LEA DI STR1 6 MOV CL 2 MOV AX 0 P2 MOV BL DI SUB BL 30H MOV BH 0 MOV P 10 MUL P ADD AX BX INC DI DEC CX JNZ P2 MOV MONTH AX 获得月份值 LEA DI STR1 8 MOV CL 2 MOV AX 0 P3 MOV BL DI SUB BL 30H MOV BH 0 MOV P 10 MUL P ADD AX BX INC DI DEC CX JNZ P3 MOV DAY AX 获得输入的日数 CMP MONTH 1 月份12 报错 JNC ERROR CMP DAY 1 JC ERROR CALL GETN 显示日历 调用GETN子程序返回N的值 N为 每月第一天是星期几 MOV DI OFFSET BUF1 DEC MONTH DEC MONTH ADD DI MONTH 取出每个月的天数 G MOV CL DI MOV G CL CMP BYTE PTR DAY CL 输入的天如果超过这个月的最大天数 报错 JA ERROR MOV DH ROW MOV DL 10 CALL GBIAO LEA DX A8 CALL NINE MOV DH ROW MOV DL 16 CALL GBIAO LEA DI STR1 2 MOV CL 8 MOV AX 0 DATE MOV BL DI MOV DL BL MOV AH 2 INT 21H INC DI DEC CX JNZ DATE ADD ROW 1 MOV AH 6 MOV AL 0 MOV CH ROW MOV CL 3 MOV DH ROW MOV DL 0 MOV BH 10110100B INT 10H SUN SAT设置红色 MOV AH 6 MOV AL 0 MOV CH ROW MOV CL 30 MOV DH ROW MOV DL 33 MOV BH 10110100B INT 10H MOV DH ROW MOV DL 0 CALL GBIAO LEA DX WEEK CALL NINE 显示SUN SAT INC ROW MOV SI OFFSET BUF3 MOV AL 5 MUL N MOV B AX CMP B 35 如果每个月一号是星期天 显示一号的行号 减2 JC POS SUB ROW 1 POS MOV DH ROW 每个月的一号的光标位置 MOV DL BYTE PTR B CALL GBIAO MOV A7 31 CMP DL A7 JBE POS1 DL 31 跳转到POS1 否则行加1 列从0开始 ADD ROW 1 两行日期间隔 MOV AX 0 MOV B AX MOV AH 6 日历周末设置红色显示 MOV AL 0 MOV CH ROW MOV CL 3 MOV DH ROW MOV DL 0 MOV BH 10110100B INT 10H JMP POS POS1 CMP DL 30 周六的日历显示红色 JC NORED MOV AH 6 MOV AL 0 MOV CH ROW MOV CL 30 MOV DH ROW MOV DL 33 MOV BH 10110100B INT 10H NORED MOV DX SI CALL NINE 在当前光标位置显示数字 ADD SI 5 ADD B 5 两个日期的显示距离 DEC G JNZ POS JMP EXIT ERROR DEC ROW MOV DH ROW MOV DL 1 CALL GBIAO LEA DX WRONG CALL NINE INC ROW JMP REINPUT EXIT MOV AH 4CH INT 21H GBIAO PROC PUSH AX PUSH BX MOV AH 2 2号功能调用 MOV BH 0 INT 10H 定光标 POP BX POP AX RET GBIAO ENDP NINE PROC PUSH AX MOV AH 9 9号功能调用 INT 21H POP AX RET NINE ENDP PR PROC 判断是平年还是闰年 PUSH AX PUSH BX PUSH CX PUSH DX MOV AX YEAR MOV CX AX MOV DX 0 MOV BX 4 DIV BX CMP DX 0 DX中为余数 JNZ B1 MOV AX CX MOV BX 100 DIV BX CMP DX 0 JNZ B2 MOV AX CX MOV BX 400 DIV BX CMP DX 0 JZ B2 B1 CLC CF 0 JMP B3 B2 STC CF 1 B3 POP DX POP CX POP BX POP AX RET PR ENDP GETN PROC 获得这个月的一号是星期几 PUSH AX PUSH BX PUSH CX PUSH DX MOV BL 100 MOV AX YEAR DIV BL MOV C2 AL MOV Y AH MOV CL 2 MOV BL C2 SHR BL CL int c 4 SHL C2 1 2 c SUB BL C2 ADD BL Y SHR Y CL int y 4 ADD BL Y int c 4 2 c y int y 4 INC MONTH CMP MONTH 3 是一月 转移 JC J1 是二月 转移 CMP MONTH 4 JC J1 XOR AH AH MOV AX MONTH MOV DX 13 MUL DX MOV CX 5 DIV CX XCHG AX BX CBW XCHG AX BX ADD BX AX int c 4 2 c y int y 4 int 13 m 1 5 MOV AX BX MOV CL 7 IDIV CL CMP AH 0 JG SKIPADD ADD AH 7 SKIPADD MOV BL AH MOV N BL JMP J3 J1 MOV BL 100 MOV AX YEAR DIV BL MOV C2 AL MOV Y AH CMP Y 1 如果年份后两位是00 则前一年是99 JNC J2 ADD Y 100 J2 SUB Y 1 MOV CL 2 MOV BL C2 SHR BL CL SHL C2 1 SUB BL C2 ADD BL Y SHR Y CL ADD BL Y ADD MONTH 12 XOR AH AH MOV AX MONTH MOV DX 13 MUL DX MOV CX 5 DIV CX XCHG AX BX CBW XCHG AX BX ADD BX AX MOV AX BX MOV CL 7 IDIV CL CMP AH 0 JG SKIPADD1 ADD AH 7 SKIPADD1 MOV BL AH MOV N BL SUB MONTH 12 J3 POP DX POP CX POP BX POP AX RET GETN ENDP CODES ENDS END START 五 测试数据及其结果分析五 测试数据及其结果分析 输入模块测试 错误输入时见下图 根据图所示 当输入的年月日不符合现实的情况时 程序报错 并提醒重新输 入 正确输入时 显示日历 正确输入时 按照课题的要求将这个月的日历显示出来了 六 专业课程设计总结六 专业课程设计总结 关于万年历 我们可以说再熟悉不过 但是真正到了自己动手和动脑去写 的时候 才发现它里面有不少要学习的东西 在看到题目时 分析的一下题目 看看题目分成哪几个模块 划分好模块后就开始写每个模块的代码 在写的过 程中也要考虑到一些情况 比如输入的年月日是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人接口协议书范本
- 广州市越秀区登峰街招考专职社区工作者易考易错模拟试题(共500题)试卷后附参考答案
- 出售草棚协议书模板
- 冷库设备租用协议书
- 兼职执业药师协议书
- 广东城乡规划设计研究院2025招考易考易错模拟试题(共500题)试卷后附参考答案
- 养老服务培训协议书
- 写作基地挂牌协议书
- 安徽滁州市定远县2025年下半年下半年部分事业单位招考工作人员易考易错模拟试题(共500题)试卷后附参考答案
- 养鸡合作写合同范本
- 2025智能快递柜网络布局优化与运营效率报告
- 2025年大学《水利水电工程-水工建筑物》考试模拟试题及答案解析
- DB11∕T 1355-2016 低温作业和冷水作业职业卫生技术规范
- 江苏省常州市常州高级中学2026届化学高一第一学期期中统考试题含解析
- 元宇宙的运营方案
- 中药就业创业方向分析
- 安全生产烷基化考试题库及答案解析
- 2025南水北调东线总公司公开招聘3人笔试历年常考点试题专练附带答案详解2套试卷
- 海康威视监控设备故障排查与操作手册
- 2025年云南省玉溪市辅警人员招聘考试题库及答案
- 折弯零基础入门知识培训课件
评论
0/150
提交评论