1、汇编语言程序设计报告上海应用技术学院课程设计任务书课程名称汇编语言课程设计课程代码B704207设计题目打字练习程序题目序号设计时间2012年 6月 18日 2012年 6月 21日系(院)计算机科学与信息工程专业计算机科学与技术班级101041B1、2一、课程设计任务(条件)、具体技术参数(指标)本课程设计是80X86汇编语言程序设计课程的后继教学环节, 通过对一个较大型的、综合性的应用程序进行阅读、修改、添加功能等工作, 使学生对汇编语言程序设计有更进一步的认识, 提高阅读理解复杂程序的能力和程序设计能力。根据所给的“typetest.asm”应用程序框架, 在此基础上修改和添加功能。基本
2、任务: 认真阅读“typetest.asm”源程序, 理解程序每一条指令在程序中的作用。绘制程序流程图(简略总图,各模块详细流程图),给程序中的关键语句(后跟分号)作注释。 设置输入界面, 用户输入密码后才能进入主菜单 ; 修改主菜单, 在主菜单上显示当天日期 ; 修改主菜单, 增加可供用户选择难度级别的选项。 为用户打分,正确输入字母使用时间越少,得分越高。 修改程序, 在屏幕右上角显示用户得分、已输入字母数、正确数。 将程序中的“置光标位置”程序段落用宏调用完成, 添加“置光标位置”宏定义。扩展任务: 设置限定时间,到达该时间,用户尚未得到要求的分数时,游戏停止。 到达限定时间,用户得分达
3、到预设的值时, 自动提高难度等级, 屏幕变色。 修改程序,底行的笑脸字母消失后,不再在该列下落字母(提示:设置数组记录笑脸字母的存在与否)。笑脸字母全部消失后, 游戏停止, 显示告别画面,显示用户成绩。其他任务: 自行设计新的功能。二、对课程设计成果的要求(包括课程设计说明书、图纸、图表、实物等软硬件要求)(1) 分析原“typetest.asm”程序结构: 画出主程序粗略的流程图和三至五个主要模块的详细流程图,并用文字说明他们的功能(与对应流程图放在一起);(2) 对你已经实现的功能(修改的、新编写的)做详细的说明, 并附上流程图及程序清单(修改/增加的指令请使用大写字母,以示区别);(3)
4、 自己对该“打字练习程序”的进一步设想;(4) 对于有设想但最终未实现的功能的大致编程思路的阐述;(5) 论述在设计过程中遇到的并且对你具有启发性的问题。(6) 严禁抄袭,发现雷同,双方扣分。三、课程设计工作进度计划:周一:教师布置任务,讲解本课设模块。学生细读原始源程序,在重要行添加注解。周二:画出主程序粗略的流程图和各个模块的详细流程图,开始基本任务。周三周四:设计程序及调试程序。同时着手写报告。周五:完成设计,提交报告,接受教师考评。四、主要参考资料1 杨文显,宓双,胡建人.新编汇编语言程序设计,清华大学出版社,20102 朱玉龙,任文览等.汇编语言程序设计,清华大学出版社,20033
5、美Kip R.Irvine. 电子工业出版社,2004指导教师(签名):周炜 教研室主任(签名):杨晶鑫 2012年 6 月 15 日 2012年 6 月15 日目录1原“TYPETEST.ASM” 程序结构设计说明11.1显示菜单模块11.2字母下落模块22基本任务程序结构设计说明32.1用户密码模块32.2级别难度模块32.3显示当前日期模块42.4分数设定模块42.5置光标位置宏定义模块53扩展任务程序结构设计说明53.1 未达到要求游戏终止模块53.2难度等级, 屏幕变色模块63.3 笑脸字母不在该列下落字母模块64其它任务程序结构设计说明74.1退出 模块74.2暂停等待模块74.3
6、配背景音乐75课程设计总结86附录(原代码)83汇编语言程序设计报告YesEnterNoE显示菜单:1、显示边框2、显示文字3、等待输入语句判断是否:enter或E开始游戏:1、画面布置(四周、笑脸、78个字母)2、直到按下esc终止退出判断是否为:esc1 原“typetest.asm” 程序结构设计说明清屏显示四条边框显示菜单提示文字1.1 显示菜单模块清屏、显示边框、菜单提示文字通过宏定义,其次再进行调用。1.2 字母下落模块字母正确循环=21无输入or字母不正确Esc通过取系统时间来取随即数随机数是否大于78随机数减去78取该位置上的字母进行下落保存该字母的列号该字母用“空格替换”,下
7、一行显示该字母判断是否有字符输入循环=21主菜单在该位置填补另一个字母笑脸用空格代替2 基本任务程序结构设计说明 主菜单提示输入密码输入一串字符判断字符串是否相等NoYes进入主菜单2.1 用户密码模块在原先的进入练习界面入口前增加一个前置入口,提示用户输入密码。然后等待用户输入字符,马上与密码的第一字符进行匹配,如果符合,等待下一个字符;如果不匹配,直接从头开始,重新输入。当用户输入密码正确时,跳入下一个接口。通过输入0(hard)、1(normal)、2(easy)Speed中地址加0、2、4来对改变程序中的speed2.2 级别难度模块在输入用户密码后,让用户自己选择练习的难度级别,难度
8、级别直接由游戏的速度决定,速度越大越难。本程序设置了三个层次的难度,分别由三个速度控制。实现方法:提示难度选择,并根据用户选择的数字(0-2),直接改变speed的数值,进行相关难度的练习。CALL SHOWDATESMOV AH,2AH ;取系统日期 INT 21HSETM 07H,22DMOV AX,CX;年MOV DX,0FFFFH ;月日CALL WRITEDECMOV DL,/ ;/ MOV AH,02HINT 21H2.3 显示当前日期模块在程序的主菜单界面上会显示当前练习的日期,为程序的一些拓展功能(比如:不同日期成绩的比较或者某一天的最高最低分等等)提供了可能。实现方法:用库子
9、程序call调用显示日期的showdates子程序实现相关的显示。子程序显示日期的主要思想是利用dos功能2ah取系统日期。需要用到的指令详见设计说明。2.4 分数设定模块根据输入正确的个数,和下落字母的个数通过做除法得到相应的分数incgeshupush axpushdxpushbxmovax,correctmovbx,100mulbxmovbx,geshudivbxmovscore,ax输出开 始2.5 置光标位置宏定义模块guangbmacrol,hmov ah,02hmov bh,00hmov dl,lmov dh,hint 10hendm结 束每一级的分数大于60 则进入下一级3 扩
10、展任务程序结构设计说明每掉落10个字母判断:该等级是否已经合格继续下一个等级Yes游戏终止No3.1 未达到要求游戏终止模块每一级的分数大于60 则进入下一级,否则游戏终止3.2 难度等级, 屏幕变色模块每掉落10个元素,等级难度增加将speed 减少1000,使速度变快通过库子程序函数scroll来将整个画面变色改变屏幕和增加速度,使用cout,每15秒记录一次,符合继续游戏的条件时增加难度并改变屏幕。;cout为偶数时,变屏为蓝底黄字;cout为奇数时,变屏为黑底白字。定义数组,将数组中各个元素相加放入ax判断:ax是否等于78所有的字母都取到了游戏结束YesNo继续选取字母进行下落判断该
11、位置是否已经下落过字母No字母开始下落Yes3.3 笑脸字母不在该列下落字母模块4 其它任务程序结构设计说明按下“ E ”后进入退出窗口4.1 退出 模块若想继续,则按esc若想退出,再按一次“E”Esc回到主菜单“”退出判断是否按下“空格”4.2 暂停等待模块(设想、执行结果需时间)切换到新画面4.3 配背景音乐(设想)在执行程序时添加执行一段音乐的指令4.4 分数保存模块通过有关对于文件的指令,进行分数的保存5 课程设计总结通过短短一周的学习和设计,我学会了怎样用汇编语言去编写一个较复杂的程序,而不是仅仅停留在编写简单小程序上,在编写的同时,我明白了编写程序其实也是一个学习进步的过程,特别
12、是当遇到问题的时候,我自己能查阅资料,包括网上资料和图书馆资料;不仅如此,同学之间的交流和互助也是必不可少的,因为在日后的工作中,一个大程序往往需要几个甚至几十个人一起编写,那么合作的能力就显得至关重要。这次程序设计为我积累了宝贵的经验。我的课程设计题目是在原有的打字游戏基础上,进行添加新的功能。在编程开始阶段,我自己不能完全理解程序的编写方法,觉得程序很大,很难掌握,但是通过第一个晚上老师的讲解,我完全明白了程序的流程,每个小程序的意义,每一个功能要做的几个步骤,在那一天,我明白了很多我平时没有掌握的语句,也为周五期末考试带来了很大的帮助。在编写阶段,我遇到了不少难题,有些问题是本学期我没有
13、学好的,例如,在调用宏定义或者子程序时,没有注意保护住程序中要用的参数,而子程序或者宏中却改变了BX或者CX等寄存器中的数据,造成程序编写失败,通过学习,我明白了PUSH和POP在实际程序中的意义和运用。又例如,在我编写一段长程序后,发现LOOP指令或者JE等比较语句指令出错,我初始以为自己的程序有错误,但是仔细检查并没有问题,经过询问老师,我知道这些指令的跳转是有范围的,而我的长程序造成了不跳转超出范围,需要用JMP的 绝对跳转指令才能够实现。在完善调试阶段,我搜集研究了一些其他功能,比如说增加程序的背景音乐,但是在移植进入到我的程序时,产生了错误,暂时还不能解决。对于扩展功能,我又通过与同
14、学讨论,研究学习,现已经基本调试成功,可以较好的演示。同过一周的紧张学习,我独立完成课程设计的内容,我认为我基本完成了课程设计的任务,并且我也已经竭尽我的全力。在日后的学习过程中,我会更深入地去学习汇编语言,做到真正的,完全的掌握。6 附录(原代码)include ylib.h; Assembly program for test your type skills ; Writed by in 06/24/2003; Modified by Mi shuang in 06/06/2005; -guangbmacrol,h; 置光标位置movah,02hmovbh,00hmovdl,lmovdh
15、,hint 10hendm; -Init_boardermacrorow, col, char, dhdl, count;Localllmovcx, count movdh, rowmovdl, colll:movah, 02hmovbh, 00hint10hpushcxmovah, 0ahmoval, char movbh, 00hmovcx, 01hint10hpopcxincdhdlloopll endm; -clear_screenmacrotop, left, bottom, right; 清屏宏定义movah, 06h moval, 00hmovbh, 07hmovch, topm
16、ovcl, leftmovdh, bottommovdl, rightint10hguangb00h,00hendm; -menumacrorow, col, text; 菜单显示宏定义 guangbcol,rowmovah, 09hleadx, textint21hendm; =DatasegmentZKdbWELCOME TO PLAY$ datedbDate:$mes0dbPress Enter key to continue.$mes1dbWhen a letter is dropping,please hit it!$mes2dbPress space key to pause!$m
17、es3dbPress ESC key to return main interface!$mes4dbPress letter E to exit!$mes5dbif you want to quit ,please press E again!$mes6dbif you dont want to leave ,press esc$Speeddw3000H,4000h,5000hcurrentspdw0Lettersdbjwmilzoeucgpravskntxhdyqfbdbiytpkwnxlsvxrmofzhgaebudjqdbnwimzoexrphysfqtvdcgljukdaleveld
18、bchoose the Level of difficulty:$level0dbhard:0 normal:1 easy: 2$level1db0,0Present_positiondb1db0;passworddbPlease input the password:$passdw1234wrongdbpassword failed$pdw0inputdw0correctdw0scoredw0inpdbinput:$codbcorrect:$scdbscore:$geshudw0shuzudb79 dup (?)kdb0yeardw ?month db ?day db ?Dataends;
19、=codesegmentmainprocfarassumecs: code, ds: datastart:movax, datamovds, axmoves, axmovcx, 1000h ;设置光标类型movah, 01hint10h;clear_screen00d, 00d, 24d, 79d;清屏Init_boarder00d, 00d, 0ah, dl, 80dInit_boarder24d, 00d, 0ah, dl, 80dInit_boarder00d, 00d, 0ah, dh, 25dInit_boarder00d, 79d, 0ah, dh, 25d;guangb15d,0
20、7d; 设置光标位置lea dx,passwordcallreadintmovp,axmovax,word ptr passjef1guangb15d,09d; 设置光标位置movah,09leadx,wrongint 21hjmpexitf1:STRAT1:clear_screen00d, 00d, 24d, 79d;清屏Init_boarder00d, 00d, 0ah, dl, 51dInit_boarder24d, 00d, 0ah, dl, 80dInit_boarder00d, 00d, 0ah, dh, 25dInit_boarder00d, 79d, 0ah, dh, 25d;
21、- 显示菜单menu05d, 15d, ZKmenu07h, 15d, datepush dx ;显示当天的时间mov ah,2ahint 21hmov year,cxmov month,dhmov day,dlmov dx,-1mov ax,yearcall writedecmov ah,0mov al,monthcall writedecmov dx,-1mov al,daycall writedecpop dxmenu09d, 15d, levelmenu10d, 18d, level0menu12d, 18d, mes1menu14d, 18d, mes2menu16d, 18d, m
22、es3menu18d, 15d, mes4;-右上角的分数显示guangb49d,00d; 设置光标位置movax,scoreleadx,sccallwriteintguangb59d,00d; 设置光标位置movax,inputleadx,inpcallwriteintguangb69d,00d; 设置光标位置movax,correctleadx,cocallwriteint;-分数统计清零选择难度进入keyin:movscore,0movcorrect,0movinput,0movah, 07h;从键盘输入命令字符(不显示输入;直接控制台i/o)int21hmovlevel1,alcmpa
23、l, 0;判断是否为“0” jebb;若为回车,则执行begincmpal, 1;判断是否为“1” jebbcmpal, 2;判断是否为“2” jebbcmpal, E;判断是否为“E”jeexit;若为 E ,则退出jmpkeyin;否则继续输入命令字符bb:jmpbegin;临时跳转;-退出时二次确认exit:clear_screen00d, 00d, 24d, 79d;清屏Init_boarder00d, 00d, 0ah, dl, 80dInit_boarder24d, 00d, 0ah, dl, 80dInit_boarder00d, 00d, 0ah, dh, 25dInit_bo
24、arder00d, 79d, 0ah, dh, 25d;guangb49d,00d; 设置光标位置movax,scoreleadx,sccallwriteintguangb59d,00d; 设置光标位置movax,inputleadx,inpcallwriteintguangb69d,00d; 设置光标位置movax,correctleadx,cocallwriteintmenu10d,15d,mes5menu13d,15d,mes6movah,01int21hcmpal, 1bh; 如果键入ESC,则返回主菜单jesttcmpal,Ejneeximovax, 4c00hint21hexi:j
25、mpexit;-临时跳转to:jmpto_startstt:jmpSTRAT1;-改背景deccc:pushaxmovax,score;andax,0ffffhcmpscore,60xx:jbexipopaxscroll0,0,24,79,00101111bpushaxmovax,currentspsubax,1000movcurrentsp,axpopaxcopy:Init_boarder00d, 00d, 0ah, dl, 80dInit_boarder24d, 00d, 0ah, dl, 80dInit_boarder00d, 00d, 0ah, dh, 25dInit_boarder0
26、0d, 79d, 0ah, dh, 25d;Init_boarder23d, 01d, 01h, dl, 78d; 显示最底层的笑脸guangb01d,01d; 设置光标位置movcx, 78 leasi, lettersnextletter11:movah, 02h; 显示字母movdl, siint21hincsiloopnextletter11jmpdecndecc:pushaxmovax,score;andax,0ffffhcmpscore,60jbxxFJMPXXXxxF:JMPEXITXXX:popaxscroll0,0,24,79,00011111bpushaxmovax,cur
27、rentspsubax,1000movcurrentsp,axpopaxcopy1:Init_boarder00d, 00d, 0ah, dl, 80dInit_boarder24d, 00d, 0ah, dl, 80dInit_boarder00d, 00d, 0ah, dh, 25dInit_boarder00d, 79d, 0ah, dh, 25d;Init_boarder23d, 01d, 01h, dl, 78d; 显示最底层的笑脸guangb01d,01d; 设置光标位置movcx, 78 leasi, lettersnextletter22:movah, 02h; 显示字母mov
28、dl, siint21hincsiloopnextletter22jmpdecnex:jmpexit;-进入游戏显示 底层笑脸、78个字母begin:clear_screen01d, 01d, 23d, 78d ; Init_boarder23d, 01d, 01h, dl, 78d; 显示最底层的笑脸guangb01d,01d; 设置光标位置movcx, 78 leasi, lettersnextletter:movah, 02h; 显示字母movdl, siint21hincsiloopnextletterjmpstart_gamellll:jmpdeccclll:jmpdecc;-统计有
29、笑脸的个数start_game:;PUSH CX;PUSH AX;LEASI,SHUZU;MOVCX,79;MOVAX,0;F4:ADDAX,SI;INCsi;LOOPF4;CMPAX,78;JEex;POPAX;POPCX;-随机选举一个位置,并判断是否曾有过cmpgeshu,10jellllcmpgeshu,20jelllcmpgeshu,30jeexdecn:movah, 2chint21h;取系统时间incdl;dl+1pushbx;MOVbl,DL;movbh,0cmpdl, 78jnasg1subdl, 78;dl-78sg1:MOVbl,DLmovbh,0cmpshuzubx,0
30、;jnzstart_gamemovpresent_position, dl;present position-dl;movshuzu+bx,1dpopbxleadi, lettersadddi, word ptr present_position;选取随即掉落的字母decdi; 掉落字母-1=该字母的位置movdl, present_position; 设置光标位置movdh, 01h;guangbpresent_position,01d; 设置光标位置movcx, 21d;-根据选择的难度来nextrow:;cmpgeshu,10;jaewait_for_keypushcxpushaxpus
31、hbxpushdxmovax,word ptr level1andax,0fhmovbx,2mulbxmovbx,axmovcx, speed+bx;movcurrentsp,cxpopdxpopbxpopaxwait_for_key:; 延迟pushcxmovcx,currentspdelay:loopdelay;-游戏时不等待按键输入pushdxmovah, 06h; 从键盘输入字符movdl, 0ffh;直接控制台I/Oint21hpopdxjzpasss;键没有被按下,ZF=1incinputcmpal, 1bh;decinput; 如果键入ESC,则返回主菜单jeto_startcm
32、pal, ; 如果键入SPACE,则游戏暂停jnepass0; 如果键入不是SPACE,则转到pass0pause:pushdx; 暂停处理movah, 06hmovdl, 0ffhint21h;等待输入一个“指令”incinputpopdxcmpal, ;jnepause; 如果键入不是SPACE,则继续等待输入一个指令jmppasss;如果键入是SPACE,则转到passsto_start:decinpjmpf1pass0:cmpal,di; 输入字母正确!则字母消失jedisappearpasss:popcx;LOOPwait_for_key;jmpdownla:jmpnextrow;-
33、字母下落down:movah, 0ah; 在当前光标位置写空格moval, movbh, 00hmovcx, 01hint10h;incdh; 行序 +1guangbdl,dh; 改变光标位置movah, 0ah; 在当前光标位置写字母moval, dimovbh, 00hmovcx, 01hint10h;popcxdeccxjnzla;loopnextrow; 下一行;-笑脸消失letter_over:;movah, 0ah;在最后笑脸前一行处显示空格 moval, movbh, 00hmovcx, 01hint10h;incdh;guangbdl,dh;置光标位置为笑脸行movah, 0ah; 在最后笑脸行处显示空格moval, ;movbh, 00hmovcx, 01hint10hpushdxpushsimovdh,0movsi,dxmovshuzusi,1POPSIPOPDXjmpnext_letter;-; 击中字母后输出空格disappear:popcxpopcxinccorrectmovah, 0ah;mov
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。
Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1
陕公网安备 61072602000132号 违法和不良信息举报:0916-4228922