打字游戏汇编语言课程设计.doc
《打字游戏汇编语言课程设计.doc》由会员分享,可在线阅读,更多相关《打字游戏汇编语言课程设计.doc(22页珍藏版)》请在三一办公上搜索。
1、 汇编语言课程实习报告实习题目 打字游戏学生姓名 班级 计科1093班 院系 信息学院 指导老师 提交时间 成绩目 录1 课程实习任务 12 基本知识.1 2.1 汇编语言程序结构2 2.2 关键指令分析2 2.3 汇编语言上机过程33 总体分析.3 3.1 程序功能分析3 3.2 主程序流程图44 详细设计.5 4.1 菜单模块5 4.2 输入模块5 4.3 游戏模块6 4.4 游戏结束模块6 4.5 速度设置模块.65 代码实现.75.1 主程序代码.75.25. 11部分子程序代码.85.12 延时子程序代码.145.13 字母下降子程序.155.14产生新字母子程序代码.165.17游
2、戏逻辑子程序代码.175.18其他各子程序模块.186 调试过程.197 使用说明.208 总结.209 参考文献 .201. 课程实习任务设计题目:打字游戏基本功能:1.在屏幕上显示菜单界面;2.按回车键出现由26个字母组成的乱序行;3.其中任一字母落下,在键盘上敲入该字母,如果输入正确,字母消失;4.按空格键停止,按ESC键返回主菜单,按q键退出程序。用汇编语言编写,完成设计报告。2. 基本知识本次设计用的汇编语言基本知识如下:2.1汇编语言程序结构主体程序结构框架data segment data endscode segment assume cs:code, ds:data, es:
3、extrastart: mov ax, data mov ds, ax call * mov ax, 4c00h int 21h code ends end start子程序结构框架Name proc farName endp宏定义结构框架Name macro Endm2.2. 关键指令的分析本次设计主要用到算术指令,逻辑指令,控制转移指令等如loop指令,用于循环执行某条或者某块指令集直到默认的参数(CX)为零,退出循环,执行loop循环下的下一条指令。Jmp无条件跳转指令,跳转到一个指定的标号位置。条件转移指令JZ / JNZ 、 JE / JNE等等,用于判断相应的标志位是否满足条件,若
4、满足则跳转,不满足就继续往下一条指令执行。 CMP比较指令,用于比较两个数的大小,设置标志位,通常和条件跳转指令关联用。 CALL 调用指令,用于调用子程序Int中断指令,用于中断操作此外,还有其他的一些指令,比如说加法add指令,减法指令等,本次设计用到了大量的指令。2.3汇编语言上机过程a:建立汇编源程序b:编译目标文件(即:编译为.obj .lst .crf文件)c:编译不通过,重新修改d:连接为可执行文件e:运行编译好的可执行文件f:用调试工具调试3. 总体分析3.1程序功能分析本次设计的是打字游戏,因此,在屏幕落下字母,输入字母,并且判断输入字母和落下来的字母是否相同,如果相同,则字
5、母消失,否则字母下落到屏幕底部消失。其具体功能如下:1.按回车键进入游戏,ESC键退出2.进入速度选择界面,h键高速,l键低速,s键重新设置速度,其他键默认为普通速度其他键(包括回车键)3.若进入速度设置界面,输入1-999的数,表示速度为普通速度的百分之几4.游戏中按esc退出,同时显示游戏总共出现字符数,所得分数,同时提示游戏是否重新开始,y返回主界面,n退出5.游戏过程中按space键暂停,再次按space键继续进行游戏3.2 主程序流程图调用子程序init初始化主界面开始调用playgame子程序进入游戏调用setiterface设置游戏界面调用speedchoose子程序选择速度调用
6、isrestart子程序是否回到主界面Ax=0?Al=0?退出是否否是4. 详细设计4.1菜单模块打开软件,进入的是菜单界面模块,如上图,有两种选择,按enter键进入游戏,按ESC键退出进入程序。 4.2 速度选择模块选择enter进入游戏,那么首先选择设置游戏的速度,有三种可供选择,还可以设置适合自己的速度。 4.3 游戏模块进入游戏,可以开始游戏,一次落下一个字母,当键入一个字母正确时,字母消失,不然待字母落到底端,显示字母。字母的不同的位置有不同的显示颜色,在前1/3为绿色,在中间的1/3为红色,在最后1/3为红色。在游戏过程中,可以按esc键退出游戏,按space键暂停游戏,再次按s
7、pace的时候继续游戏。4.4游戏结束模块要退出游戏时,会显示一共落下的字母数,和玩家击中的字母数,还提示信息,是否返回主界面,如果键入y,则返回,n则直接退出程序4.5设置游戏速度模块在这里,你可以设置适合自己的速度,如图输入了789,则以普通速度的8倍进行游戏。5. 代码实现5.1 主程序代码mov ax, data mov ds, ax mov es, axRESTART: call Init cmp ax,0 je Lexit ;如果退出 call SpeedChoose call SetInterface LgetTime: call PlayGames cmp al,0;是否有结束
8、标志 jne LgetTime LendGame: call GameOver CALL IsRestart cmp al,0 je Lexit ;如果退出 mov bx,RESTART jmp bx;重新开始开始Dxalx加上30h调用21h中断输出返回Lexit: mov ax, 4c00h int 21h 5.2输出单个数字子程序代码outnum proc near ;入口参数:ax,传递ax的值给dx的低八位dl以便输出 mov dx,ax or dl,30h mov ah,02h int 21h retoutnum endp5.3;计算数字位数子程序CountNum proc nea
9、r ;入口参数:ax,传递要输出的分数 mov cx,1;计算输出位数 cmp ax,10 jl LendCount inc cx cmp ax,100 jl LendCount inc cx cmp ax,1000 jl LendCount inc cx cmp ax,10000 jl LendCount inc cx ;保存在cxLendcount: ret CountNum endp ;出口参数:cx,保存数字位数5.4输出数字子程序CoutNum proc near ;入口参数:cx,call CountNum后传递数字位数 push ax call CountNum ;计算数字位数
10、pop ax cmp cx,5 ;5位数字 jl Lsmlth1 mov bx,10000 xor dx,dx div bx push dx call outnum;显示万位数字 pop ax Lsmlth1:;千位数字 cmp cx,4 ;4位数字 jl Lsmallhun1 xor dx,dx mov bx,1000 div bx push dx ;余数 call outnum ;显示千位数字 pop ax Lsmallhun1: ;显示百位数字 ; cmp ax,100 cmp cx,3 ;3位数字 jl Lsmallten1 mov bl,100 div bl push ax call
11、 outnum ;显示百位 pop ax mov al,ah xor ah,ah ;al和ax中放的数一样大小 Lsmallten1: ;显示十位数字 cmp cx,2 ;3位数字 jl Lsmallone1 mov bl,10 div bl push ax call outnum ;显示十位 pop ax mov al,ah xor ah,ah ;al和ax中放的数一样大小 Lsmallone1:;显示个位数字 call outnum retCoutNum endp 5.5游戏结束模块GameOver proc near ; ;游戏结束界面设置和分数显示 clear_screen 0,0,2
12、4,79,10011111b ;蓝色背景白色前景界面 ;-总共字符数,total menu 07,20,score_msg1 mov ax,total call CountNum ;计算数字位数,出口参数在cx中 mov bl,52 ; add bl,cl ;计算数字输出的列坐标后面紧跟chars输出 push bx clear_screen 07,52,07,bl,10011100b ;分数处颜色为红色 curse 07,52 mov ax,total call CoutNum ;输出数字 pop bx inc bl menu 07,bl,score_msg2 ;用到上面的bl ;-scor
13、e ;击中的字符数 menu 09,20,score_msg3 mov ax,score call CountNum ;计算数字位数,返回值在cx中 mov bl,33 add bl,cl ;列坐标后面紧跟分数score的输出 push bx clear_screen 09,33,09,bl,10011100b ;分数处颜色为红色 curse 09,33 mov ax,score call CoutNum ;输出数字 pop bx inc bl menu 09,bl,score_msg2 ;- call CountNum ;计算数字位数,返回值在cx中 mov bl,53 add bl,cl
14、;列坐标 push bx clear_screen 11,53,11,bl,10011100b ;分数处颜色为红色 pop bx inc bl menu 12,20,restart_msg ;显示是否重新开始 menu 14,20,restart_msg1 curse 14,48Legame: ret GameOver endp ;开始调用光标设置宏输入值清除Cx=输入个数输入并判断是否合法Al=al*10返回Cx=0 ?Ax= 0 ?否是是否否是Speednum=ax56返回主菜单模块IsRestart proc near;判断程序是否继续recin: ;重新输入curse 14,51 mo
15、v ah,02h mov dl, int 21h curse 14,47 lea dx,char_yn mov ah,0ah int 21h mov al,char_yn2 or al,20h cmp al,y jne isno mov al,1 jmp endre isno: cmp al,n jne recin xor al,alendre: ret isrestart endp ;出口参数:al,传递值在主程序是否退出,0为退出5.7输入速度模块CinNum proc near LreCin: curse 13,27 ;清除输入垃圾值 mov cx,3 mov ah,02h Lcout:
16、 mov dl, 输入速度设子程序- int 21h loop Lcout ;输入字符串 curse 13,27 lea dx,numchar mov ah,0ah int 21h xor cx,cx mov cl,numchar1 ;输入数字个数 lea si,numchar2 ;输入的最高位数字的偏移地址 xor ax,ax ;输入数字大小 mov bl,10 ;乘10再加数 L11: ;判断输入是否合法 mov dl,si cmp dl,0 jl LreCin cmp dl,9 jg LreCin ;乘10再加数 mul bl sub dl,0 xor dh,dh add ax,dx ;
17、加上新数 inc si loop L11 cmp ax,0 je LreCin mov speednum,ax;速度值 ret Cinnum endp 5.8设置速度与其界面模块SetSpeed proc near clear_screen 0,0,24,79,10011111B ;蓝色背景白色前景界面 menu 9,20,set_msg1 menu 11,20,set_msg2 menu 13,20,set_msg3 menu 13,30,set_msg4 call CinNum ;输入数字 ret SetSpeed endp 5.9设置游戏界面模块SetInterface proc nea
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 打字 游戏 汇编语言 课程设计
链接地址:https://www.31ppt.com/p-2882679.html