打字游戏汇编语言课程设计.doc

上传人:仙人指路1688 文档编号:2882679 上传时间:2023-03-01 格式:DOC 页数:22 大小:113KB
返回 下载 相关 举报
打字游戏汇编语言课程设计.doc_第1页
第1页 / 共22页
打字游戏汇编语言课程设计.doc_第2页
第2页 / 共22页
打字游戏汇编语言课程设计.doc_第3页
第3页 / 共22页
打字游戏汇编语言课程设计.doc_第4页
第4页 / 共22页
打字游戏汇编语言课程设计.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《打字游戏汇编语言课程设计.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

18、r clear_screen 0,0,0,79,11111101b;分数为暗红色 clear_screen 1,0,8,79,11111010b ;上1/3为绿色 clear_screen 9,0,16,79,11111001b ;上1/3为黄色 clear_screen 17,0,24,79,11111100b ;下1/3为红色 menu 0,65,goal_msg ;显示分数字符 retSetInterface endp 5.10选择速度界面SpeedChoose proc nearclear_screen 0d,00d,24d,79d,10011111b menu 07,18,speed

19、_msg1 menu 09,24,speed_msg2 menu 11,24,speed_msg3 menu 13,24,speed_msg4 menu 15,24,speed_msg5 curse 07,46 mov ispeed,1 ;默认普通速度 mov bset,0 ;默认没有设置速度 mov ah,01h int 21h or al,20h ;转为小写 cmp al,s jne Lnexts mov bset,1 call Setspeed ;设置速度 jmp LendChoose Lnexts: cmp al,h jne LisSlow mov ispeed,2 jmp LendC

20、hoose LisSlow:cmp al,l jne LendChoose mov ispeed,0 LendChoose: ret SpeedChoose endp5.11初始化界面模块Init proc near mov letter_y,1 ;初始化y坐标 mov letter_x,0 ;初始化x坐标 mov score,0 ;初始化分数,总字符数 mov total,0 ;,总字符数 mov bset,0 ;默认没有设置速度 mov blife,0 ;生命置空 mov ispeed,1 ;速度置为普通 clear_screen 0d,00d,24d,79d,10011111b;主菜单界

21、面为蓝色背景,白色前景 menu 05,18,menu0 ;菜单信息的宏调用 menu 08,25,menu1 menu 10,25,menu3 menu 13,18,menu40 menu 23,48,designers curse 12,42 choose: ;输入是否进入游戏 mov bx,0; mov ah,07h int 21h cmp al,0dh ;是否进入游戏 jne sec_judge inc bx cmp bx,1 ;如果进入游戏不用判断是否退出 jz lendi sec_judge: cmp al,27;不进入游戏,是否退出 je lendi jmp choose;不允许

22、非法输入 Lendi: push bx;将bx的值给ax,便于主程序判断是否进入游戏 pop ax retInit endp 5.12延时子程序模块Delay proc near ;延时子程序 pushReg ;速度比例越高,延时越小(延时=普通延时/比例) cmp bset,0 je Lnotset ;没有设置速度 xor dx,dx mov ax,16000 ; mov bx,speednum ;除以比例 div bx ;乘100系数放内层循环,防止ax越界 mov cx,ax ;-(16000/比例)*10*1000,16000为普通速度值 jmp L1Lnotset: mov cx,6

23、000 ;快速 cmp ispeed,2 ;选择快速 6000*10*1000 je L1 add cx,10000 ;普通 (10000+6000)*10)*1000 cmp ispeed,1 je L1 add cx,20000 ;慢速 (20000+6000)*10*1000L1: ;-第一层- mov ax,cx ;用ax先存放cx的值,第一层 ;= mov cx,10 ;第二层 cmp bset,0 je L12 ;没有设置速度的情况下 add cx,990 ;相当于从10 *100到了1000 L12: push cx ;先把第二层的cx压栈 ;* mov cx,1000 ;第三层

24、,不设置速度的情况下循环一万次, Ldelay: nop loop Ldelay ;第三层循环结束 ;* pop cx ;第二层循环继续loop L12 ;= mov cx,ax ;恢复第一层循环的cx loop L1 ;第一层循 ;- popReg ret Delay endp5.13字母下降模块LetterDown proc near mov ch,letter_y mov cl,letter_x mov dl, call LetterShow inc letter_y ;下降一格 mov al,0 cmp blife,0 ;生命值为0 jne Lnext1 inc alLnext1: c

25、mp letter_y,24 ;到达游戏界面底部 jl Lnext2 inc alLnext2: cmp al,0 ;是否该显示新字母 jne Lnewletter mov ch,letter_y ;字母下一行显示 mov cl,letter_x mov dl,char call LetterShow jmp Lendown Lnewletter: mov blife,1 inc total ;总字符数加1 call GenNewPos mov ch,letter_y mov cl,letter_x mov dl,char call LetterShow Lendown: ret Letter

26、Down endp5.14产生新字母模块GenNewPos proc near mov letter_y,1 inc ch_index ;新字母的偏移量 cmp ch_index,ch_count ;是否到了字母数组边界 jl Lx mov ch_index,0 Lx: inc x_index ;新x坐标 cmp x_index,x_count ;是否到了xpos数组边界 jl Lngreater mov x_index,0 Lngreater: mov bx,ch_index mov al,lettersbx ;新字母 mov char,al mov bx,x_index mov al,xp

27、osbx ;新位置 mov letter_x,al ret GenNewPos endp5.15字母显示模块LetterShow proc near pushReg mov dh,25 ;光标行 mov bh,0 ;光标页 curse ch,cl mov ah,02h ;显示字符 int 21h mov ah,02h mov dl,80 ;光标列 int 10h curse 25,80 ;显示完字母,马上重置光标位置 popReg retLetterShow endp5.16显示四位数字模块PrintScore proc near ;万位数字 mov ax,score cmp ax,10000

28、 jl Lsmlth mov bx,10000 xor dx,dx div bx mov ax,dx ;万位数字暂不显示 Lsmlth:;千位数字 cmp score,1000 jl Lsmallhun xor dx,dx mov bx,1000 div bx push dx ;余数 call outnum ;显示千位数字 pop ax Lsmallhun: ;显示百位数字 mov bl,100 div bl push ax ;余数 call outnum ;显示百位数字 pop ax mov al,ah ;显示个位和十位数字 call p ret PrintScore endp 5.17游戏

29、模块PlayGames Proc near menu 00,00,tips cmp score,1000 jl Lrightshow curse 0,76 ;显示分数 jmp Lendsetpos Lrightshow: curse 0,77 ;显示分数 Lendsetpos: call PrintScore ;输出分数 mov ah,0bh ;是否有字符输入 int 21h inc al jne Lnochar ;没有字符 mov ah,07h int 21h cmp al,char ;是否和当前字符相同 jne LnotHit mov blife,0 ;击中当前字符 inc score j

30、mp Lnochar LnotHit: cmp al, jnz next mov cx,2stop:inc cx curse 0,64 mov ah,07h int 21h cmp al, jz next cmp al,27 jz next loop stopnext: cmp al,27;esc 键退出 jne Lnochar xor ax,ax jmp Lendplay Lnochar: call LetterDown call Delay mov ax,1Lendplay: ret PlayGames endp5.18计算2位整数并输出模块p proc near mov ah,00h ;

31、将al补充为ax mov bl,10 div bl mov bh,ah ;余数存入ah mov dl,al ;商存入al or dl,30h mov ah,02h int 21h mov dl,bh or dl,30h int 21h retp endp5.19各宏定义模块pushReg macro;寄存器入栈push axpush bxpush cxpush dxendm popReg macro;寄存器出栈pop dx pop cx pop bx pop axendm curse macro cury,curx;设置光标宏pushReg mov ah,02h mov bh,00hmov d

32、h,curymov dl,curxint 10hpopRegendm clear_screen macro op1,op2,op3,op4,color ;清屏宏定义 pushReg mov ax,0600h mov bh,color mov ch,op1 mov cl,op2 mov dh,op3 mov dl,op4 int 10h curse 0,0popReg endm menu macro cury,curx,op3 ;菜单显示宏定义 mov ah,02h mov bh,00h mov dh,cury mov dl,curx int 10h ;mov ah,02h mov ah,09h

33、 lea dx,op3 int 21h endm6.调试过程调试时我是按一下步骤进行的: A调用DEBUG,装入程序B反汇编程序,记录代码段与数据段首地址C观察寄存器初始状态 D以单步工作方式T开始运行程序 E观察用户程序数据段初始内容F继续以单步工作方式运行程序,G连续工作方式运行程序G不能达到预想效果时,修改程序,再调试由于,一开始没下意识要记住整个调试过程,所以对于调试部分,没有记录下来。但是每次按照思路写下来的子程序都经过调试运行达到自己预想的效果。设计从一布置下来就开始做,所以,写的代码的时间比较长,程序基本可以达到预想的效果,没有遇到什么问题。7.使用说明1.本游戏在win32系统

34、运行2.按回车键进入游戏,ESC键退出3.进入速度选择界面,h键高速,l键低速,s键重新设置速度,其他键默认为普通速度其他键(包括回车键)4.若进入速度设置界面,输入1-999的数,表示速度为普通速度的百分之几5.游戏中按esc退出,同时显示游戏总共出现字符数,所得分数,同时提示游戏是否重新开始,y返回主界面,n退出6.游戏过程中按space键暂停,再次按space键继续进行游戏8.总结通过这次课程设计是我收获不少,设计刚开始我们的手头资料少得可怜,通过网络我知道了找到打字游戏的原理,形成了自己设计的方案,按照自己的思路一步步地做下去,不懂的时候,不断查阅资料。本来不懂在图书馆书架上找书的我,

35、这次学会了查找书本。由于老师有穿插了一些动态显示的内容,安排设计的时间比较长,本次的设计很顺利就完成了,基本上没遇到什么问题,只是觉得有点不耐烦,有时要设置光标的位置。同时,也认识到了自己的不足,很多指令都只能在用的时候翻书,而没有把常用的都记住。对于自己了解的算法思想还少之甚少,以后要更多地看程序,领悟别人的思想,自己多动手,增强自己编程的能力。9.参考文献1汇编语言李珍香 刘红梅 赵润林主编 中国水利水电出版社2汇编语言程序设计从DOS到Windows 张雪兰等主编 清华大学出版社3 IBM-PC汇编语言程序设计第二版 沈美明 温冬婵主编 清华大学出版社4IBM-PC汇编语言程序设计实验教程第二版 沈美明 温冬婵主编 清华

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号