汇编语言课程实习报告实习题目打字游戏院系信息学院指导老师提交时间2011/6/22成绩目录1课程实习任务………………………………………………………………………12基本知识…………………………………………………………………………….12.1汇编语言程序结构……………………………………………………………22.2关键指令分析…………………………………………………………………212.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参考文献…………………………………………………………………………..20课程实习任务设计题目:打字游戏基本功能:1.在屏幕上显示菜单界面;2.按回车键出现由26个字母组成的乱序行;3.其中任一字母落下,在键盘上敲入该字母,如果输入正确,字母消失;4.按空格键停止,按ESC键返回主菜单,按q键退出程序。2用汇编语言编写,完成设计报告。1.基本知识本次设计用的汇编语言基本知识如下:2.1汇编语言程序结构主体程序结构框架datasegment……dataendscodesegmentassumecs:code,ds:data,es:extrastart:movax,datamovds,ax……call****……movax,4c00hint21hcodeendsendstart子程序结构框架Nameprocfar……Nameendp宏定义结构框架Namemacro参数……Endm1.2.关键指令的分析本次设计主要用到算术指令,逻辑指令,控制转移指令等如loop指令,用于循环执行某条或者某块指令集直到默认的参数(CX)为零,退出循环,执行loop循环下的下一条指令。Jmp无条件跳转指令,跳转到一个指定的标号位置。条件转移指令JZ/JNZ、JE/JNE等等,用于判断相应的标志位是否满足条件,若满足则跳转,不满足就继续往下一条指令执行。CMP比较指令,用于比较两个数的大小,设置标志位,通常和条件跳转指令关联用。CALL调用指令,用于调用子程序3Int中断指令,用于中断操作此外,还有其他的一些指令,比如说加法add指令,减法指令等,本次设计用到了大量的指令。2.3汇编语言上机过程a:建立汇编源程序b:编译目标文件(即:编译为.obj.lst.crf文件)c:编译不通过,重新修改d:连接为可执行文件e:运行编译好的可执行文件f:用调试工具调试2.总体分析3.1程序功能分析本次设计的是打字游戏,因此,在屏幕落下字母,输入字母,并且判断输入字母和落下来的字母是否相同,如果相同,则字母消失,否则字母下落到屏幕底部消失。其具体功能如下:1.按回车键进入游戏,ESC键退出2.进入速度选择界面,h键高速,l键低速,s键重新设置速度,其他键默认为普通速度其他键(包括回车键)3.若进入速度设置界面,输入1-999的数,表示速度为普通速度的百分之几4.游戏中按esc退出,同时显示游戏总共出现字符数,所得分数,同时提示游戏是否重新开始,y返回主界面,n退出5.游戏过程中按space键暂停,再次按space键继续进行游戏3.2主程序流程图调用子程序init初始化主界面开始调用speedchoose子程序选择速度Ax=0?否43.详细设计4.1菜单模块5打开软件,进入的是菜单界面模块,如上图,有两种选择,按enter键进入游戏,按ESC键退出进入程序。4.2速度选择模块选择enter进入游戏,那么首先选择设置游戏的速度,有三种可供选择,还可以设置适合自己的速度。4.3游戏模块6进入游戏,可以开始游戏,一次落下一个字母,当键入一个字母正确时,字母消失,不然待字母落到底端,显示字母。字母的不同的位置有不同的显示颜色,在前1/3为绿色,在中间的1/3为红色,在最后1/3为红色。在游戏过程中,可以按esc键退出游戏,按space键暂停游戏,再次按space的时候继续游戏。4.4游戏结束模块要退出游戏时,会显示一共落下的字母数,和玩家击中的字母数,还提示信息,是否返回主界面,如果键入y,则返回,n则直接退出程序4.5设置游戏速度模块7在这里,你可以设置适合自己的速度,如图输入了789,则以普通速度的8倍进行游戏。4.代码实现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;输入数字大小movbl,10;乘10再加数L11:;判断输入是否合法movdl,[si]cmpdl,'0'jlLreCincmpdl,'9'jgLreCin;乘10再加数mul