ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:148.73KB ,
资源ID:6963825      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6963825.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(汇编之万年历课程报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

汇编之万年历课程报告.docx

1、汇编之万年历课程报告汇编课程设计报告一、 系统封面设计设计思路:设置80X25黑白文本方式,设置光标位置,将要显示的信息存入存储区中,用9号调用显示信息。程序如下:STACK SEGMENT STACK DB 200 DUP(0)STACK ENDSDATA SEGMENT A DB WAN NIAN LI CHENG XU XI TONG,$ B DB SHE JI RI QI:2009.9.10,$ C DB SHE JI ZHE:ZHOU YANG,$ D DB 070104021124,$ E DB JI KE 2 BAN,$DATA ENDSCODE SEGMENT ASSUME C

2、S:CODE,SS:STACK,DS:DATASTART:MOV AX,DATA MOV DS,AXABC MACRO ;定义ABC为宏,显示DX中的内容并设置光标位置 MOV AH,9 INT 21H POP DX ADD DH,3H MOV AH,2 INT 10H PUSH DX ENDM MOV AH,0 ;设置80X25黑白文本方式 MOV AL,2 INT 10H MOV AH,15 INT 10H MOV BL,7 PUSH BX MOV AH,2 MOV DX,0412H INT 10H PUSH DX LEA DX,A ;依次显示题目名称,设计日期,设计者姓名、学号及专业班级

3、 ABC LEA DX,B ABC LEA DX,C ABC LEA DX,D ABC LEA DX,E ABC MOV AH,1 ;任意输入一个字符后结束 INT 21H MOV AH,4CH INT 21HCODE ENDS END START系统封面如下:二、 输入画面设计设计思路:1、密码及口令: 输入用10号调用,核查用串比较指令,修改则是先显示提示信息,再用无条件转移指令使重输入数据;2、年份:输入用10号调用,再判断输入的年份是否为4位,不为4位则使重输,否则,再依次判断这4位是否均为整数,一旦发现有一位不为整数就重输。程序如下: DATA SEGMENT B DB 9999 ;

4、B存储区中存放的是密码 N1 EQU $-B EP DB 1111 ;C存储区中存放的是口令 N2 EQU $-EP D DB INPUT SUCCESFULLY!$ H DB SHOW CALENDAR!$ G DB FAIL TO TNPUT!$ DAT DB PLEASE INPUT MIMA:$ DAT1 DB PLEASE INPUT KOUNING:$ DAT2 DB PLEASE INPUT YEAR:$ BUF1 DB 81 DB ? DB 81 DUP(0) FUB DB 81 DB ? DB 81 DUP(?) FP DB * * *$ BUF DB SUN MON TUE

5、 WED THU FRI SAT$ DATA ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AH,0 ;设置80X25黑白文本方式 MOV AL,2 MOV AH,15 INT 10H MOV SI,BX PUSH SI MOV AH,2 MOV DX,0412H INT 10H PUSH DX SUCC MACRO ;定义SUCC为宏,调用宏AA,并

6、显示D中信息, AA 再调用AA LEA DX,D MOV AH,9 INT 21H AA ENDM AA MACRO ;设置光标位置 POP DX INC DH MOV AH,2 INT 10H PUSH DX ENDM FAIL MACRO ;显示“失败”信息 AA LEA DX,G MOV AH,9 INT 21H AA ENDM LEA DX,DAT MOV AH,9 INT 21H INPUT: LEA DX,BUF1 ;输入密码 MOV AH,10 INT 21H CMP BUF1+1,N1 ;核查输入数据位数与密码位数是否相等,若不等则 JE COT 重输,否则转COT,再依次比

7、较各位是否都相等; FAIL 若是,则转NEXT,进行口令输入,否则重输。 JMP INPUT COT: LEA SI,B LEA DI,BUF1+2 CLD CMPSB JZ NEXT FAIL JMP INPUT NEXT: SUCC LEA DX,DAT1 ;输入口令,其核查及修改同密码的核查与修改 MOV AH,9 INT 21H INPU1: LEA DX,BUF1 MOV AH,10 INT 21H CMP BUF1+1,N2 JE COT1 FAIL JMP INPU1 COT1: LEA SI,EP LEA DI,BUF1+2 CLD CMPSB JZ NEXT0 FAIL J

8、MP INPUT NEXT0: SUCC YEAR: LEA DX,DAT2 MOV AH,9 INT 21H LEA DX,FUB ;输入年份并首先判断其位数是否为4 MOV AH,10 INT 21H LEA SI,FUB+2 MOV CX,4 MOV AL,4 CMP AL,FUB+1 JE COM ;若输入数据为4位则转COM,否则重输 FAIL JMP YEAR COM: CMP SI,BYTE PTR 30H ;依次判断输入的各位数据是否均为整数,若是则 JNB Y1 将屏幕上滚十行,否则重输 AA JMP YEAR Y1: CMP SI,BYTE PTR 39H JBE Y2 A

9、A JMP YEAR Y2: INC SI LOOP COM SUCC LEA DX,H MOV AH,9 INT 21H MOV AH,1 INT 21H MOV AH,6 ;将屏幕上滚十行 MOV AL,10 MOV CX,0 MOV DH,24 MOV DL,79 INT 10H MOV AH,2 ;设置光标位置 MOV DX,1 INT 10H PUSH DX LEA SI,FUB+2 ;将输入的年份用串传送指令将各位依次送到 LEA DI,FP+3 FP存储区中 MOV CX,4 CLD REP MOVSB LEA DX,FP ;显示日历的横幅,包括年、月及星期 MOV AH,9 I

10、NT 21H MOV AH,2 POP DX INC DH INT 10H PUSH DX LEA DX,BUF MOV AH,9 INT 21H MOV AH,4CH INT 21H CODE ENDS END START输入画面如下:三、 日历输出设计思路:1、设计一子程序求X年为平年还是闰年,以确定二月的总天数; 2、设计一子程序将X、Y转化为十进制数; 3、设计一子程序求X年Y月Z日是星期几,事实上只需求出X年Y月1日是星期几,其他天均可由1日求得。具体而言就是,由X年Y月1日的星期数确定其在日历图上的位置,便将光标设置在该位置处,再由日历图上每一行靠内的相邻两日之间的距离相等,以出2

11、日、3日等的位置 4、将输出一个月日历的程序段的入口参数尽量减少,最好是仅有X、Y,且是X、Y的一种形式,使其可循环生成一年的日历程序如下: DATA SEGMENT X DW 2008 ;X中存放的是年份 Y DB 4 ;Y中存放的是月份 YUE DW 30 ;YUE中存放的是Y月的总天数 N DB ? ;N中存放的是X年Y月1日的星期数 EE DB 10$ NN DB ? TO DW ? T1 DW 1000 T2 DW 100 T3 DB 10 TP DB 4 DUP(?) FC DW 14 DUP(?) BB DB 10 E0 DW 400 F0 DW 100 G0 DW 4 FUB

12、DB 81 DB ? DB 81 DUP(?) YUF DB 6 DB ? DB 6 DUP(?) YUF1 DB 6 DB ? DB 6 DUP(?) FP DB *2008*4 *$ BUF DB SUN MON TUE WED THU FRI SAT$ P1 DW 2 P2 DW 1,3,5,7,8,3AH,3CH N0 EQU $-P2 P3 DW 4,6,9,3BH N1 EQU $-P3 A DW 0,31,59,90,120,151,181,212,243,273,304,334 FA DB INPUT WRONG!,0AH,0DH,$ FA1 DB INPUT WRONG DA

13、Y!,0AH,0DH,$ YU DB PLEASE INPUT MOON!,0AH,0DH,$ DATA ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATA START: MOV AX,DATA MOV DS,AX ;设置80X25黑白文本方式 MOV AH,0 MOV AL,2 MOV AH,15 INT 10H MOV BL,7 MOV SI,BX PUSH SI MOV AH,2 MOV DX,1 INT 10H PUSH DX SUCC MACRO

14、;设置光标位置并显示“成功”信息 AA LEA DX,D MOV AH,9 INT 21H AA ENDM AA MACRO ;设置光标位置 POP DX INC DH MOV AH,2 INT 10H PUSH DX ENDM FAIL MACRO ;设置光标位置并显示“失败”信息 AA LEA DX,G MOV AH,9 INT 21H AA ENDM LEA DX,FP ;显示一月日历的年、月及星期 MOV AH,9 INT 21H AA LEA DX,BUF MOV AH,9 INT 21H CALL PINGRUN ;求X年是平年还是闰年,若是平年则将DI置 MOV TO,DI 0,

15、否则置1 MOV NN,1 ;将一日的形码送到NN中存放 CALL FIND_Y ;求C MOV BX,DX INC BX CMP Y,2 JBE XXX ADD BX,TO ;BX中的值为C XXX: MOV CX,X ;将年份X放入CX中 CALL DAY ;子程序DAY的入口参数为X和C,出口参 MOV N,DL 数为N(星期数) POP DX ;定X年Y月一日在日历图上的光标位置 POP BX MOV AL,4 MUL N MOV DL,AL ADD DL,2 INC DH MOV AH,2 INT 10H LEA SI,EE MOV DI,1 SHW: PUSH DX ;用9号调用(

16、显示字符)依次显示1到9这几 MOV AL,NN 日,到10 时开始用9号调用(显示字符串) MOV AH,9 MOV CX,1 INT 10H INC DI ADD NN,1H CMP NN,39H JA SH2 POP DX ;查看光标位置是否超过日历图的右边缘,若 CMP DL,22 是则转下一行,否则行号不变列号怎加 JBE SH1 INC DH MOV DL,2 MOV AH,2 INT 10H JMP SHW SH1: ADD DL,4 MOV AH,2 INT 10H JMP SHW SH2: CMP DI,YUE ;判断Y月是否显示完毕,若是则任输 JA TER 一字符后结束,

17、否则继续显示 POP DX CMP DL,22 JBE SH11 INC DH MOV DL,2 MOV AH,2 INT 10H PUSH DX JMP HHH SH11: ADD DL,4 MOV AH,2 INT 10H PUSH DX HHH: LEA DX,EE ;显示10以上的数据是将其以字符串的形式显 MOV AH,9 示,低地址存放数据的高位,高地址存放数据 INT 21H 的低位数字,在该该存储区EE中初值为10 INC DI 从10开始增加,高地址数据先增,低地址的 ADD SI+1,BYTE PTR 1 后增,且用DI做计数器,每当(DI)达到十 CMP DI,10 的整

18、数倍时,低地址数据加1,同时高地址数 JE DDA 置0 CMP DI,20 JE DDA CMP DI,30 JE DDA JMP SH2 DDA1: MOV SI+1,BYTE PTR 30H JMP SH2 DDA: ADD SI,BYTE PTR 1 JMP DDA1 TER: MOV AH,1 INT 21H MOV AH,4CH INT 21H PA10 PROC ;将从键盘输入一个或两个字符化为十进制数 MOV DI,SI MOV AL,2 CMP AL,SI+1 JA PP2 SUB BYTE PTR SI+2,30H MOV AL,SI+2 MUL BB SUB BYTE P

19、TR SI+3,30H MOV BL,SI+3 MOV BH,0 ADD AX,BX JMP EXIT2 PP2: MOV AL,DI+2 SUB AL,30H MOV AH,0 EXIT2: RET ENDP PINGRUN PROC ;入口参数为年份X,利用满足式子X%400=0或X%4=0 MOV AX,X 且X%100!=0就为闰年,否则就是平年。若是平年, MOV DX,0 就将0赋给DI,反之送1 DIV E0 CMP DX,0 JZ SS2 MOV AX,X MOV DX,0 DIV F0 CMP DX,0 JE SS1 MOV AX,X MOV DX,0 DIV G0 CMP

20、DX,0 JE SS2 SS1: MOV DI,0 JMP EXIT0 SS2: MOV DI,1 EXIT0: RET ENDP FIND_Y PROC ;令X年Y月Z日是这一年的第C天,M=X1+ LEA SI,A (X1)/4(X1)/100+(X1)/400,总 MOV BH,Y 天数为S,则有S=M+C,星期数N=S%7 MOV BL,1 FIND: CMP BH,BL JE NP INC BL ADD SI,2 CMP BL,12 JBE FIND LEA DX,FA MOV AH,9 INT 21H EXIT3: RET NP: MOV DX,SI JMP EXIT3 ENDP

21、DAY PROC ;(CX)=X,(BX)=C,通过式子S=M+C和N=S%7得到 MOV AX,CX N,此子程序的最终结果N在DX中 MOV DX,0 DEC AX MOV SI,AX ;(SI)=X-1=(DI) MOV DI,AX MOV DX,0 DIV G0 ADD SI,AX ;(SI)=(SI)+(X-1)/4 ADD SI,BX MOV AX,DI MOV DX,0 DIV F0 SUB SI,AX ;(SI)=(SI)-(X-1)/100 MOV AX,DI MOV DX,0 DIV E0 ADD SI,AX ;(SI)=(SI)+(X-1)/400 MOV AX,SI M

22、OV DX,0 MOV BX,7 DIV BX ;(DX)=S%7=N RET ENDP CODE ENDS END START日历图如下:四、 A、 程序系统总体功能模块调用图及模块功能说明:封面:设置80X25黑白文本方式2号调用设置光标位置、9号功能调用显示封面信息输入画面:设置80X25黑白文本方式 B、 程序系统详细的程序框图(每个子程序的流程图);在程序系统中有如下几个子程序:PA10、PINGRUN、FIND-Y、DAY,它们的流程图分别如下: PA10:将从键盘输入一个或两个字符化为十进制数其流程图如下: PINGRUN:入口参数为年份X,利用满足式子X%400=0或(X%4=

23、0且X%100!=0)就为闰年,否则就是平年。若是平年,就将0赋给DI,反之送1 其流程图如下: FIND-Y:令X年Y月Z日是这一年的第C天,M=X1+(X1)/4(X1)/100+(X1)/400,总天数为S,则有S=M+C,星期数N=S%7LEA SI,AMOV BH,YMOV BL,1其程序流程图如下:CMP BH,BL DAY:(CX)=X,(BX)=C,通过式子S=M+C和N=S%7得到N,此子程序的最终结果N在DX中其程序流程图如下:MOV AX,年份,MOV BX,CMOV DX,0,DEC AX,MOV SI,AX,MOV DI,AXMOV DX,0,DIV G0 结束五、

24、系统设计及实现的技术特点、不足及改进的建议: 在系统设计及实现的技术上,一度让我头疼的是面对明显错误的程序不知错在哪里,渴望有一种东西专门用来指出错误在哪里,在没有这种东西的情况下,我也想了一种办法,那就是使用提示信息,在不同的位置放上它可以找出一些错误,但这种方法耗时耗力,而且有些错误还是发现不了。例如本次作业中我做了一个显示X年Y月的日历的主程序,但将其转变成子程序就出问题。本次作业的不足之处在于这一点,如果解决了这一点,就可以在仅输入年份的情况下输出一年的日历,也可以在输入年份及月份的情况下输出一个月的日历。六、 课程设计的体会要点: 通过此次课程设计,我了解到课程设计是一门非常讲究思路严谨的课程,在设计的过程中不仅让我对所学知识进行更深一步的了解,比如说宏与子程序,对于它们的区别我原以为已经了解清楚了,但这次编程上机后我才发现自己了解的实在微乎其微,宏可以调用子程序吗?子程序可以调用宏吗?两者在程序中的位置呢?以前都没有想过这些问题,所以我发现上机可以学到许多书本上学习不到的地方。而且,编程需十分严谨,一旦有一种情况没有顾虑到就可能产生很大的错误。另一方面,我觉得编程可以让我们的思维严谨。在不断写程序、该程序的过程中我受益良多。编程的这段日子是我大学以来最充实的日子,我很累,但很开心。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1