1、课程设计 第二学期设计题目 打字练习程序 院(系) 计算机科学与信息工程 专 业 计算机科学与技术 班 级 091041b1 学号 学生姓名 王涛 设计时间 6 月 20 日 年 6 月 24日 指引教师 蒯锐 提交日期 6月24日 上海应用技术学院课程设计任务书课程名称汇编语言课程设计课程代码B704207设计题目打字练习程序题目序号设计时间 6月 20日 6月 24日系(院)计算机科学与信息工程专业计算机科学与技术班级091041b1一、课程设计任务(条件)、详细技术参数(指标)本课程设计是80X86汇编语言程序设计课程后继教学环节,通过对一种较大型、综合性应用程序进行阅读、修改、添加功能
2、等工作,使学生对汇编语言程序设计有更进一步结识,提高阅读理解复杂程序能力和程序设计能力。依照所给“typetest.asm”应用程序框架,在此基本上修改和添加功能。基本任务:1认真阅读“typetest.asm”源程序,理解程序每一条指令在程序中作用。绘制程序流程图(简略总图,各模块详细流程图),给程序中核心语句(后跟分号)作注释。设立输入界面,顾客输入密码后才干进入主菜单 ;2. 修改主菜单,在主菜单上显示当天日期 ;3. 修改主菜单,增长可供顾客选取难度级别选项。4. 为顾客打分,对的输入字母使用时间越少,得分越高。5. 修改程序,在屏幕右上角显示顾客得分、已输入字母数、对的数。6. 将程
3、序中“置光标位置”程序段落用宏调用完毕,添加“置光标位置”宏定义。扩展任务:7. 设立限定期间,到达该时间,顾客尚未得到规定分数时,游戏停止。8. 到达限定期间,顾客得分达到预设值时,自动提高难度级别,屏幕变色。9. 修改程序,底行笑脸字母消失后,不再在该列下落字母(提示:设立数组记录笑脸字母存在与否)。笑脸字母所有消失后,游戏停止,显示告别画面,显示顾客成绩。其她任务:自行设计新功能。二、对课程设计成果规定(涉及课程设计阐明书、图纸、图表、实物等软硬件规定)(1) 分析原“typetest.asm”程序构造:画出主程序粗略流程图和各个模块详细流程图,每个功能模块用文字阐明她们功能(与相应流程
4、图放在一起);(2) 对你已经实现功能(修改、新编写)做详细阐明,并附上流程图及程序清单(修改/增长指令请使用大写字母,以示区别);(3) 自己对该“打字练习程序”进一步设想;(4) 对于有设想但最后未实现功能大体编程思路阐述;(5) 阐述在设计过程中遇到并且对你具备启发性问题。(6) 禁止抄袭,发现雷同,双方扣分。三、课程设计工作进度筹划:周一:教师布置任务,解说本课设模块。学生细读原始源程序,在重要行添加注解。周二:画出主程序粗略流程图和各个模块详细流程图,开始基本任务。周三周四:设计程序及调试程序。同步着手写报告。周五:完毕设计,提交报告,接受教师考核。四、重要参照资料1 杨文显,宓双,
5、胡建人.新编汇编语言程序设计,清华大学出版社,2 朱玉龙,任文览等.汇编语言程序设计,清华大学出版社,3 美Kip R.Irvine. 电子工业出版社,指引教师(签名):蒯锐 教研室主任(签名):杨晶鑫 6 月 20 日 6 月 20 日目录 第二学期11.概述51.1基本功能51.2扩展功能62.详细设计阐明72.1分析原“typetest.asm”程序构造82.1已经实现功能(修改、新编写)阐明93. 对该“打字练习程序”进一步设想103.1 113.2123.3124. 课程设计总结135. 软件使用阐明136附录(参照文献,原代码)146.1参照文献146.2 源代码151 概述本课程
6、设计是80X86汇编语言程序设计课程后继教学环节,通过对一种较大型、综合性应用程序进行阅读、修改、添加功能等工作,使学生对汇编语言程序设计有更进一步结识,提高阅读理解复杂程序能力和程序设计能力基本功能1.1基本功能(1) 设立输入界面,顾客输入密码后才干进入主菜单(2) 修改主菜单,在主菜单上显示当天日期。(3) 修改主菜单,增长可供顾客选取难度级别选项。(4) 为顾客打分,对的输入字母使用时间越少,得分越高。(5) 修改程序,在屏幕右上角显示顾客得分、已输入字母数、对的数。(6) 将程序中“置光标位置”程序段落用宏调用完毕,添加“置光标位置”宏定义。1.2拓展功能1. 设立限定期间,到达该时
7、间,顾客尚未得到规定分数时,游戏停止。2. 到达限定期间,顾客得分达到预设值时,自动提高难度级别,屏幕变色。3. 修改程序,底行笑脸字母消失后,不再在该列下落字母(提示:设立数组记录笑脸字母存在与否)。笑脸字母所有消失后,游戏停止,显示告别画面,显示顾客成绩。其她任务:2 详细设计阐明2.1 分析原“typetest.asm”程序构造2.1.1.一方面在typetest.asm中定义了四个宏调用程序(1)方框宏定义(2)清屏宏定义(3)菜单显示宏定义(4)设立光标位置宏定义2.1.2 data数据段定义:涉及所有显示字幕定义。2.1.3 各宏定义函数调用以及对各个子函数调用。2.1.4 程序重
8、要流程图方框宏定义清屏宏定义菜单显示宏定义设立光标位置宏定义Data数据段定义:date db 0ah,0dh,Date:$mes0 db 0ah,0dh,(1)Press Enter key to continue.$mes1 db 0ah,0dh,(2)When a letter is dropping,please hit it!$mes2 db 0ah,0dh,(3)Press space key to pause!$mes3 db 0ah,0dh,(4)Press ESC key to return main interface!$mes4 db 0ah,0dh,(5)Press l
9、etter E to exit!$mes5 DB please enter your password :$mes6 db 0ah,0dh,1: $开始顾客输入密码判断密码进入主菜单返回不对的密码对的拟定后进入选取需要练习速度选项1.fast2veryfast3.slow4.veryslow选取需要速度选项开始练习打字游戏计算打字对的数依照对的数计算出应得分数显示顾客所得分数,然后退出练习界面2.2 已经实现功能(修改、新编写)阐明2.2.1本程序已实现了基本功能:(7) 设立输入界面,顾客输入密码后才干进入主菜单;(8) 修改主菜单,在主菜单上显示当天日期;(9) 修改主菜单,增长可供顾客选
10、取难度级别选项;(10) 为顾客打分,对的输入字母使用时间越少,得分越高;(11) 修改程序,在屏幕右上角显示顾客得分、已输入字母数、对的数;(12) 将程序中“置光标位置”程序段落用宏调用完毕,添加“置光标位置”宏定义;2.2.2本程序扩展功能:(1) 修改了主界面背景颜色以及字体颜色,对某些重要提示信息进行了某些优化。(2) 增长了一键显示顾客得分记录功能,只要顾客在主界面上输入“C”,就可以显示出来顾客得分记录3 对“打字练习程序”进一步设想3.1 可以让每次浮现字母都变得有逻辑性,就像打中文时候那种逻辑性,还可以增长英语之类打字练习。3.2 可以变化每一种字母在掉落时候颜色。让每一种字
11、母不同步刻颜色都由电脑随机产生。3.3 在打字练习过程中还可以有某些恰当声音来配合着练习进行,这样话效果和顾客体验都会有更进一步提高。4 课程设计总结4.1 通过这次课程设计让我跟详细理解了汇编语言用途以及她特点,这样有助于在此后实践中更好去应用汇编语言解决问题,同步通过这次课程设计也体现出了我在汇编方面某些基本知识局限性。由于对汇编语言某些基本知识掌握局限性,程序中还存在或多或少缺陷和局限性,有某些基本功能在逻辑上还存在某些小问题,但是不会影响基本使用。5 软件使用阐明由于系统版本不同缘故,在程序汇编链接时候会停滞一部,但只要在敲一下回车在进入一次就好了。诸多时候在进入时输入密码后需要按回车
12、才干跳转到主界面。6 附录(参照文献,原代码)参照文献1 杨文显,宓双,胡建人.新编汇编语言程序设计,清华大学出版社,2 朱玉龙,任文览等.汇编语言程序设计,清华大学出版社,3 美Kip R.Irvine. 电子工业出版社,原代码; Assembly program for test your type skills ; Writed by in 06/24/; Modified by Mi shuang in 06/06/;-include ylib.hInit_boarder macro row,col,char,dhdl,count;Localllmov cx,count mov dh,
13、rowmov dl,colll:movah,02hmov bh,00hint 10hpush cxmov ah,0ahmov al,char mov bh,00hmov cx,01hint 10hpop cxinc dhdlloop ll endm;-clear_screen macro top,left,bottom,right,col;清屏宏定义mov ah,06h mov al,00hmov bh,colmov ch,topmov cl,leftmov dh,bottommov dl,rightint 10hmov ah,02hmov bh,00hmov dh,00hmov dl,00h
14、int 10hendm;-SETCUSOR MACRO PAGE,ROW,COLUMN ;设立光标位置MOV AH,02HMOV BH,PAGEMOV DL,COLUMNMOV DH,ROWINT 10HENDM;-menumacrorow,col,text;菜单显示宏定义 mov ah,02hmov bh,024hmov dh,rowmov dl,colint 10hmov ah,09hlea dx,textint 21hendm;=Data segmentkaishi db 0ah,0dh, welcome to play the game !$ year dw ?month db ?da
15、y db ?date db 0ah,0dh,Date:$mes0 db 0ah,0dh,(1)Press Enter key to continue.$mes1 db 0ah,0dh,(2)When a letter is dropping,please hit it!$mes2 db 0ah,0dh,(3)Press space key to pause!$mes3 db 0ah,0dh,(4)Press ESC key to return main interface!$mes4 db 0ah,0dh,(5)Press letter E to exit!$mes5 DB please en
16、ter your password :$mes6 db 0ah,0dh,1: $mes7 db 0ah,0dh,2: $mes8 db 0ah,0dh,3: $mess8db 0ah,0dh,4: $mes9 db please choose the speed you want:$mes10 db The game is over!$mes15 db Do you want to continue ? Yes(1)/No(0):$mes11 db your time:$mes12 db right keys:$mes13 db Your score:$mes14 db you have in
17、put:$mes20 db hi guy good job!$mes21 db 0ah,0dh,(6)press cto check your records!$mes22 db these records:$col db 00h,24h,0fdh,0dh ;颜色numb1 dw ? ;已输入字母个数numb dw ? ;输入对的字母个数score dw ? ;每轮游戏分数TIME DW ?sum dw ? ;所有字母下落行数和sum1 dw ?game_time dw ?;记录游戏次数scores dw 4 dup(?) ;记录游戏分数password db 111111password1
18、db 6 dup(?)GRADE DW ?Speed dw1000H,300h,5000h,8000hyanchi dw 0f00h,3fffh,1fffhLetters db jwmilzoeucgpravskntxhdyqfb db iytpkwnxlsvxrmofzhgaebudjq db nwimzoexrphysfqtvdcgljukdaPresent_position db 1 db 0Data ends;=codesegmentassumecs:code,ds:datastart:mov ax,datamov ds,axmov es,axnew:clear_screen 0,0,
19、24,79,0f4hSETcusor 0,10,30LEA DX,MES5MOV AH,09HINT 21H;-SETCUSOR 0,11,61lea bx,password1mov cx,6input:mov ah,07hint 21hmov bx,alinc bxmov ah,02hmov dl,*int 21h;-loop inputcontiun:mov ah,07hint 21hcmp al,0dhjne contiunmov cx,6lea si,passwordlea di,password1check:mov al,sicmp al,dijne newinc siinc dil
20、oop check ;密码输入及判断与否对的;-start1:clear_screen 0d,0d,24d,79d,07hmov grade,0mov numb,0mov numb1,0mov sum,0mov score,0mov cx,1000h ;隐藏光标mov ah,01hint 10hclear_screen 0d,0d,24d,79d,1eh ;清屏Init_boarder 0d,0d,*,dl,80dInit_boarder 24d,0d,*,dl,80dInit_boarder 0d,0d,*,dh,25dInit_boarder 0d,79d,*,dh,25d ;初始化边框m
21、enu 3d,20d,kaishi;显示菜单menu 7d,15d,datepush dx ;显示当天时间mov ah,2ahint 21hmov year,cxmov month,dhmov day,dlmov dx,-1mov ax,yearcall writedecmov ah,0mov al,monthcall writedecmov dx,-1mov al,daycall writedecpop dxmenu 09d,15d,mes0 menu 11d,15d,mes1menu 13d,15d,mes2menu 15d,15d,mes3menu 17d,15d,mes4menu 29
22、d,15d,mes21;-mov ah,02h ;设立光标位置mov bh,00hmov dh,22dmov dl,33dint 10hkeyin:mov ah,07h ;从键盘输入命令字符,无回显int 21hcmp al,0dhje begincmp al,Eje exitcmp al,c ;输入c查询分数记录je searchjmp keyinsearch :push dxclear_screen 0,0,24,79,1ehmenu 5d,20d,mes22mov cx,4lea si,scoresnext33:mov ah,02hmov dl, int 21hmov dx,-1mov
23、ax,sicall writedecadd si,2loop next33pop dxexit:mov ax,4c00hint 21h;-begin:clear_screen 0,0,24,79,0f6hmenu 6d,28d,mes6menu 9d,28d,mes7menu 13d,28d,mes8menu 15d,28d,mess8SETcusor 0,17,28lea dx,mes9call readdeccmp ax,2 ;选取游戏级别je donecmp ax,1je donecmp ax,3je donecmp ax,4;jne beginjmp donehigher: ;难度增长
24、时升级push bxMOV BX,game_timeDEC BXSHL BX,1mov si,scoremov scoresbx,si mov numb,0mov numb1,0mov score,0mov sum,0mov sum1,0mov bx,gradeclear_screen 00d,00d,24d,79d,colbxpop bxinc gradecmp grade,3ja ok1jmp tenok1:jmp ok2;-done:MOV GRADE,AXclear_screen 00d,00d,24d,79d,1eh ;清屏ten:Init_boarder 00d,00d,*,dl,
25、80dInit_boarder 24d,00d,*,dl,80dInit_boarder 00d,00d,*,dh,25dInit_boarder 00d,79d,*,dh,25d ;初始化边框clear_screen 02d,02d,23d,78d,1eh;清屏(边框还存在)Init_boarder 23d,01d,01h,dl,78d; 在倒数第二行显示一行笑脸SETCUSOR 0,01,8 lea dx,mes14mov ax,numb1call writedecSETCUSOR 0,01,35lea dx,mes12mov ax,numbcall writedecSETCUSOR 0,
26、01,55lea dx,mes13mov ax,scorecall writedec ;显示已输击字母数,对的字母数和分数;-mov ah,02hmov bh,00hmov dh,02hmov dl,02hint 10h ;将光标设立在第一行第一列mov cx,78 lea si,lettersnextletter:mov ah,02h;显示字母mov dl,siint 21hinc siloop nextletter;-start_game:;游戏开始mov time,0mov ah,2chint 21h;取系统时间,返回一种099数,在dl里inc dlcmp dl,78jna sg1su
27、b dl,78sg1:mov present_position,dllea di,lettersadd di,word ptr present_position ;di指向即将掉落字母dec dimov dl,present_positionmov ah,02hmov bh,00hmov dh,02hint 10h ;将光标设立在第一行和当前列位置mov cx,20d;总共有20行是空;-nextrow:push cxMOV BX,GRADEDEC BXSHL BX,1mov cx,speedbxwait_for_key:push cxmov cx,yanchibx;延迟 delay:loop
28、 delaypush dxmov ah,06h ;从键盘输入字符mov dl,0ffhint 21hpop dxjz pass;zf=1表达没有输入字符,zf=0表达有字符输入cmp al,1bh ;如果键入ESC,则返回主菜单je to_startcmp al, ;如果键入SPACE,则游戏暂停jne pass0jmp pauseok2:jmp ok3midstep:jmp nextrow;-pause:push dx;暂停解决mov ah,06hmov dl,0ffhint 21hpop dxcmp al, jne pauseje passjmp pass0to_start:jmp sta
29、rt1;-pass0:inc numb1push dxpush axSETCUSOR 0,01,8lea dx,mes14mov ax,numb1call writedecpop axpop dxSETCUSOR 0,dh,dlcmp al,di ;输入字母对的!则字母消失je disappearjmp passhigh1:jmp higherkk3:jmp to_start;-pass:pop cxLOOP wait_for_keydown:inc time inc summov ah,0ah ;在当前光标位置写空格mov al, mov bh,00hmov cx,01hint 10hinc
30、 dhmov ah,02h;变化光标位置mov bh,00hint 10hmov ah,0ah;在当前光标位置写字母mov al,dimov bh,00hmov cx,01hint 10hpop cxloop midstep ;下一行;-letter_over:mov ah,0ahmov al, mov bh,00hmov cx,01hint 10hinc dh ;将光标设立在最后一行mov ah,02hmov bh,00hint 10hmov ah,0ah ;最后行笑脸消失mov al, mov bh,00hmov cx,01hint 10hjmp next_letterjmp disapp
31、earjmp disappearok3:jmp ok4kk2:jmp kk3disappear: ;击中字母后输出空pop cxpop cxmov ah,0ahmov al, mov bh,00hmov cx,01hint 10hinc numbpush bxpush dxpush axpush diSETCUSOR 0,01,35lea dx,mes12mov ax,numbcall writedec ;重新显示对的字母数SETCUSOR 0,01,55mov si,numbmov bx,timeneg bxadd bx,21add sum1,bxpop bxadd si,sum1mov score,silea dx,mes13mov ax,scorecall writedec;计算分数并输出pop dipop axpop dxpop bxjmp next_letterok4:jmp okkk11:jmp kk2;next_letter:mov ah,02h;将光标重新设回mov bh,00hmov dh,02hmov dl,present_positionint 10hjmp high4high3:jmp high1high4:mov al,di ;浮