收藏 分享(赏)

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

上传人:ysd1539 文档编号:6538298 上传时间:2019-04-16 格式:DOC 页数:22 大小:275.66KB
下载 相关 举报
打字游戏-汇编语言课程设计.doc_第1页
第1页 / 共22页
打字游戏-汇编语言课程设计.doc_第2页
第2页 / 共22页
打字游戏-汇编语言课程设计.doc_第3页
第3页 / 共22页
打字游戏-汇编语言课程设计.doc_第4页
第4页 / 共22页
打字游戏-汇编语言课程设计.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

1、 汇编语言课程实习报告实习题目 打字游戏学生姓名 陈世虎班级 计科 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.25. 11 部分子程序代码85.12 延时子程序代码145.13 字母下降子程序155.14 产生新字母子程序代码.165.17

2、 游戏逻辑子程序代码.175.18 其他各子程序模块.186 调试过程.197 使用说明.208 总结.209 参考文献 2021. 课程实习任务设计题目:打字游戏基本功能:1.在屏幕上显示菜单界面;2.按回车键出现由 26 个字母组成的乱序行;3.其中任一字母落下,在键盘上敲入该字母,如果输入正确,字母消失;4.按空格键停止,按 ESC 键返回主菜单,按 q 键退出程序。用汇编语言编写,完成设计报告。2. 基本知识本次设计用的汇编语言基本知识如下:2.1 汇编语言程序结构主体程序结构框架data segment data endscode segment assume cs:code, ds

3、:data, es:extrastart: mov ax, datamov ds, ax call *mov ax, 4c00hint 21h code endsend start子程序结构框架Name proc farName endp宏定义结构框架Name macro Endm2.2.关键指令的分析本次设计主要用到算术指令,逻辑指令,控制转移指令等3如 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 键继续进行游戏43.2 主程序流程图调用子程序 init 初始化主界面开始调用 playgame 子程序进入游戏调用

6、 setiterface 设置游戏界面调用 speedchoose 子程序选择速度调用 isrestart 子程序是否回到主界面Ax=0?Al=0?退出是否否是54. 详细设计4.1 菜单模块打开软件,进入的是菜单界面模块,如上图,有两种选择,按 enter 键进入游戏,按 ESC 键退出进入程序。4.2 速度选择模块选择 enter 进入游戏,那么首先选择设置游戏的速度,有三种可供选择,还可以设置适合自己的速度。64.3 游戏模块进入游戏,可以开始游戏,一次落下一个字母,当键入一个字母正确时,字母消失,不然待字母落到底端,显示字母。字母的不同的位置有不同的显示颜色,在前 1/3 为绿色,在中

7、间的 1/3 为红色,在最后 1/3 为红色。在游戏过程中,可以按 esc 键退出游戏,按 space 键暂停游戏,再次按 space 的时候继续游戏。4.4 游戏结束模块要退出游戏时,会显示一共落下的字母数,和玩家击中的字母数,还提示信息,是否返回主界面,如果键入 y,则返回,n 则直接退出程序4.5 设置游戏速度模块7在这里,你可以设置适合自己的速度,如图输入了 789,则以普通速度的 8 倍进行游戏。5. 代码实现5.1 主程序代码mov ax, datamov ds, axmov es, axRESTART: call Init cmp ax,0 je Lexit ;如果退出call

8、SpeedChoose call SetInterface LgetTime:call PlayGamescmp al,0;是否有结束标志jne LgetTime LendGame: call GameOver CALL IsRestart8cmp al,0 je Lexit ;如果退出mov bx,RESTARTjmp bx;重新开始Lexit: mov ax, 4c00h int 21h 5.2 输出单个数字子程序代码outnum proc near ;入口参数:ax,传递ax的值给dx的低八位dl以便输出mov dx,axor dl,30hmov ah,02hint 21hretoutn

9、um endp5.3;计算数字位数子程序CountNum proc near ;入口参数:ax,传递要输出的分数mov cx,1;计算输出位数cmp ax,10jl LendCountinc cxcmp ax,100jl LendCountinc cxcmp ax,1000jl LendCountinc cx cmp ax,10000jl LendCountinc cx ;保存在cxLendcount:ret CountNum endp ;出口参数:cx,保存数字位数5.4 输出数字子程序CoutNum proc near ;入口参数:cx,call CountNum后传递数字位数push a

10、xcall CountNum ;计算数字位数pop ax cmp cx,5 ;5位数字开始Dxalx加上30h调用21h 中断输出返回9jl Lsmlth1 mov bx,10000xor dx,dxdiv bxpush dxcall outnum;显示万位数字pop axLsmlth1:;千位数字cmp cx,4 ;4位数字jl Lsmallhun1xor dx,dxmov bx,1000div bxpush dx ;余数call outnum ;显示千位数字pop axLsmallhun1: ;显示百位数字; cmp ax,100 cmp cx,3 ;3位数字jl Lsmallten1mo

11、v bl,100div blpush axcall outnum ;显示百位pop axmov al,ahxor ah,ah ;al和ax中放的数一样大小Lsmallten1: ;显示十位数字cmp cx,2 ;3位数字jl Lsmallone1mov bl,10div blpush axcall outnum ;显示十位pop axmov al,ahxor ah,ah ;al和ax中放的数一样大小 Lsmallone1:;显示个位数字call outnum retCoutNum endp 5.5 游戏结束模块GameOver proc near ; ;游戏结束界面设置和分数显示10clear

12、_screen 0,0,24,79,10011111b ;蓝色背景白色前景界面 ;-总共字符数,totalmenu 07,20,score_msg1 mov ax,totalcall CountNum ;计算数字位数,出口参数在cx中mov bl,52 ;add bl,cl ;计算数字输出的列坐标后面紧跟chars输出push bxclear_screen 07,52,07,bl,10011100b ;分数处颜色为红色curse 07,52mov ax,total call CoutNum ;输出数字pop bxinc bl menu 07,bl,score_msg2 ;用到上面的bl ;-s

13、core ;击中的字符数menu 09,20,score_msg3 mov ax,scorecall CountNum ;计算数字位数,返回值在cx中 mov bl,33add bl,cl ;列坐标后面紧跟分数score的输出push bxclear_screen 09,33,09,bl,10011100b ;分数处颜色为红色curse 09,33mov ax,scorecall CoutNum ;输出数字pop bx inc bl menu 09,bl,score_msg2 ;-call CountNum ;计算数字位数,返回值在cx中 mov bl,53add bl,cl ;列坐标push

14、 bxclear_screen 11,53,11,bl,10011100b ;分数处颜色为红色pop bx inc bl menu 12,20,restart_msg ;显示是否重新开始menu 14,20,restart_msg1curse 14,48Legame: ret GameOver endp ;1156 返回主菜单模块IsRestart proc near;判断程序是否继续recin: ;重新输入curse 14,51 mov ah,02hmov dl, int 21h curse 14,47lea dx,char_ynmov ah,0ahint 21h mov al,char_y

15、n2or al,20hcmp al,yjne isnomov al,1jmp endre isno: cmp al,n jne recinxor al,alendre:ret isrestart endp ;出口参数:al,传递值在主程序是否退出,0为退出5.7 输入速度模块CinNum proc near LreCin:curse 13,27 ;清除输入垃圾值mov cx,3mov ah,02hLcout: mov dl, 输入速度设子程序-int 21hloop Lcout ;输入字符串curse 13,27 lea dx,numcharmov ah,0ahint 21h xor cx,c

16、x mov cl,numchar1 ;输入数字个数lea si,numchar2 ;输入的最高位数字的偏移地址开始调用光标设置宏输入值清除Cx=输入个数输入并判断是否合法Al=al*10返回Cx=0 ?Ax= 0 ?否是是否否是Speednum=ax12xor ax,ax ;输入数字大小mov bl,10 ;乘10再加数L11: ;判断输入是否合法mov dl,si cmp dl,0jl LreCincmp dl,9jg LreCin ;乘10再加数mul bl sub dl,0xor dh,dh add ax,dx ;加上新数inc siloop L11cmp ax,0je LreCinmo

17、v speednum,ax;速度值 ret Cinnum endp 5.8 设置速度与其界面模块SetSpeed proc nearclear_screen 0,0,24,79,10011111B ;蓝色背景白色前景界面menu 9,20,set_msg1menu 11,20,set_msg2menu 13,20,set_msg3menu 13,30,set_msg4call CinNum ;输入数字ret SetSpeed endp 5.9 设置游戏界面模块SetInterface proc near clear_screen 0,0,0,79,11111101b;分数为暗红色clear_s

18、creen 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 选择速度界面13SpeedChoose proc nearclear_screen 0d,00d,24d,79d,10011111b menu 07,18,speed_msg1menu 09,24,speed_msg2menu 11,24,speed_msg3m

19、enu 13,24,speed_msg4menu 15,24,speed_msg5curse 07,46 mov ispeed,1 ;默认普通速度 mov bset,0 ;默认没有设置速度mov ah,01hint 21h or al,20h ;转为小写 cmp al,sjne Lnextsmov bset,1call Setspeed ;设置速度jmp LendChooseLnexts: cmp al,hjne LisSlowmov ispeed,2jmp LendChoose LisSlow:cmp al,l jne LendChoose mov ispeed,0 LendChoose:

20、ret SpeedChoose endp5.11 初始化界面模块Init proc nearmov 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;主菜单界面为蓝色背景,白色前景 menu 05,18,menu0 ;菜单信息的宏调用 menu 08,25,menu1 menu 10,25,

21、menu3 menu 13,18,menu40menu 23,48,designerscurse 12,42 choose: ;输入是否进入游戏mov bx,0; mov ah,07h14int 21hcmp al,0dh ;是否进入游戏 jne sec_judgeinc bxcmp bx,1 ;如果进入游戏不用判断是否退出jz lendisec_judge: cmp al,27;不进入游戏,是否退出je lendijmp choose;不允许非法输入Lendi:push bx;将bx的值给ax,便于主程序判断是否进入游戏 pop ax retInit endp 5.12 延时子程序模块Del

22、ay proc near ;延时子程序 pushReg ;速度比例越高,延时越小(延时=普通延时/比例)cmp bset,0 je Lnotset ;没有设置速度xor dx,dxmov ax,16000 ;mov bx,speednum ;除以比例div bx ;乘100系数放内层循环,防止ax越界mov cx,ax ;-(16000/比例)*10*1000,16000为普通速度值jmp L1Lnotset: mov cx,6000 ;快速 cmp ispeed,2 ;选择快速 6000*10*1000 je L1 add cx,10000 ;普通 (10000+6000)*10)*1000

23、cmp ispeed,1je L1 add cx,20000 ;慢速 (20000+6000)*10*1000L1: ;-第一层- mov ax,cx ;用ax先存放cx的值,第一层15;=mov cx,10 ;第二层cmp bset,0je L12 ;没有设置速度的情况下add cx,990 ;相当于从10 *100到了1000L12: push cx ;先把第二层的cx压栈 ;*mov cx,1000 ;第三层,不设置速度的情况下循环一万次,Ldelay: nop loop Ldelay ;第三层循环结束;*pop cx ;第二层循环继续loop L12 ;= mov cx,ax ;恢复第

24、一层循环的cx loop L1 ;第一层循;- popRegret Delay endp5.13 字母下降模块LetterDown proc near mov ch,letter_ymov cl,letter_xmov dl, call LetterShowinc letter_y ;下降一格mov al,0cmp blife,0 ;生命值为0jne Lnext1inc alLnext1: cmp letter_y,24 ;到达游戏界面底部jl Lnext2inc alLnext2: cmp al,0 ;是否该显示新字母jne Lnewlettermov ch,letter_y ;字母下一行显

25、示mov cl,letter_xmov dl,charcall LetterShow16jmp Lendown Lnewletter: mov blife,1inc total ;总字符数加1call GenNewPosmov ch,letter_ymov cl,letter_xmov dl,charcall LetterShow Lendown: ret LetterDown endp5.14 产生新字母模块GenNewPos proc near mov letter_y,1 inc ch_index ;新字母的偏移量 cmp ch_index,ch_count ;是否到了字母数组边界jl

26、Lx mov ch_index,0 Lx: inc x_index ;新x坐标 cmp x_index,x_count ;是否到了xpos数组边界jl Lngreater mov x_index,0Lngreater: mov bx,ch_index mov al,lettersbx ;新字母mov char,al mov bx,x_indexmov al,xposbx ;新位置mov letter_x,alret GenNewPos endp5.15 字母显示模块LetterShow proc nearpushReg mov dh,25 ;光标行mov bh,0 ;光标页 curse ch,

27、cl mov ah,02h ;显示字符int 21h mov ah,02h17mov dl,80 ;光标列int 10hcurse 25,80 ;显示完字母,马上重置光标位置popRegretLetterShow endp5.16 显示四位数字模块PrintScore proc near ;万位数字 mov ax,scorecmp ax,10000jl Lsmlth mov bx,10000xor dx,dxdiv bxmov ax,dx ;万位数字暂不显示Lsmlth:;千位数字 cmp score,1000jl Lsmallhunxor dx,dxmov bx,1000div bxpush

28、 dx ;余数call outnum ;显示千位数字pop ax Lsmallhun: ;显示百位数字mov bl,100div blpush ax ;余数call outnum ;显示百位数字pop axmov al,ah;显示个位和十位数字call p ret PrintScore endp 5.17 游戏模块PlayGames Proc nearmenu 00,00,tipscmp score,1000jl Lrightshow curse 0,76 ;显示分数 jmp LendsetposLrightshow:18curse 0,77 ;显示分数Lendsetpos: call Pri

29、ntScore ;输出分数 mov ah,0bh ;是否有字符输入int 21hinc al jne Lnochar ;没有字符mov ah,07hint 21h cmp al,char ;是否和当前字符相同jne LnotHitmov blife,0 ;击中当前字符 inc scorejmp LnocharLnotHit:cmp al, jnz nextmov cx,2stop:inc cxcurse 0,64mov ah,07hint 21hcmp al, jz nextcmp al,27jz nextloop stopnext: cmp al,27;esc 键退出jne Lnocharx

30、or ax,axjmp Lendplay Lnochar:call LetterDown call Delaymov ax,1Lendplay:ret PlayGames endp5.18计算2位整数并输出模块p proc near mov ah,00h ;将al补充为axmov bl,10div blmov bh,ah ;余数存入ah19mov dl,al ;商存入alor dl,30hmov ah,02hint 21hmov dl,bh or dl,30hint 21hretp endp5.19各宏定义模块pushReg macro;寄存器入栈push axpush bxpush cxpu

31、sh dxendm popReg macro;寄存器出栈pop dx pop cx pop bx pop axendm curse macro cury,curx;设置光标宏pushReg mov ah,02h mov bh,00hmov dh,curymov dl,curxint 10hpopRegendm clear_screen macro op1,op2,op3,op4,color ;清屏宏定义 pushRegmov ax,0600h mov bh,color mov ch,op1 mov cl,op2 mov dh,op3 mov dl,op4 int 10h curse 0,0po

32、pReg endm menu macro cury,curx,op3 ;菜单显示宏定义 mov ah,02h mov bh,00hmov dh,cury20mov dl,curx int 10h ;mov ah,02hmov ah,09h lea dx,op3 int 21h endm6.调试过程调试时我是按一下步骤进行的: A 调用 DEBUG,装入程序B 反汇编程序,记录代码段与数据段首地址C 观察寄存器初始状态 D 以单步工作方式 T 开始运行程序 E 观察用户程序数据段初始内容F 继续以单步工作方式运行程序,G 连续工作方式运行程序G 不能达到预想效果时,修改程序,再调试由于,一开始没

33、下意识要记住整个调试过程,所以对于调试部分,没有记录下来。但是每次按照思路写下来的子程序都经过调试运行达到自己预想的效果。设计从一布置下来就开始做,所以,写的代码的时间比较长,程序基本可以达到预想的效果,没有遇到什么问题。7.使用说明1.本游戏在 win32 系统运行2.按回车键进入游戏,ESC 键退出3.进入速度选择界面,h 键高速,l 键低速,s 键重新设置速度,其他键默认为普通速度其他键(包括回车键)4.若进入速度设置界面,输入 1-999 的数,表示速度为普通速度的百分之几5.游戏中按 esc 退出,同时显示游戏总共出现字符数,所得分数,同时提示游戏是否重新开始,y 返回主界面,n 退

34、出6.游戏过程中按 space 键暂停,再次按 space 键继续进行游戏8.总结通过这次课程设计是我收获不少,设计刚开始我们的手头资料少得可怜,通过网络我知道了找到打字游戏的原理,形成了自己设计的方案,按照自己的思路一步步地做下去,不懂的时候,不断查阅资料。本来不懂在图书馆书架上找书的我,这次学会了查找书本。由于老师有穿插了一些动态显示的内容,安排设计的时间比较长,本次的设计很顺利就完成了,基本上没遇到什么问题,只是觉得有点不耐烦,有时要设置光标的位置。同时,也认识到了自己的不足,很多指令都只能在用的时候翻书,而没有把常用的都记住。对于自己了解的算法思想还少之甚少,以后要更多地21看程序,领悟别人的思想,自己多动手,增强自己编程的能力。9.参考文献1汇编语言李珍香 刘红梅 赵润林主编 中国水利水电出版社2汇编语言程序设计从 DOS 到 Windows 张雪兰等主编 清华大学出版社3 IBM-PC 汇编语言程序设计第二版 沈美明 温冬婵主编 清华大学出版社4IBM-PC 汇编语言程序设计实验教程第二版 沈美明 温冬婵主编 清华大学出版社

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

当前位置:首页 > 实用文档 > 课程设计

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报