首页 / 资讯中心 / 文章详情

16位实模式汇编万年历课程设计:INT 21H输入与日期校验

16位实模式汇编万年历课程设计:INT 21H输入与日期校验 ★ FEATURED ARTICLE
简介面向汇编语言学习者与《微机接口与汇编语言》课程实践者的万年历显示程序设计文档围绕“输入年月日、输出当月完整日历”这一典型课题展开适合正在做课程设计、或想巩固DOS中断调用与日期算法实现的中级读者参考。压缩包内共1个doc文件约581KB按课题要求、需求与思路分析、概要设计、详细设计及源程序代码的顺序编排便于对照章节逐步阅读。文档重点讲清了用蔡勒公式推算某月第一天是星期几、以INT 21H的0AH功能读入键盘输入、闰年判断与二进制转十进制等子程序的流程并说明了星期六、日两列以红色突出显示、错误输入提示与重新录入、光标定位与满七天换行等界面细节。目前已有837人学习可作为课程设计说明书撰写与程序调试的参照。1. 从一段 16 位实模式代码看万年历为什么课程设计里它值得拆输入20090101屏幕上立刻排出一个整月日历周六周日两列换色输错日期还会提示重来——这套“万年历 汇编”程序第一次跑通时最容易被记住的是蔡勒公式真正让人翻车的却是输入缓冲区、光标坐标和颜色属性这些边角料。这份资源是一套 16 位 DOS 实模式下的汇编课程设计核心功能是读入YYYYMMDD、算出当月天数与 1 号星期、在 80×25 文本模式里排版并用INT 10H的 06H 功能给周末和输入日做色块。它适合正在做汇编课设、需要一份能跑能讲能改的底稿的人也适合想补一补 BIOS 中断和 DOS 缓冲输入实操的初学者。源程序、流程图、测试数据和调试记录放在一起照着复现比只看教科书上的流程图更踏实。2. 输入缓冲区与日期合法性INT 21H 0AH 的真实边界2.1 0AH 缓冲区的三字节结构INT 21H的AH0AH是 DOS 的带缓冲键盘输入入口参数只有一个DS:DX指向缓冲区首址。缓冲区不是随便开一段内存就能用它有一个固定格式首字节由程序员预置“允许接收的字符个数”这个数包括回车键第二字节由 DOS 在输入结束后填入实际键入的字符数不包括回车从第三字节开始依次存放键入的字符最后还会把回车符0DH留在缓冲区里。也就是说缓冲区总容量至少是“最大字符数 2”。课程设计里输入的是 8 位日期写成YYYYMMDD所以缓冲区可以定义成下面这样; 首字节 9 最多 9 个字符8 位日期 回车 ; 第二字节留给 DOS 填实际长度 ; 后面 9 字节放字符和回车 STR1 DB 9, ?, 9 DUP(?)这段定义总长 11 字节看起来比 8 位日期多 3 个字节多出来的就是首字节、长度字节和回车位。调用时这样写LEA DX, STR1 MOV AH, 0AH INT 21H执行后STR11里是实际输入字符数正常输入 8 位日期时应该是 8STR12到STR19是 8 个 ASCII 数字STR110是回车符。很多解析代码直接从STR12开始读 8 位不先看STR11用户少输一位、多输一位或者直接回车读到的就是旧内存或回车符后面算出来的年月日完全不受控。提示0AH 的第二字节是“实际字符数”不含回车首字节是“最大字符数”含回车。这两个数一个由你写一个由 DOS 填别混。2.2 年月日拆解与合法性校验拿到 8 个字符后先做两件事校验是不是 8 位、校验每一位是不是数字。这两步不做过后面所有日期计算都是黑匣子。常见做法是先比较STR11和 8再循环检查0到9MOV AL, [STR11] CMP AL, 8 JNE INPUT_ERROR LEA SI, STR12 MOV CX, 8 CHECK_DIGIT: MOV AL, [SI] CMP AL, 0 JB INPUT_ERROR CMP AL, 9 JA INPUT_ERROR INC SI LOOP CHECK_DIGIT校验通过后把 ASCII 数字转成二进制。年份 4 位、月份 2 位、日 2 位可以写一个通用子程序PARSE_N入口DI指向数字串首地址CX是位数返回AX是转换结果。核心循环是“累加值乘 10 再加当前数字”PARSE_N PROC PUSH BX PUSH DX XOR AX, AX MOV BX, 10 PARSE_LOOP: MOV DL, [DI] SUB DL, 0 XOR DH, DH MUL BX ; DX:AX AX * 10 ADD AX, DX ; 加上当前数字 INC DI LOOP PARSE_LOOP POP DX POP BX RET PARSE_N ENDPMUL BX是 16 位无符号乘法结果在DX:AX。年份最大 9999乘 10 不会溢出 16 位所以只取AX就够。调用时先用LEA DI, STR12、MOV CX, 4取年份再LEA DI, STR16、MOV CX, 2取月份最后LEA DI, STR18、MOV CX, 2取日。每次调用前把DI指到对应位置CX给位数返回后存进YEAR、MONTH、DAY三个字变量。合法性校验分三层。第一层是月份必须在 1 到 12 之间第二层是日必须在 1 到当月最大天数之间第三层是年份范围课程设计通常不限制但至少要避免 0 年导致世纪数除法出现奇怪结果。每月天数用一张表BUF1 DB 31,?,31,30,31,30,31,31,30,31,30,312 月先空着等闰年判断完再填 28 或 29。校验片段可以这样写CMP MONTH, 1 JB BAD_DATE CMP MONTH, 12 JA BAD_DATE p a hrefhttps://download.csdn.net/download/wubinghui888/2226670 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p
阅读完成 · 觉得有帮助?
咨询建站