汇编语言课程实习报告实习题目打字游戏学生姓名陈世虎班级计科1093班院系信息学院指导老师提交时间2011/6/22成绩1目录1课程实习任务………………………………………………………………………12基本知识…………………………………………………………………………….12.1汇编语言程序结构……………………………………………………………22.2关键指令分析…………………………………………………………………22.3汇编语言上机过程……………………………………………………………33总体分析…………………………………………………………………………….33.1程序功能分析…………………………………………………………………33.2主程序流程图…………………………………………………………………44详细设计…………………………………………………………………………….54.1菜单模块………………………………………………………………………54.2输入模块………………………………………………………………………54.3游戏模块………………………………………………………………………64.4游戏结束模块…………………………………………………………………64.5速度设置模块………………………………………………………………....65代码实现…………………………………………………………………………….75.1主程序代码……………………………………………………………………..75.2~5.11部分子程序代码…………………………………………………………..85.12延时子程序代码……………………………………………………………....145.13字母下降子程序……………………………………………………………....155.14产生新字母子程序代码……………………………………………………….165.17游戏逻辑子程序代码………………………………………………………….175.18其他各子程序模块…………………………………………………………….186调试过程…………………………………………………………………………...197使用说明…………………………………………………………………………...208总结………………………………………………………………………………...209参考文献…………………………………………………………………………..2021.课程实习任务设计题目:打字游戏基本功能:1.在屏幕上显示菜单界面;2.按回车键出现由26个字母组成的乱序行;3.其中任一字母落下,在键盘上敲入该字母,如果输入正确,字母消失;4.按空格键停止,按ESC键返回主菜单,按q键退出程序。用汇编语言编写,完成设计报告。2.基本知识本次设计用的汇编语言基本知识如下:2.1汇编语言程序结构主体程序结构框架datasegment……dataendscodesegmentassumecs:code,ds:data,es:extrastart:movax,datamovds,ax……call****……movax,4c00hint21hcodeendsendstart子程序结构框架Nameprocfar……Nameendp宏定义结构框架Namemacro参数……Endm2.2.关键指令的分析本次设计主要用到算术指令,逻辑指令,控制转移指令等3如loop指令,用于循环执行某条或者某块指令集直到默认的参数(CX)为零,退出循环,执行loop循环下的下一条指令。Jmp无条件跳转指令,跳转到一个指定的标号位置。条件转移指令JZ/JNZ、JE/JNE等等,用于判断相应的标志位是否满足条件,若满足则跳转,不满足就继续往下一条指令执行。CMP比较指令,用于比较两个数的大小,设置标志位,通常和条件跳转指令关联用。CALL调用指令,用于调用子程序Int中断指令,用于中断操作此外,还有其他的一些指令,比如说加法add指令,减法指令等,本次设计用到了大量的指令。2.3汇编语言上机过程a:建立汇编源程序b:编译目标文件(即:编译为.obj.lst.crf文件)c:编译不通过,重新修改d:连接为可执行文件e:运行编译好的可执行文件f:用调试工具调试3.总体分析3.1程序功能分析本次设计的是打字游戏,因此,在屏幕落下字母,输入字母,并且判断输入字母和落下来的字母是否相同,如果相同,则字母消失,否则字母下落到屏幕底部消失。其具体功能如下:1.按回车键进入游戏,ESC键退出2.进入速度选择界面,h键高速,l键低速,s键重新设置速度,其他键默认为普通速度其他键(包括回车键)3.若进入速度设置界面,输入1-999的数,表示速度为普通速度的百分之几4.游戏中按esc退出,同时显示游戏总共出现字符数,所得分数,同时提示游戏是否重新开始,y返回主界面,n退出5.游戏过程中按space键暂停,再次按space键继续进行游戏43.2主程序流程图调用子程序init初始化主界面开始调用playgame子程序进入游戏调用setiterface设置游戏界面调用speedchoose子程序选择速度调用isrestart子程序是否回到主界面Ax=0?Al=0?退出是否否是54.详细设计4.1菜单模块打开软件,进入的是菜单界面模块,如上图,有两种选择,按enter键进入游戏,按ESC键退出进入程序。4.2速度选择模块选择enter进入游戏,那么首先选择设置游戏的速度,有三种可供选择,还可以设置适合自己的速度。64.3游戏模块进入游戏,可以开始游戏,一次落下一个字母,当键入一个字母正确时,字母消失,不然待字母落到底端,显示字母。字母的不同的位置有不同的显示颜色,在前1/3为绿色,在中间的1/3为红色,在最后1/3为红色。在游戏过程中,可以按esc键退出游戏,按space键暂停游戏,再次按space的时候继续游戏。4.4游戏结束模块要退出游戏时,会显示一共落下的字母数,和玩家击中的字母数,还提示信息,是否返回主界面,如果键入y,则返回,n则直接退出程序4.5设置游戏速度模块7在这里,你可以设置适合自己的速度,如图输入了789,则以普通速度的8倍进行游戏。5.代码实现5.1主程序代码movax,datamovds,axmoves,axRESTART:callInitcmpax,0jeLexit;如果退出callSpeedChoosecallSetInterfaceLgetTime:callPlayGamescmpal,0;是否有结束标志jneLgetTimeLendGame:callGameOverCALLIsRestart8cmpal,0jeLexit;如果退出movbx,RESTARTjmpbx;重新开始Lexit:movax,4c00hint21h5.2输出单个数字子程序代码outnumprocnear;入口参数:ax,传递ax的值给dx的低八位dl以便输出movdx,axordl,30hmovah,02hint21hretoutnumendp5.3;计算数字位数子程序CountNumprocnear;入口参数:ax,传递要输出的分数movcx,1;计算输出位数cmpax,10jlLendCountinccxcmpax,100jlLendCountinccxcmpax,1000jlLendCountinccxcmpax,10000jlLendCountinccx;保存在cxLendcount:retCountNumendp;出口参数:cx,保存数字位数5.4输出数字子程序CoutNumprocnear;入口参数:cx,callCountNum后传递数字位数pushaxcallCountNum;计算数字位数popaxcmpcx,5;5位数字开始Dxalx加上30h调用21h中断输出返回9jlLsmlth1movbx,10000xordx,dxdivbxpushdxcalloutnum;显示万位数字popaxLsmlth1:;千位数字cmpcx,4;4位数字jlLsmallhun1xordx,dxmovbx,1000divbxpushdx;余数calloutnum;显示千位数字popaxLsmallhun1:;显示百位数字;cmpax,100cmpcx,3;3位数字jlLsmallten1movbl,100divblpushaxcalloutnum;显示百位popaxmoval,ahxorah,ah;al和ax中放的数一样大小Lsmallten1:;显示十位数字cmpcx,2;3位数字jlLsmallone1movbl,10divblpushaxcalloutnum;显示十位popaxmoval,ahxorah,ah;al和ax中放的数一样大小Lsmallone1:;显示个位数字calloutnumretCoutNumendp5.5游戏结束模块GameOverprocnear;;游戏结束界面设置和分数显示10clear_screen0,0,24,79,10011111b;蓝色背景白色前景界面;--------------------------总共字符数,totalmenu07,20,score_msg1movax,totalcallCountNum;计算数字位数,出口参数在cx中movbl,52;addbl,cl;计算数字输出的列坐标后面紧跟chars输出pushbxclear_screen07,52,07,bl,10011100b;分数处颜色为红色curse07,52movax,totalcallCoutNum;输出数字popbxincblmenu07,bl,score_msg2;用到上面的bl;------------------score;击中的字符数menu09,20,score_msg3movax,scorecallCountNum;计算数字位数,返回值在cx中movbl,33addbl,cl;列坐标后面紧跟分数score的输出pushbxclear_screen09,33,09,bl,10011100b;分数处颜色为红色curse09,33movax,scorecallCoutNum;输出数字popbxincblmenu09,bl,score_msg2;------------------callCountNum;计算数字位数,返回值在cx中movbl,53addbl,cl;列坐标pushbxclear_screen11,53,11,bl,10011100b;分数处颜色为红色popbxincblmenu12,20,restart_msg;显示是否重新开始menu14,20,restart_msg1curse14,48Legame:retGameOverendp;115.6返回主菜单模块IsRestartprocnear;判断程序是否继续recin:;重新输入curse14,51movah,02hmovdl,''int21hcurse14,47leadx,char_ynmovah,0ahint21hmoval,char_yn[2]oral,20hcmpal,'y'jneisnomoval,1jmpendreisno:cmpal,'n'jnerecinxoral,alendre:retisrestartendp;出口参数:al,传递值在主程序是否退出,0为退出5.7输入速度模块CinNumprocnearLreCin:curse13,27;清除输入垃圾值movcx,3movah,02hLcout:movdl,''输入速度设子程序-》int21hloopLcout;输入字符串curse13,27leadx,numcharmovah,0ahint21hxorcx,cxmovcl,numchar[1];输入数字个数leasi,numchar[2];输入的最高位数字的偏移地址开始调用光标设置宏输入值清除Cx=输入个数输入并判断是否合法Al=al*10返回Cx=0?Ax=0?否是是否否是Speednum=ax12xorax,ax;输入数