当前位置:文档之家› 汇编打字练习

汇编打字练习

课程设计2010~ 2011学年第二学期设计题目打字练习程序的设计院(系)计算机科学与信息工程专业计算机科学与技术班级 09104301学号 27学生姓名李迅设计时间2011年 6 月 20 日——2011年 6 月 24日指导教师宓双提交日期 2011年6月23日上海应用技术学院课程设计任务书指导教师(签名):宓双教研室主任(签名):2011年6 月19 日2010年6 月19日目录1概述: (1)1.1基本功能: (2)1.2拓展功能 (3)1.3其他功能 (3)2详细设计说明 (3)2.1原“TYPETEST.ASM”程序结构 (4)2.2已经实现的功能(修改的、新编写的)程序结构 (5)3对该“打字练习程序”的进一步设想 (10)3.1 (10)3.2 (11)3.3 (11)4课程设计总结 (11)5软件使用说明 (12)6附录(参考文献,原代码:) (12)参考文献: (12)原代码 (12)1概述:编写一个程序,执行程序后,出现主界面,按回车键出现由26个字母组成的乱序行,这时其中任一字母落下,在键盘上敲入该字母,如果输入正确,字母消失;按回车键进入打字练习;按ESC键返回主界面;按空格键暂停;按‘E’退出。

因此程序要包含以下几个模块:菜单显示模块、字母显示模块、字母下落模块、暂停处理模块、退出返回模块等。

1.1 基本功能:2认真阅读“typetest.asm”源程序, 理解程序每一条指令在程序中的作用。

绘制程序流程图(简略总图,各模块详细流程图),给程序中的关键语句(后跟分号)作注释。

3设置输入界面, 用户输入密码后才能进入主菜单;4修改主菜单, 在主菜单上显示当天日期;5修改主菜单, 增加可供用户选择难度级别的选项。

6为用户打分,正确输入字母使用时间越少,得分越高。

7修改程序, 在屏幕右上角显示用户得分、已输入字母数、正确数。

将程序中的“置光标位置”程序段落用宏调用完成, 添加“置光标位置”宏定义7.1 拓展功能8设置限定时间,到达该时间,用户尚未得到要求的分数时,游戏停止。

9到达限定时间,用户得分达到预设的值时, 自动提高难度等级, 屏幕变色。

10修改程序,底行的笑脸字母消失后,不再在该列下落字母(提示:设置数组记录笑脸字母的存在与否)。

笑脸字母全部消失后, 游戏停止, 显示告别画面,显示用户成绩。

10.1 其他功能设置限定出错次数,到达该出错次数,游戏停止11详细设计说明首先先定义一个清屏幕的宏。

调用这个宏,就清除Dos界面上的所有内容,专门显示我们所需要的菜单。

接着定义我们的数据段代码。

在数据段中,有我们菜单中所需要显示的提示信息,还有要显示在界面上方的字母乱序,以及给显示字母乱序所留出的数据空间。

接下来就是定义堆栈段代码,为各段留下空间。

再下来就是最重要的代码段,因为所有的功能都是在代码段中实现的。

代码段中先实现显示主菜单、按Enter键开始程序和按E退出这几项简单的功能。

接着实现显示字母乱序的功能,主要思想是将字母乱序放到之前定义的寄存器中。

然后实现接受键盘所输入的内容的功能。

如果输入的是Esc,则返回主菜单;如果输入的是Space,程序就暂停;如果是正确的字母,改字母就消失。

消失的思想就是在当前字母位置输入空格,然后光标放到下一个下落的字母的位置。

11.1 原“typetest.asm”程序结构打字练习程序的主要流程如图所示。

11.2 已经实现的功能(修改的、新编写的)程序结构设置输入界面, 用户输入密码后才能进入主菜单;id db 1,1,2,3,5,8inf db ?string db 0ah,0dh,"Please enter the password(******):$"string1 db 0ah,0dh,"The password is wrong ,please enter the password again:$"lea dx,stringmov ah,09hint 21htwo:mov cx,6lea si,idagain:mov ah,01hint 21hand al,0fhcmp al,[si]jnz oneinc siinc bxloop againjmp exit1one:lea dx,string1mov ah,09hint 21hjmp two修改主菜单, 在主菜单上显示当天日期;mov cx,6mov bx,0mov ah,0mov al,9s:push cxpush axout 70h,alin al,71hmov ah,almov cl,4shr ah,cland al,00001111badd ah,30hadd al,30hmov byte ptr ds:[bx],ahmov byte ptr ds:[bx+1],alpop axcmp al,4jna s1jmp short s2s1:dec als2:cmp al,7jne oksub al,2ok:dec aladd bx,3pop cxloop smov dx,0mov ah,9int 21h修改主菜单, 增加可供用户选择难度级别的选项。

mes11 db "Hit:$"mes12 db "Right:$"mes13 db "Score:$"mov ah, 01hint 21hcmp al, '1'je next1cmp al, '2'je next2cmp al, '3'je next3jmp keyin1next1:mov bx,9999hmov speed,bxjmp nextnext2:mov bx,5000hmov speed,bxjmp nextnext3:mov bx,2000hmov speed,bxnext:修改程序, 在屏幕右上角显示用户得分、已输入字母数、正确数。

mes11 db "Hit:$"mes12 db "Right:$"mes13 db "Score:$"score_display procInit_place 00d, 65dint 10hlea dx,mes12mov ax,scorecall writedecInit_place00d, 43dlea dx,mes13mov ax,scorecall writedecretscore_display endphit_display procmov ah, 0ahmov al, " " ;将空格赋值为AL mov bh, 00hmov cx, 01hint 10hmov [save],dlmov [save+1],dhInit_place00d, 55dlea dx,mes11add hit,1mov ax,hitcall writedecmov dl,[save]mov dh,[save+1]rethit_display endp将程序中的“置光标位置”程序段落用宏调用完成, 添加“置光标位置”宏定义。

Init_placemacro row, col;置光标位置宏定义mov ah, 02hmov bh, 00hmov dh, rowmov dl, colint 10hendm12对该“打字练习程序”的进一步设想12.1设置限定出错次数,到达该出错次数,游戏停止wrong db 30mes9 db "Game Over!$"dec wrongcmp wrong,0jne passjmp overover: clear_screen 01d, 01d, 23d, 78d ; 清屏menu 03d, 33d, mes9mov ax, 4c00h ;退出程序13课程设计总结设计体会刚拿到这个题目觉得特别难,感觉无从下手。

汇编语言不同于高级语言,对于高级语言,我们心中可以有一个非常清晰的思路,在实现功能的时候非常得心应手。

但汇编语言不同,它是面向机器的语言。

用它编写程序时的思路应该按照机器执行程序的思路来编写,所以这个挑战对我来说非常大。

在编写程序之前,首先要摒弃高级语言思路的干扰。

在做准备工作的时候,我从网上找到了相关的代码,照着别人的步骤感受汇编语言编写程序的思路。

很多地方都不是太明白,但是通过查询课本以及上网找相关资料,还是把一些内容理解了。

在编写的时候,我也是按照别人的思路,一步一步进行。

很多地方看似简单,但是等到自己亲自实践的时候就编的很复杂。

汇编语言的前后联系非常紧密,如果要改一点东西的话整个程序的很多地方都要重新做,可以说是牵一发而动全身。

所以在编写的时候要很仔细,要记住前面已经实现了那些功能,还有那些功能要实现,这些必须记好,否则程序会出错。

通过这次课程设计,我了解了汇编语言编写程序的步骤:先确定程序要实现的功能,接着定义需要的寄存器、存储器,如果需要的话还要画出流程图。

然后逐个模块实现其功能。

如果将模块分好了,再去实现它的功能就不是那么复杂了。

此次的课程设计,提高了我阅读和分析程序的能力。

因为刚一拿到目标代码时,有太多的不明白,必须一行一行地分析其目的和功能。

而时间又比较紧迫,所以我在比较短的时间里分析出了代码的道理。

在这个过程中我的分析与模仿能力得到了提高。

系统改进本系统可以改进的地方有很多。

首先我做的界面不够华丽,显得很单调。

其次,字母下落的速度太单一,如果能随着玩的时间增加再加快就更好了。

而且计分系统没把字母输入时间也计算在内。

难度选择时候没有输入其它字符时的处理如果能加上这些功能的话那么程序的可用性以及完整性就有能上一台阶。

14软件使用说明登入密码:11235815附录(参考文献,原代码:)参考文献:[1]李敬兆8086/8088和arm核汇编语言程序设计中国科技大学出版社[2]沈美明,温冬婵编著IBM—PC汇编语言程序设计(第二版)清华大学出版社出版[3]罗云彬Windows环境下32位汇编语言程序设计电子工业出版社[4]【美】Kip R.Irvine 著,温玉杰等译Intel 汇编语言程序设计(第四版)电子工业出版社[5]吕晓庆80386/80486系统编程实践淅江大学出版社[6]袁可风汇编语言程序设计江西高校出版社[7]戴水贵Windows汇编语言程序设计教程清华大学出版社[8]罗杰INTEL86系列汇编语言程序设计江西科学技术出版社原代码; Assembly program for test your type skills; Writed by in 06/24/2003; Modified by Mi shuang in 06/06/2005; ------------------------------------------------Init_boarder macro row, col, char, dhdl, count;设置边框Local llmov cx, countmov dh, rowmov dl, colll: mov ah, 02hmov bh, 00hint 10hpush cxmov ah, 0ahmov al, charmov bh, 00hmov cx, 01hint 10hpop cxinc dhdlloop llendm; ------------------------------------------------Init_placemacro row, col;置光标位置宏定义mov ah, 02hmov bh, 00hmov dh, rowmov dl, colint 10hendm; ---------------------------------------------------clear_screen macro top, left, bottom, right; 清屏宏定义mov ah, 06hmov al, 00hmov bh, 07hmov ch, topmov cl, leftmov dh, bottommov dl, rightint 10hmov ah, 02hmov bh, 00hmov dh, 00hmov dl, 00hint 10hendm; ----------------------------------------------------menu macro row, col, text; 菜单显示宏定义mov ah, 02hmov bh, 00hmov dh, rowmov dl, colint 10hmov ah, 09hlea dx, textint 21hendm; ====================================================== include ylib.hData segmentdb "00/00/00 00:00:00",'$'ZK db "WELCOME TO PLAY$"date db "date:$"mes0 db "Press Enter key to continue.......$"mes1 db "When a letter is dropping,please hit it!$"mes2 db "Press space key to pause!$"mes3 db "Press ESC key to return main interface!$"mes4 db "Press letter 'E' to exit!$"mes5 db "Please choose the difficulty:$"mes6 db "No.1 easy$"mes7 db "No.2 normal$"mes8 db "No.3 hard$"mes9 db "Game Over!$"mes10 db "Your Score is:$"mes11 db "Hit:$"mes12 db "Right:$"mes13 db "Score:$"wrong db 30Speed dw ?Letters db "jwmilzoeucgpravskntxhdyqfb"db "iytpkwnxlsvxrmofzhgaebudjq"db "nwimzoexrphysfqtvdcgljukda"Present_position db 1db 0id db 1,1,2,3,5,8inf db ?string db 0ah,0dh,"Please enter the password(******):$"string1 db 0ah,0dh,"The password is wrong ,please enter the password again:$" score dw 0hit dw 0right dw 0save db ?Data ends; ========================================================= code segmentmain proc farassume cs: code, ds: datastart: mov ax, datamov ds, axmov es, axmov cx, 5000hmov ah, 01hint 10h ;设置光标类型clear_screen 00d, 00d, 24d, 79d ;清屏lea dx,stringmov ah,09hint 21htwo:mov cx,6lea si,idagain:mov ah,01hint 21hand al,0fhcmp al,[si]jnz oneinc siinc bxloop againjmp exit1one:lea dx,string1mov ah,09hint 21hjmp twoexit1:Init_boarder 00d, 00d, 0ah, dl, 80dInit_boarder 24d, 00d, 0ah, dl, 80dInit_boarder 00d, 00d, 0ah, dh, 25dInit_boarder 00d, 79d, 0ah, dh, 25d ;设置边框menu 05d, 15d, ZK ; 显示菜单menu 07d, 15d, datemov cx,6mov bx,0mov ah,0mov al,9s:push cxpush axout 70h,alin al,71hmov ah,almov cl,4shr ah,cland al,00001111badd ah,30hadd al,30hmov byte ptr ds:[bx],ahmov byte ptr ds:[bx+1],alpop axcmp al,4jna s1jmp short s2s1:dec als2:cmp al,7jne oksub al,2ok:dec aladd bx,3pop cxloop smov dx,0mov ah,9int 21hmenu 09d, 15d, mes0menu 11d, 18d, mes1menu 13d, 18d, mes2menu 15d, 18d, mes3menu 17d, 15d, mes4Init_place 22d,33dkeyin: mov ah, 07h ; 从键盘输入命令字符int 21hcmp al, 0dhje begincmp al, 'E' ;不等就和e做比较je exit ;如果相等则转exitjmp keyin ;不等跳转到keyinexit: mov ax, 4c00h ;退出程序int 21hbegin:clear_screen 00d, 00d, 24d, 79d ; 清屏menu 00d, 43d, mes13menu 00d, 55d, mes11menu 00d, 65d, mes12Init_boarder 24d, 00d, 0ah, dl, 80dInit_boarder 00d, 00d, 0ah, dh, 25dInit_boarder 00d, 79d, 0ah, dh, 25d ;设置边框menu 05d, 15d, mes5 ; 显示菜单menu 11d, 18d, mes6menu 13d, 18d, mes7menu 15d, 18d, mes8Init_place 22d,33dkeyin1:mov ah, 01hint 21hcmp al, '1'je next1cmp al, '2'je next2cmp al, '3'je next3jmp keyin1next1:mov bx,9999hmov speed,bxjmp nextnext2:mov bx,5000hmov speed,bxjmp nextnext3:mov bx,2000hmov speed,bxnext:clear_screen 01d, 01d, 23d, 78d ; 清屏Init_boarder 23d, 01d, 01h, dl, 78d ; 设置边框Init_place 01h,01hmov cx, 78lea si, lettersnextletter:mov ah, 02h ; 显示字母mov dl, [si]int 21hinc siloop nextletterstart_game:mov ah, 2chint 21h ;调取系统时间chcldh分别存放时分秒inc dl ;自增cmp dl, 78jna sg1sub dl, 78sg1: mov present_position, dllea di, lettersadd di, word ptr present_position ;将当前列数赋给didec di ;自减mov dl, present_position ;将当前列数赋给dlmov ah, 02hmov bh, 00hmov dh, 01hint 10h ;设置光标类型mov cx, 21d ;设置循环次数nextrow: push cxmov cx,speed ;设置字母下降速度wait_for_key: ; 延迟push cxmov cx,1000delay:loop delaypush dxmov ah, 06h ; 从键盘输入字符mov dl, 0ffhint 21hpop dxjz passcmp al, 1bh ; 如果键入ESC,则返回主菜单je to_startcmp al, " " ; 如果键入SPACE,则游戏暂停jne pass0pause: push dx ; 暂停处理mov ah, 06hmov dl, 0ffhint 21hpop dxcmp al, " " ;将字符和空格作比较jne pause ;不等则转换至空格jmp passto_start: jmp exit1pass0: cmp al,[di] ; 输入字母正确!则字母消失je disappearcall hit_displaydec wrongcmp wrong,0jne passjmp overpass:pop cxLOOP wait_for_key ;跳转到wait_for_keydown:mov ah, 0ah ; 在当前光标位置写空格mov al, " "mov bh, 00hmov cx, 01hint 10h ;设置光标类型inc dh ;自增mov ah, 02h ; 改变光标位置mov bh, 00hint 10hmov ah, 0ah ; 在当前光标位置写字母mov al, [di]mov bh, 00hmov cx, 01hint 10h ;设置光标类型pop cxloop nextrow ; 下一行letter_over: ;比较下个字母mov ah, 0ahmov al, " "mov bh, 00hmov cx, 01hint 10h ;在光标位置显示字符inc dh ;自增mov ah, 02hmov bh, 00hint 10h ;设置光标位置mov ah, 0ahmov al, " " ;将空格赋值为ALmov bh, 00hmov cx, 01hint 10hjmp next_letterdisappear: ; 击中字母后输出空格pop cxpop cxmov ah, 0ah ;调用0a号功能mov al, " " ;将空格赋给almov bh, 00hmov cx, 01hint 10h ;在光标位置显示空格add score,1call score_displaycall hit_displaynext_letter:mov ah, 02h ;调用02号功能mov bh, 00h ;在第0页mov dh, 01hmov dl, present_position ;将当前列数赋给dlint 10h ;bios调用mov al, [di] ; 出现下一个新字母的算法add al, 7 ;al+7cmp al, 7ahjna next_letter1sub al, 26next_letter1:mov ah, 0ahmov bh, 00hmov cx, 01hint 10h ;bios调用mov [di], aljmp start_gameover: clear_screen 01d, 01d, 23d, 78d ; 清屏menu 03d, 33d, mes9mov ax, 4c00h ;退出程序int 21hscore_display procInit_place 00d, 65dint 10hlea dx,mes12mov ax,scorecall writedecInit_place00d, 43dlea dx,mes13mov ax,scorecall writedecretscore_display endphit_display procmov ah, 0ahmov al, " " ;将空格赋值为AL mov bh, 00hmov cx, 01hint 10hmov [save],dlmov [save+1],dhInit_place00d, 55dlea dx,mes11add hit,1mov ax,hitcall writedecmov dl,[save]mov dh,[save+1]rethit_display endpmain endpcode endsend start。

相关主题