打字游戏-汇编语言课程设计.doc_第1页
打字游戏-汇编语言课程设计.doc_第2页
打字游戏-汇编语言课程设计.doc_第3页
打字游戏-汇编语言课程设计.doc_第4页
打字游戏-汇编语言课程设计.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汇编语言课程实习报告实习题目 打字游戏学生姓名 陈世虎班级 计科1093班 院系 信息学院 指导老师 提交时间 2011/6/22成绩目 录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游戏逻辑子程序代码.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: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等等,用于判断相应的标志位是否满足条件,若满足则跳转,不满足就继续往下一条指令执行。 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键继续进行游戏3.2 主程序流程图调用子程序init初始化主界面开始调用playgame子程序进入游戏调用setiterface设置游戏界面调用speedchoose子程序选择速度调用isrestart子程序是否回到主界面Ax=0?Al=0?退出是否否是4. 详细设计4.1菜单模块打开软件,进入的是菜单界面模块,如上图,有两种选择,按enter键进入游戏,按ESC键退出进入程序。 4.2 速度选择模块选择enter进入游戏,那么首先选择设置游戏的速度,有三种可供选择,还可以设置适合自己的速度。 4.3 游戏模块进入游戏,可以开始游戏,一次落下一个字母,当键入一个字母正确时,字母消失,不然待字母落到底端,显示字母。字母的不同的位置有不同的显示颜色,在前1/3为绿色,在中间的1/3为红色,在最后1/3为红色。在游戏过程中,可以按esc键退出游戏,按space键暂停游戏,再次按space的时候继续游戏。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;是否有结束标志 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 near ;入口参数: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 ;计算数字位数 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 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,24,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 ;-score ;击中的字符数 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 ;列坐标 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 mov 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: 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 ;加上新数 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 near 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_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 LendChoose 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;主菜单界面为蓝色背景,白色前景 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;不允许非法输入 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,6000 ;快速 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 ;第三层,不设置速度的情况下循环一万次, 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: cmp 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 LetterDown 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,xposbx ;新位置 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 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游戏模块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 jmp 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 ;将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 dh,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 cu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论