《汇编语言课程设计报告打字练习程序(内附源程序).doc》由会员分享,可在线阅读,更多相关《汇编语言课程设计报告打字练习程序(内附源程序).doc(33页珍藏版)》请在三一办公上搜索。
1、课程设计2010 2011学年第二学期设计题目 打字练习程序 院(系) 计算机科学与信息工程 专 业 计算机科学与技术 班 级 091041b1 学号 0910411113 学生姓名 王涛 设计时间 2011年 6 月 20 日2011 年 6 月 24日 指导教师 蒯锐 提交日期 2011年6月24日 上海应用技术学院课程设计任务书课程名称汇编语言课程设计课程代码B704207设计题目打字练习程序题目序号设计时间2011年 6月 20日 2011年 6月 24日系(院)计算机科学与信息工程专业计算机科学与技术班级091041b1一、课程设计任务(条件)、具体技术参数(指标)本课程设计是80X
2、86汇编语言程序设计课程的后继教学环节, 通过对一个较大型的、综合性的应用程序进行阅读、修改、添加功能等工作, 使学生对汇编语言程序设计有更进一步的认识, 提高阅读理解复杂程序的能力和程序设计能力。根据所给的“typetest.asm”应用程序框架, 在此基础上修改和添加功能。基本任务:1认真阅读“typetest.asm”源程序, 理解程序每一条指令在程序中的作用。绘制程序流程图(简略总图,各模块详细流程图),给程序中的关键语句(后跟分号)作注释。设置输入界面, 用户输入密码后才能进入主菜单 ;2. 修改主菜单, 在主菜单上显示当天日期 ;3. 修改主菜单, 增加可供用户选择难度级别的选项。
3、4. 为用户打分,正确输入字母使用时间越少,得分越高。5. 修改程序, 在屏幕右上角显示用户得分、已输入字母数、正确数。6. 将程序中的“置光标位置”程序段落用宏调用完成, 添加“置光标位置”宏定义。扩展任务:7. 设置限定时间,到达该时间,用户尚未得到要求的分数时,游戏停止。8. 到达限定时间,用户得分达到预设的值时, 自动提高难度等级, 屏幕变色。9. 修改程序,底行的笑脸字母消失后,不再在该列下落字母(提示:设置数组记录笑脸字母的存在与否)。笑脸字母全部消失后, 游戏停止, 显示告别画面,显示用户成绩。其他任务:自行设计新的功能。二、对课程设计成果的要求(包括课程设计说明书、图纸、图表、
4、实物等软硬件要求)(1) 分析原“typetest.asm”程序结构: 画出主程序粗略的流程图和各个模块的详细流程图,每个功能模块用文字说明他们的功能(与对应流程图放在一起);(2) 对你已经实现的功能(修改的、新编写的)做详细的说明, 并附上流程图及程序清单(修改/增加的指令请使用大写字母,以示区别);(3) 自己对该“打字练习程序”的进一步设想;(4) 对于有设想但最终未实现的功能的大致编程思路的阐述;(5) 论述在设计过程中遇到的并且对你具有启发性的问题。(6) 严禁抄袭,发现雷同,双方扣分。三、课程设计工作进度计划:周一:教师布置任务,讲解本课设模块。学生细读原始源程序,在重要行添加注
5、解。周二:画出主程序粗略的流程图和各个模块的详细流程图,开始基本任务。周三周四:设计程序及调试程序。同时着手写报告。周五:完成设计,提交报告,接受教师考评。四、主要参考资料1 杨文显,宓双,胡建人.新编汇编语言程序设计,清华大学出版社,20102 朱玉龙,任文览等.汇编语言程序设计,清华大学出版社,20033 美Kip R.Irvine. 电子工业出版社,2004指导教师(签名):蒯锐 教研室主任(签名):杨晶鑫 2011年 6 月 20 日 2011年 6 月 20 日目录2010 2011学年第二学期11.概述51.1基本功能51.2扩展功能62.详细设计说明72.1分析原“typetes
6、t.asm”程序结构82.1已经实现的功能(修改的、新编写的)说明93. 对该“打字练习程序”的进一步设想103.1 113.2123.3124. 课程设计总结135. 软件使用说明136附录(参考文献,原代码)146.1参考文献146.2 源代码151 概述本课程设计是80X86汇编语言程序设计课程的后继教学环节, 通过对一个较大型的、综合性的应用程序进行阅读、修改、添加功能等工作, 使学生对汇编语言程序设计有更进一步的认识, 提高阅读理解复杂程序的能力和程序设计能力基本功能1.1基本功能(1) 设置输入界面, 用户输入密码后才能进入主菜单(2) 修改主菜单, 在主菜单上显示当天日期。(3)
7、 修改主菜单, 增加可供用户选择难度级别的选项。(4) 为用户打分,正确输入字母使用时间越少,得分越高。(5) 修改程序, 在屏幕右上角显示用户得分、已输入字母数、正确数。(6) 将程序中的“置光标位置”程序段落用宏调用完成, 添加“置光标位置”宏定义。1.2拓展功能1. 设置限定时间,到达该时间,用户尚未得到要求的分数时,游戏停止。2. 到达限定时间,用户得分达到预设的值时, 自动提高难度等级, 屏幕变色。3. 修改程序,底行的笑脸字母消失后,不再在该列下落字母(提示:设置数组记录笑脸字母的存在与否)。笑脸字母全部消失后, 游戏停止, 显示告别画面,显示用户成绩。其他任务:2 详细设计说明2
8、.1 分析原“typetest.asm”程序结构2.1.1.首先在typetest.asm中定义了四个宏调用的程序(1)方框宏定义(2)清屏宏定义(3)菜单显示宏定义(4)设置光标位置宏定义2.1.2 data数据段的定义:包括的所有的显示字幕的定义。2.1.3 各宏定义函数的调用以及对各个子函数的调用。2.1.4 程序的主要流程图方框宏定义清屏宏定义菜单显示宏定义设置光标位置宏定义Data数据段的定义:date db 0ah,0dh, Date:$mes0 db 0ah,0dh, (1)Press Enter key to continue.$mes1 db 0ah,0dh, (2)When
9、 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 enter your password :$mes6 db 0ah,0dh,1: $开始用户输入密码判断密码进入主菜单返回不正确密码正确确定后进入选择需要练习的速度选项1.fast2veryfas
10、t3.slow4.veryslow选择需要的速度选项开始练习打字游戏计算打字的正确数根据正确数计算出应得分数显示用户所得分数,然后退出练习界面2.2 已经实现的功能(修改的、新编写的)说明2.2.1本程序已实现了基本的功能:(7) 设置输入界面, 用户输入密码后才能进入主菜单;(8) 修改主菜单, 在主菜单上显示当天日期;(9) 修改主菜单, 增加可供用户选择难度级别的选项;(10) 为用户打分,正确输入字母使用时间越少,得分越高;(11) 修改程序, 在屏幕右上角显示用户得分、已输入字母数、正确数;(12) 将程序中的“置光标位置”程序段落用宏调用完成, 添加“置光标位置”宏定义;2.2.2
11、本程序的扩展功能:(1) 修改了主界面的背景颜色以及字体的颜色,对一些主要的提示信息进行了一些优化。(2) 增加了一键显示用户得分记录的功能,只要用户在主界面上输入“C”,就可以显示出来用户的得分记录3 对“打字练习程序”的进一步设想3.1 可以让每次出现的字母都变得有逻辑性,就像打汉字的时候的那种逻辑性,还可以增加英语之类的打字练习。3.2 可以改变每一个字母在掉落的时候的颜色。让每一个字母的不同时刻的颜色都由电脑随机产生。3.3 在打字练习的过程中还可以有一些适当的声音来配合着练习的进行,这样的话效果和用户的体验都会有更进一步的提高的。4 课程设计总结4.1 通过这次课程设计让我跟具体的了
12、解了汇编语言的用途以及他的特点,这样有利于在今后的实践中更好的去应用汇编语言解决问题,同时通过这次的课程设计也体现出了我的在汇编方面的一些基础知识的不足。由于对汇编语言的一些基本知识的掌握不足,程序中还存在或多或少的缺陷和不足,有一些的基本功能在逻辑上还存在一些的小问题,但是不会影响基本的使用。5 软件使用说明由于系统版本不同的缘故,在程序汇编链接的时候会停滞一部,但只要在敲一下回车在进入一次就好了。很多时候在进入时输入密码后需要按回车才能跳转到主界面。6 附录(参考文献,原代码)参考文献1 杨文显,宓双,胡建人.新编汇编语言程序设计,清华大学出版社,20102 朱玉龙,任文览等.汇编语言程序
13、设计,清华大学出版社,20033 美Kip R.Irvine. 电子工业出版社,2004原代码; Assembly program for test your type skills ; Writed by in 06/24/2003; Modified by Mi shuang in 06/06/2005; -include ylib.hInit_boarder macro row,col,char,dhdl,count;Localllmov cx, count mov dh, rowmov dl, colll: movah, 02hmov bh, 00hint 10hpush cxmov
14、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, 00hint 10hendm;-SETCUSOR MACRO PAGE,R
15、OW,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 ?day db ?date db 0ah,0dh,
16、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 enter your password
17、 :$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 input:$mes20 db hi
18、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 db 6 dup(?
19、)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,24,79
20、,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 diloop c
21、heck ;密码的输入及判断是否正确;-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,
22、25d ;初始化边框menu 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, mes3m
23、enu 17d, 15d, mes4menu 29d, 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 a
24、h,02hmov dl, int 21hmov dx,-1mov 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
25、ax,4;jne beginjmp donehigher: ;难度增加时升级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,
26、79d,1eh ;清屏ten:Init_boarder 00d, 00d, *, dl, 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 writed
27、ecSETCUSOR 0,01,35lea dx,mes12mov ax,numbcall writedecSETCUSOR 0,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:;游
28、戏开始mov time,0mov ah, 2chint 21h;取系统时间,返回一个099的数,在dl里inc dlcmp dl,78jna sg1sub 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 cxM
29、OV BX,GRADEDEC BXSHL BX,1mov cx,speedbxwait_for_key:push cxmov cx,yanchibx; 延迟 delay:loop 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:
30、 push dx; 暂停处理mov ah, 06hmov dl, 0ffhint 21hpop dxcmp al, jne pauseje passjmp pass0to_start:jmp start1;-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
31、 cxLOOP wait_for_keydown:inc time inc summov ah, 0ah ; 在当前光标位置写空格mov al, mov bh, 00hmov cx, 01hint 10hinc 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 ;将
32、光标设置在最后一行mov ah, 02hmov bh, 00hint 10hmov ah, 0ah ;最后行的笑脸消失mov al, mov bh, 00hmov cx, 01hint 10hjmp next_letterjmp disappearjmp 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,55