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

下载本文档

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

文档简介

此文档收集于网络,如有侵权,请联系网站删除华 北 科 技 学 院课程设计说明书专 业: 网络工程 课程名称: 汇编课程设计 班级: 网络B091 姓 名: 张 学号: 200907024124 设计题目: 打字游戏 设计时间: 2011-12-05 至 2011-12-16 评 语: _评阅成绩: 评阅教师:朱冬梅 1、 问题陈述及其需求分析要求:利用汇编语言编写打字游戏的基本方法。内容:编写程序,显示一个英文菜单Game Menu。要求分别显示“Start”,“Setting”, “Quit”,并对每项菜单的操作有所响应。打字游戏其中包括以下几个模块:(1)Main(2)GamePlay子程序。(3)GameSetting游戏速度设置子程序。(4)GameExit退出游戏子程序。(5)Randchar产生随机字母函数的子程序。(6)RandNum产生随机字母出现的随机位置函数的子程序。(7)INT_1CH 子程序,新1CH中断处理。(8)showNum显示数字子程序。(9)showOne显示一个数字子程序。 打字游戏菜单包括:开始,游戏速度设置,退出。使之提供以下功能:1、显示菜单2、通过开始游戏,进行打字游戏3、游戏速度设置(分为快速,慢速,中速)4、游戏成绩统计(总共出现字母数,打错的字母数)5、退出二、总体设计功能结构图设计依据程序的功能需求,描述该系统功能的结构图如下:打字游戏开始Start QuitSetting开始游戏显示统计信息退出游戏ElseNormalHign SpeedSlow Speed 图1 系统功能结构图模块简介依据程序的功能模块的划分,各模块定义如下: (1)游戏模块名:GamePlay模块描述:调用Randchar和RandNum实现确定随机字母和随机字母出现位置的情况。然后取1CH中断号的入口地址,出口参数:ES:BX。再设置中断向量表,AH中断号为1CH。使出现的随机字母在某一随机位置延时一段时间,然后清除这个字符,然后在下一位置显示这个字符,再延时一段时间,最终出现字母在下落的视觉效果。(2)游戏设置模块名:GameSetting模块描述:此模块可以通过键盘输入,进行打字游戏的游戏速度的设置。(3)产生随机字母函数的子程序模块名:Randchar模块描述:通过读时钟计数器值 ,产生随机数,通过清除高六位,再除26得到的余数存放在BX中作为随机出现的字母。(4)子程序,产生字母出现的随机位置模块名:RandNum 模块描述:此模块可以通过读时钟计数器值 ,产生随机数,通过清除高六位,再除33得到的余数存放在BX中作为随机字母出现的随机位置。(5)子程序,新1CH中断处理模块名:INT_1CH 模块描述: (6)显示数字模块名:showNum模块描述:通过调用四次ShowOne显示四位十六进制数,显示出打字游戏的统计结果。(7)显示一个数字模块名:showOne模块描述:判断单个数字是否小于等于9,大于则变为十六进制,然后加30h,变为ASCII码,调用2号功能输出。(8)退出游戏模块名:GameExit模块描述:退出游戏。3、 详细设计算法说明1、主过程的算法设计: 清屏、显示菜单及运用选择操作,调用各个菜单功能,最后选择QUIT退出程序,也可按快捷键ESC退出程序。2、子过程的算法设计 (1)Gameplay (2)GameSetting该过程的程序流程图如图所示。 该过程的程序流程图如图所示。Gameplay子程序 GameSetting子程序开始开始键盘输入数据区清零N等于H ?CALL RANDCHARYY等于h ?CALL RANDNUMN速度设置为H取1CH中断号的入口地址Y等于S ?N设置中断向量表Y等于s?速度设置为S DELAYN速度设置为NRET返回RET返回(3) GameExit (4)Randchar 和RandNum该过程的程序流程图如图所示。 过程的程序流程图如图所示。开始开始 置开中断显示退出确定信息 =Y?N读取时钟寄存器,清高六位YY =y? 退出N 除33 BX余数 做随机位置 除26BX余数做随机字母Y =N?NY =n?RET返回NRET返回(5)INT_1CH 子程序,新1CH中断处理。 (6)ShowNum显示数字和ShowOne显示一个数字开始 置开中断 Count自减NCount等于0? 开始Y不相等 X与1比较相等设置光标为X大于 DL,9比较CLXCL自加 加7小于等于不相等X与23比较 加30H,变为ASCII码相等CALL RandChar 显示CALL RandNum RET是否为ESCYN WrongNumTotalnum RET四、编码和测试1、 程序运行结果主界面如图所示。 2、在主菜单下选项Setting项,则出现如图所示模块界面。测试实例如图。3、键盘输入H(h)将游戏速度设置为快速 4、键盘输入其他字符(除H,h,S,s),自动将游戏速度设置为NORMAL 5、游戏界面6、按Esc,统计游戏信息界面 7、选择Quit,如图所示。 5 总结与体会本次的课程设计在选题时,因为对打字游戏感兴趣,就毫不犹豫的选了打字游戏。刚拿到这个题目感觉很盲目,无从下手。汇编语言不同于高级语言,对于高级语言,我们心中可以有一个非常清晰的思路,在实现功能的时候非常得心应手。但汇编语言不同,它是面向机器的语言。用它编写程序时的思路应该按照机器执行程序的思路来编写,所以这个挑战对我来说非常大。在编写程序之前,首先要摒弃高级语言思路的干扰。在做准备工作的时候,我从网上找到了相关的代码,照着别人的步骤感受汇编语言编写程序的思路。很多地方都不是太明白,通过查询课本以及上网找相关资料,最终理解了。在编写打字游戏的时候,模仿着别人的程序,一步一步进行。很多地方乍眼一看很简单,但是等到自己亲自实践的时候就觉得很复杂,用到了很多书上没有讲过的指令。汇编语言的前后联系非常紧密,如果要改一点东西的话整个程序的很多地方都要重新做,可以说是牵一发而动全身。所以在编写的时候要很仔细,要记住前面已经实现了那些功能,还有那些功能要实现,这些必须记好,否则程序会出错。在具体实现的过程中遇到了很多困难。由于自己的电脑是64位的不兼容,所以平时对编好的程序在windows环境下用记事本打开程序对其进行说明注释,由于使用了中文,所以回到dos环境时出现了乱码。本次课程设计让我们充分了解了汇编在实际软件开发中的作用和地位。在这次课程设计过程中我们把课堂上的知识充分运用了还是不能完成实际软件开发。这说明程序开发是不能够停留在书本上的,想要把程序作好,必须要不断通过各种途径掌握更多更好的知识,并且最重要的是要将获得的知识运用到实际编程中,要学以致用。本次课程设计是自由分组、自由选题。我们可以根据我们的兴趣和优势来选择题目。通过这次编写打字游戏程序的课程设计,最基本的收获是我了解了汇编语言编写程序的步骤:先确定程序要实现的功能,接着定义需要的寄存器、存储器,画出流程图。然后逐个模块实现其功能。此次的课程设计,提高了我阅读和分析程序的能力,以及模仿能力。编程能力实事求是地说还有待提高,觉得自己逻辑性太差,但相对于原来学的高级语言,对汇编很感兴趣,最终虽然不会从事汇编的编程工作,但知识就是力量,学习汇编拓展了自己的知识面。附录:程序主要代码;程序中要用到的一些宏指令及其说明 getChar MACRO char ;调用1号功能,接收一个字符,将字符放在char里 PUSH AX MOV AH,1 INT 21H MOV char,AL POP AXENDMshowChar MACRO char ;调用2号功能显示字符 PUSH AX PUSH DX MOV AH,2 MOV DL,char INT 21H POP DX POP AXENDM showString MACRO string ;调用9号功能显示字符串 PUSH AX PUSH DX PUSH DS MOV AX,DATA_SEG MOV DS,AX MOV AH,9 LEA DX,string INT 21H POP DS POP DX POP AXENDM setCurPos MACRO M,N,P ;设置光标的位置在M行,N列,p页 PUSH AX PUSH BX PUSH DX MOV AH,2 MOV BH,P MOV DH,M MOV DL,N INT 10H POP DX POP BX POP AXENDMgetCurPos MACRO M,N ;获取光标的位置,将相应的行放在M中,列值放在N中 PUSH AX PUSH BX PUSH DX MOV AH,3 ;读光标位置 MOV BH,0 INT 10H MOV M,DH MOV N,DL POP DX POP BX POP AXENDM initShowModel MACRO A ;初始化显示模式 PUSH AX MOV AH,0 ;用来设定显示模式的服务程序 MOV AL,A ;AL 寄存器表示欲设定的模式: INT 10H POP AXENDM initWindow MACRO A,B,C1,C2,D1,D2 ;初始化窗口或窗口内容向上卷动,也可以用于清屏 PUSH AX PUSH BX PUSH CX PUSH DX MOV AH,6 MOV AL,A ;上卷行数 MOV BH,B ;卷入行属性(颜色) MOV CH,C1 ;左上角行号 MOV CL,C2 ;左上角列号 MOV DH,D1 ;右下角行号 MOV DL,D2 ;右下角列号 INT 10H POP DX POP CX POP BX POP AXENDM Pause MACRO PUSH AX MOV AH,01H INT 21H POP AXENDM DATA_SEG SEGMENT ;数据段定义 Flag DB 0 count DW 1 GameMenu DB Game Menu,0dh,0ah,$ ;主菜单 DB Start,0dh,0ah,$ DB Setting,0dh,0ah,$ DB Quit,0dh,0ah,$ Kick DB ? X DB ?Y DB ? ErrorMsg DB Error!,0dh,0ah,$ EXITMsg DB You really want to exit,enter Y to exit,and N to continue! (Y/N),0dh,0ah,$ Speed DB N SpeedNum DW 3 SpeedSetMsg DB Input the speed value:,0dh,0ah ;游戏速度设置菜单 DB H(h)-HIGH speed,0dh,0ah DB S(s)-slow speed,0dh,0ah DB ELSE-normal speed!,0dh,0ah,$SPeedValue DB Now the speed is ,$TotalKick DB ?RightKick DB ?WrongKick DB ?Char DB ? LineA DB -GamePlay-,0dh,0ah,$ LineB DB -,0dh,0ah,$Linec DB /*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/,0dh,0ah,$WrongNum DW 0TotalNum DW 0 ResultMsg DB The Char You Kick: ,0dh,0ah, TotalNum = ,$ ;游戏结果菜单显示 DB 0dh,0ah, WrongNum = ,$ DB 0dh,0ah,Press any kick to exit the game!,$ AFTER DB H,$ DATA_SEG ENDSSTACK_SEG SEGMENT STACK ;堆栈段定义 STACK_BUF DW 120 DUP(?)TOP EQU $-STACK_BUFSTACK_SEG ENDS CODE_SEG SEGMENT ;程序代码区 ASSUME CS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEG MAIN PROC FARSTART: MOV AX,STACK_SEG MOV SS,AX MOV SP,TOP MOV AX,DATA_SEG MOV DS,AXBEGIN: initShowModel 0 initWindow 0,3EH,0,0,24,4FH ;宏调用MENU: setCurPos 2,2,0 showString Linec setCurPos 4,10,0 ;设置主菜单光标位置 showString GameMenu setCurPos 8,10,0 showString GameMenu12 setCurPos 12,10,0 showString GameMenu20 setCurPos 16,10,0 showString GameMenu30 setCurPos 21,2,0 showString Linec setCurPos 8,8,0 showChar Keyboad: getChar Kick ;菜单选择部分 CMP Kick,9 ;按的是键TAB JE TAB JMP ENTERTAB: getCurPos X,Y NEXT_Tab_1: CMP X,8 ;选择标记在start处 JNZ NEXT_Tab_2 setCurPos 8,8,0 showChar setCurPos 8,10,0 showString GameMenu12 setCurPos 12,8,0 showChar JMP KeyboadNEXT_Tab_2: CMP X,12 ;选择标记在setting处 JNZ NEXT_Tab_3 setCurPos 12,8,0 showChar setCurPos 12,10,0 showString GameMenu20 setCurPos 16,8,0 showChar JMP KeyboadNEXT_Tab_3: CMP X,16 ;选择标记在exit处 JE NEXT_Tab_3_ELSE JMP ERRORNEXT_Tab_3_ELSE: setCurPos 16,8,0 showChar setCurPos 16,10,0 showString GameMenu30 setCurPos 8,8,0 showChar JMP KeyboadENTER: CMP Kick,13 ;按的是键ENTER JE ENTER_ENTER JMP ESC_KEYENTER_ENTER: getCurPos X,Y NEXT_ENTER_1: CMP X,8 ;选择标记在start处 JZ NEXT_ENTER_E JMP NEXT_ENTER_2NEXT_ENTER_E: CALL GamePlay ;GamePlay子程序调用 initShowModel 0 initWindow 0,3EH,0,0,24,4FH setCurPos 1,0,0 showString ResultMsg LEA SI,TotalNum CALL showNum ;showNum 子程序调用 showString ResultMsg34 LEA SI,WrongNum CALL showNum ;showNum 子程序调用 showString ResultMsg49 Pause JMP EXITNEXT_ENTER_2: CMP X,12 ;选择标记在setting处 JNZ NEXT_ENTER_3 CALL GameSetting JMP BEGINNEXT_ENTER_3: CMP X,16 ;选择标记在eXIT处 JNZ ERROR CALL GameExit JMP BEGINESC_KEY: CMP Kick,27 ;按的是键ESC JNE ELSE_KEY CALL GameExit JMP BEGINELSE_KEY: JMP BEGINERROR: initShowModel 0 initWindow 0,3EH,0,0,24,4FH setCurPos 12,6,0 showString ErrorMsg ;宏调用 getChar KickEXIT: MOV AX,4CH INT 21H MAIN ENDP ;子程序1 GamePlay GamePlay PROC MOV WrongNum,0 MOV Totalnum,0 CALL RANDCHAR ;调用RANDCHAR子程序 MOV Char,BL CALL RANDNUM ;调用RANDNUM子程序 MOV Y,BL MOV X,1 initShowModel 0 initWindow 0,3EH,0,0,24,4FH setCurPos 1,1,0 showString LineA setCurPos 23,1,0 showString LineB MOV AH,35H MOV AL,1CH ;取1CH中断号的入口地址 出口参数:ES:BX INT 21H PUSH ES PUSH BX PUSH DS MOV DX,OFFSET INT_1CH MOV AX,SEG INT_1CH MOV DS,AX MOV AH,25H ;设置中断向量,DS:DX MOV AL,1CH INT 21H POP DS IN AL,21H AND AL,11111110B OUT 21H,AL STIDELAY: CMP Flag,1 JE EXIT_ELSE JMP DELAY EXIT_ELSE: MOV Flag,0 MOV count,1 POP DX POP DS MOV AL,1CH MOV AH,25H INT 21H RET ;ret返回GamePlay ENDP ;子程序2游戏速度设置 GameSetting PROC PUSH AX initShowModel 0 initWindow 0,3EH,0,0,24,4FH setCurPos 5,4,0 showString SpeedSetMsg getChar Kick CMP Kick,H ;判断键盘输入的是否为H JNE H_INPUT MOV AL,H MOV Speed,AL MOV SpeedNum,1 ;速度参数设置为1 JMP SetFinishH_INPUT: CMP Kick,h ;判断键盘输入的是否为h JNE S_INPUT MOV AL,H MOV Speed,AL MOV SpeedNum,1 ;速度参数设置为1 JMP SetFinishS_INPUT: CMP Kick,S ;判断键盘输入的是否为S JNE S_INPUT_ELSE MOV AL,S MOV Speed,AL MOV SpeedNum,5 ;速度参数设置为5 JMP SetFinishS_INPUT_ELSE: CMP Kick,s ;判断键盘输入的是否为s JNE NORMAL MOV AL,S MOV Speed,AL MOV SpeedNum,5 ;速度参数设置为5 JMP SetFinishNORMAL: MOV AL,N ;判断键盘输入的是否为N MOV Speed,AL MOV SpeedNum,3 ;速度参数设置为3 SetFinish: initShowModel 0 initWindow 0,3EH,0,0,24,4FH setCurPos 5,4,0 showString SPeedValue showChar Speed getChar Kick POP AX RETGameSetting ENDP;子程序3退出程序GameExit PROCCHOOSE: initShowModel 0 initWindow 0,3EH,0,0,24,4FH setCurPos 5,4,0 showString ExitMsg getChar Kick CMP Kick,Y;键盘输入大写 JNE Y_INPUT JMP EXIT Y_INPUT: CMP

温馨提示

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

评论

0/150

提交评论