汇编语言课程设计报告-打字练习程序

上传人:91274****mpsvz 文档编号:71721164 上传时间:2022-04-07 格式:DOC 页数:22 大小:195KB
返回 下载 相关 举报
汇编语言课程设计报告-打字练习程序_第1页
第1页 / 共22页
汇编语言课程设计报告-打字练习程序_第2页
第2页 / 共22页
汇编语言课程设计报告-打字练习程序_第3页
第3页 / 共22页
点击查看更多>>
资源描述
精选优质文档-倾情为你奉上提供全套毕业设计,欢迎咨询汇编语言课程设计报告 程 序 题 目:打字练习程序学 生 姓 名:XX班 级:2010级计算机科学与技术专业4班学 号:XXX院 系:计算机科学学院指 导 教 师:XXX目录专心-专注-专业1设计目的本程序运行后,出现主界面,按回车键出现由26个字母组成的乱序行,这时其中任一字母落下,在键盘上敲入该字母,如果输入正确,字母消失;按回车键进入打字练习;按ESC键返回主界面;按空格键暂停;按E退出。通过课程设计,主要达到以下目的:1.增进对汇编语言的认识,加强用汇编语言编程的能力;2.掌握汇编语言的中断调用功能的应用,可以用汇编语言调用各种中断调用功能,并由此实现对硬件的控制等;3.了解和掌握汇编语言程序设计过程、方法及实现,为以后微机原理课程的学习打下良好基础;4.通过课程设计可以使我们更加了解书上的知识,了解书上的语句并且能够应用自己的程序中; 5.掌握屏幕输出显示的设计方法。2概要设计2.1 系统总体分析根据题目要求可以看到有以下几部分来实现打字练习:1.由26字母乱序组成一行显示行。2.字母自动落下。3.从键盘输入的字母与落下字母相同则该字母消失,并且下一个字母自动接着落下。4.按下“Ese”键则程序返回到主界面。5.按空格键游戏暂停。6.在主界面按“E”则程序退出。打字练习的主要功能由以上六部分组成,每一部分之间的联系都是比较紧密的。对于以上及部分,最主要的部分就是第二三两个部分,这是打字练习的重点,需要详细设计其所需要的功能。2.2主模块框图及说明结束随即字母落下当前字母消失暂停判断输入按键键入字符是否与下落一致是否是空格开始输入空格是否是ESCE 其他键 ENTER ENTER从键盘输入字符 是否是是否 是 是 图2-1程序设计流程图程序的核心模块是打字,各个模块功能的实现主要是通过键盘输入指令来融合的,主要流程是先到主界面,然后选择你想要进行的指令ENTER进入打字界面开始打字,E退出程序,空格在打字练习时执行暂停的功能,ESC是从打字界面返回到主界面。核心模块的流程大体如下面的流程图图2-1:3 详细设计3.1 主模块及子模块说明主界面是程序的初始入口,也是其他功能模块的接入点。主模块是打字模块,也是核心模块,主要通过各个键盘符来控制各个子模块之间的协调。子模块分为判断输入字符判断模块(这当中包含两个小的子模块:主界面输入字符判断和打字模块输入字符判断)、暂停模块、退出模块(这当中包含两个小的子模块:打字界面返回主界面模块和主界面退出程序模块)3.2 各模块详细设计3.2.1主界面模块当程序运行后,我们首先要进行选择,是要继续进行即进入打字练习程序还是终止练习退出程序。所以,在这里我们需要设置一个程序,该程序要判断键盘键入的字符,我们不妨规定ESC键和ENTER键分别为终止程序的控制键和进入打字练习程序的控制键,即当检验到键盘输入ESC后,退出程序;当键盘输入为ENTER时进入打字练习程序。单元程序如下:data segment ZK db HELLO,WELCOME TO HERE!$ no db My name isXX,my student number is:XX.$meg db Press ENTER key to continue.$meg1 db When a letter is dropping,please hit it!$meg2 db Press SPACE key to pause!$meg3 db Press ESC key to return main interface!$meg4 db Press letter E to exit!$;以上设置主界面的显示方式。clear_screen 00d,00d,24d,79d Init_game 00d,00d,0ah,dl,80d,nextsign1 Init_game 24d,00d,0ah,dl,80d,nextsign2 Init_game 00d,00d,0ah,dh,25d,nextsign3 Init_game 00d,79d,0ah,dh,25d,nextsign4 menu 05d,15d,ZK ;菜单信息的宏调用 menu 07h,15d,no menu 09d,15d,meg menu 11d,15d,meg1 menu 13d,15d,meg2 menu 15d,15d,meg3 menu 17d,15d,meg4 put: mov ah,02h ;设置光标位置 mov bh,00h mov dh,22d mov dl,33d int 10h mov ah,01h ;从键盘输入任意字符 int 21h cmp al,0dh je speed3 cmp al,45h je exit以上代码是清屏,并调用宏实现主界面的显示,并在主界面中设置了菜单显示后的光标位置,以方便使用者的操作。 in_cycle: add cx,01h cmp cx,1000 jne in_cycle push dx mov ah,06h ;从键盘输入字符 mov dl,0ffh int 21h pop dx jz pass cmp al,1bh ;如果键入ESC,则返回主菜单 je to_start1 cmp al, ;如果键入SPACE,则游戏暂停 je pause cmp al,di ;输入字母正确!则字母消失 je disappearto_start1: ;返回主菜单 jmp start上述程序段中用到了中断INT21,利用中断的有关规定,先将01H存入到AH当中,则AL中即为由键盘键入的字符。在此,先通过CMP指令来判断输入的字符是否是ENTER键(ENTER键的ASCII码为十六进制的0DH,程序开头部分的宏定义已经令CR为0DH),如果是的话,程序将跳转到程序disappear,disappear是定义的又一个程序,该程序即为打字练习程序的核心部分。如果不是ENTER的话,将执行下一条指令,即判断键盘键入的是否为E键,此功能由CMPAL,1BH来实现,其中1BH是E键的ACSII码的十六进制的表示。如果是E键的话,程序将跳转到TZD_1子程序,再通过TZD_1程序来判断是否要退出打字练习程序。如果键盘键入的既不是ENTER也不是E键的话,程序将继续等待键盘的输入,直到输入的按键为ENTER和E当中的一个为止。3.2.2随机字母产生模块当用户选择继续运行程序且进入打字练习界面时,则程序需要首先为用户输出一列随机的字符序列,这时程序就需要自动的调用产生随机字符序列的程序。程序段如下:letters db jwmilzoeucgpravskntxhdyqfb db iytpkwnxlsvxrmofzhgaebudjq db nwimzoexrphysfqtvdcgljukdaletters_bak db jwmilzoeucgpravskntxhdyqfb db iytpkwnxlsvxrmofzhgaebudjq db nwimzoexrphysfqtvdcgljukdaletter_counter db 0 begin: clear_screen 01d,01d,23d,78d ;清屏宏调用 clear_screen 01d,01d,23d,78d Init_game 23d,01d,01h,dl,78d,nextsign5 mov ah,02h mov bh,00h mov dh,01h mov dl,01h int 10h mov cx,00h lea si,letters上述的程序段中,begin实现了输出的字符的随机显示,当然这个随机是我们要事先通过自己随机定义一段由26个字母随机组成的序列,然后由begin来调用,从而间接来实现随即字母的产生。Begin段利用了INT10,其功能是设置屏幕显示方式,灵活的利用INT10丰富的指令功能,可以巧妙的设计出想要的程序来。INT10中断规定,DH和DL共同控制着字符输出的位置,其中DH为字符输出的行标,DL为字符输出的列标,通过改变DH和DL的值,可以改变字符在命令符输出屏幕上的位置;如果AH=09H时,则AL=字符,BL则是控制着输出的字符属性或颜色;计数器CX中存放的则是重复输出字符的个数。本程序中令CX中存放78,也就是说loop循环程序将循环78次,程序的输出为78个字符,当loop循环程序运行结束之后,程序将执行下一条指令,调用DAZIRUKOU子程序。使得程序继续运行,让用户按照程序自动产生的字符串来进行打字练习。3.2.3字母落下模块程序自动进入打字功能,自动落下字符,等待键盘输入字符以此来判断输入者想什么,如果键盘输入与预期的相符合则程序自动执行相关功能。如果输入字符与落下字符相同,程序执行当前字母消失和产生下一落下字母的功能,字母落下功能的实现是通过逐行替换的方法实现的,字母在当前行出现会有一个延迟时间,当过了这个延迟时间时,程序执行当前位置清空操作,并在下一行显示上一行的字母。代码如下: hit: mov ah,02h mov bh,00h mov dh,01h mov dl,present_position int 10h mov al,di ; 出现下一个新字母的数法 add al,7 cmp al,7ah ja convey_letter mov ah,0ah mov bh,00h mov cx,01h int 10h mov di,al add letter_counter,01h jmp nextcycle convey_letter: sub al,7ah add al,61h mov ah,0ah mov bh,00h mov cx,01h int 10h mov di,al add letter_counter,01h jmp nextcycle clear_screen 01,01,23,78 mov ah,02h mov bh,00h mov dh,11d mov dl,20d int 10h inc dh inc dh mov ah,02h mov bh,00h int 10hdisappear: ;击中字母后输出空格 pop cx pop cx mov ah,0ah mov al, mov bh,00h mov cx,01h int 10h jmp hit 3.2.4暂停模块如果输入空格,则程序执行暂停功能,暂停功能的实现是通过以下方法实现的,当从键盘输入空格时,程序收到暂停信号,执行跳转,跳转到一个死循环模块,就是无限显示当前屏幕,不做其他任何操作,直到键盘再次输入空格时,程序收到暂停结束指令,跳转回到主程序模块,继续执行主模块的功能。代码如下:pass: pop cx inc cx cmp cx,speed je print jmp out_cyclepause: push dx ;暂停处理 mov ah,06h mov dl,0ffh int 21h pop dx cmp al, jne pause jmp pass4程序调试4.1运行界面分析程序运行后的主界面如图4-1,主界面第一行是欢迎语,第二行是作者,然后往下是操作说明,为使用者说明该程序的使用方法。图4-1 程序主界面 当用户按下ENTER键时,程序自动跳入到图4-2的界面,字母随机落下,用户便可以开始打字练习了。练习只要按照说明来做就可以了。图4-2 打字界面4.2调试过程及分析当程序运行时,我发现当按esc退出,如果之前按下空格键暂停时,则退不出去,必须再次按下空格是程序开始运行才能退出。主要是因为按下空格键时,程序收到暂停信号,执行跳转,跳转到一个死循环模块,就是无限显示当前屏幕,不做其他任何操作,直到键盘再次输入空格时.5心得体会5.1 设计体会课程设计对我们多数初学汇编的学生来说,确实是一座高峰。翻越他是需付出努力的。我也是在探索了好久才弄明白他的,在此做个小总结,也许对自己今后的学习有些借鉴作用。在整个程序的编写中,调试占了很大部分的时间,要想写好汇编程序,必须认真对待代码的每一个细节,还必须熟练的掌握debug指令。通过这次实际动手能力的培养,我进一步熟悉了汇编的结构和使用法,基本达到能独立阅读。我觉得学习汇编的一个较大好处就是可以了解电脑中每一个字节数据的来龙去脉,我觉得学习汇编可以发挥一下自己的空间想象力。5.2 系统改进这次课程设计,其主题内容都以满足课程实际的要求,各功能都能相应的完成,即写一个程序,运行可执行程序后,出现主界面,按回车键出现由26个字母组成的乱序行,这时其中任一字母落下,在键盘上敲入该字母,如果输入正确,字母消失;按回车键进入打字练习;按ESC键返回主界面;按空格键暂停;按E退出,但是感觉整个程序界面不够华丽,看着粗糙的界面,不能引起别人的注意,下次能够吧界面做得更好看一些。参考文献1 李敬兆 8086/8088和arm核汇编语言程序设计 中国科技大学出版社2 沈美明,温冬婵 编著IBMPC汇编语言程序设计(第二版) 清华大学出版社出版3 罗云彬 Windows环境下32位汇编语言程序设计 电子工业出版社4【美】Kip R.Irvine 著,温玉杰 等译Intel 汇编语言程序设计(第四版) 电子工业出版社5 吕晓庆 80386/80486系统编程实践 淅江大学出版社6 袁可风 汇编语言程序设计 江西高校出版社7 戴水贵 Windows汇编语言程序设计教程 清华大学出版社8 罗杰 INTEL86系列汇编语言程序设计 江西科学技术出版社附:程序源代码Init_game macro op1,op2,op3,op4,op5,op6 mov cx,00h mov dh,op1 mov dl,op2op6:mov ah,02h mov bh,00h int 10h push cx mov ah,0ah mov al,op3 mov bh,00h mov cx,01h int 10h pop cx inc cx inc op4 cmp cx,op5 jne op6 endmclear_screen macro op1,op2,op3,op4 ;清屏宏定义 mov ah,06h mov al,00h mov bh,07h mov ch,op1 mov cl,op2 mov dh,op3 mov dl,op4 int 10h mov ah,02h mov bh,00h mov dh,00h mov dl,00h int 10hendmmenu macro op1,op2,op3 ;菜单显示宏定义 mov ah,02h mov bh,00h mov dh,op1 mov dl,op2 int 10h mov ah,09h lea dx,op3 int 21hendmdata segment ZK db HELLO,WELCOME TO HERE!$ no db My name is Liu Hui,my student number is:.$meg db Press ENTER key to continue.$meg1 db When a letter is dropping,please hit it!$meg2 db Press SPACE key to pause!$meg3 db Press ESC key to return main interface!$meg4 db Press letter E to exit!$speed dw 500dletters db jwmilzoeucgpravskntxhdyqfb db iytpkwnxlsvxrmofzhgaebudjq db nwimzoexrphysfqtvdcgljukdaletters_bak db jwmilzoeucgpravskntxhdyqfb db iytpkwnxlsvxrmofzhgaebudjq db nwimzoexrphysfqtvdcgljukdaletter_counter db 0 life_flag db 78 dup(0)position_flag db 78 dup(0) present_position db 1 data endsstack segment para stack stack db 64 dup(0)stack endscode segment main proc far assume cs:code,ds:data,ss:stack start: mov ax,data mov ds,ax mov letter_counter,00h mov present_position,1 lea si,position_flag mov ah,00h mov cx,00hinit_postion_flag: mov si,ah inc si inc cx cmp cx,78d jne init_postion_flag lea di,letters lea si,letters_bak mov cx,00hinit_letters: mov ah,si mov di,ah inc si inc di inc cx cmp cx,78d jne init_letters mov ah,00h lea si,life_flag mov cx,00hinit_life_flag: mov si,ah inc si inc cx cmp cx,78d jne init_life_flag mov cx,00h mov ah,01h or ch,b int 10hclear_screen 00d,00d,24d,79d Init_game 00d,00d,0ah,dl,80d,nextsign1 Init_game 24d,00d,0ah,dl,80d,nextsign2 Init_game 00d,00d,0ah,dh,25d,nextsign3 Init_game 00d,79d,0ah,dh,25d,nextsign4 menu 05d,15d,ZK ;菜单信息的宏调用 menu 07h,15d,no menu 09d,15d,meg menu 11d,15d,meg1 menu 13d,15d,meg2 menu 15d,15d,meg3 menu 17d,15d,meg4 put: mov ah,02h ;设置光标位置 mov bh,00h mov dh,22d mov dl,33d int 10h mov ah,01h ;从键盘输入任意字符 int 21h cmp al,0dh je speed3 cmp al,45h je exit exit: mov ah,4ch int 21h speed3: mov ax,speed+12 mov speed,ax jmp begin begin: clear_screen 01d,01d,23d,78d ;清屏宏调用 clear_screen 01d,01d,23d,78d Init_game 23d,01d,01h,dl,78d,nextsign5 mov ah,02h mov bh,00h mov dh,01h mov dl,01h int 10h mov cx,00h lea si,lettersnextletter: mov ah,02h ;显示字母 mov dl,si int 21h inc si inc cx cmp cx,78d je nextcycle jmp nextletterfrom_front: sub present_position,78d jmp gobackto_sifind_zero: cmp letter_counter,78d je recycle cmp present_position,78d je from_one mov ah,00h nextsi: add present_position,01h inc si cmp si,ah je gobackto_di cmp present_position,78d je from_one jmp nextsifrom_one:mov present_position,01h jmp gobackto_si recycle:mov letter_counter,00h mov present_position,01d lea si,position_flag mov cx,00h mov ah,00hclearsi: mov si,ah inc cx cmp cx,78d je nextcycle inc si jmp clearsinextcycle: lea di,letters lea si,position_flag add present_position,31d cmp present_position,78 ja from_frontgobackto_si: add si,word ptr present_position dec si mov ah,si cmp ah,01h je find_zerogobackto_di: mov ah,01h mov si,ah add di,word ptr present_position dec di mov dl,present_position mov ah,02h mov bh,00h mov dh,01h int 10h mov cx,00hnextrow: push cx mov cx,00hout_cycle: ; 延迟 push cx mov cx,00hin_cycle: add cx,01h cmp cx,1000 jne in_cycle push dx mov ah,06h ;从键盘输入字符 mov dl,0ffh int 21h pop dx jz pass cmp al,1bh ;如果键入ESC,则返回主菜单 je to_start1 cmp al, ;如果键入SPACE,则游戏暂停 je pause cmp al,di ;输入字母正确!则字母消失 je disappearpass: pop cx inc cx cmp cx,speed je print jmp out_cyclepause: push dx ;暂停处理 mov ah,06h mov dl,0ffh int 21h pop dx cmp al, jne pause jmp passto_start1: ;返回主菜单 jmp startprint: mov ah,0ah ;在当前光标位置写空格 mov al, mov bh,00h mov cx,01h int 10h inc dh mov ah,02h ;改变光标位置 mov bh,00h int 10h mov ah,0ah ;在当前光标位置写字母 mov al,di mov bh,00h mov cx,01h int 10h pop cx inc cx cmp cx,21d je print_next_letter jmp nextrow ;下一行disappear: ;击中字母后输出空格 pop cx pop cx mov ah,0ah mov al, mov bh,00h mov cx,01h int 10h jmp hit print_next_letter: lea si,life_flag add si,word ptr present_position dec si mov ah,0ah mov al, mov bh,00h mov cx,01h int 10h inc dh mov ah,02h mov bh,00h int 10h mov ah,0ah mov al, mov bh,00h mov cx,01h int 10h mov ah,1 mov si,ah hit: mov ah,02h mov bh,00h mov dh,01h mov dl,present_position int 10h mov al,di ; 出现下一个新字母的数法 add al,7 cmp al,7ah ja convey_letter mov ah,0ah mov bh,00h mov cx,01h int 10h mov di,al add letter_counter,01h jmp nextcycle convey_letter: sub al,7ah add al,61h mov ah,0ah mov bh,00h mov cx,01h int 10h mov di,al add letter_counter,01h jmp nextcycle clear_screen 01,01,23,78 mov ah,02h mov bh,00h mov dh,11d mov dl,20d int 10h inc dh inc dh mov ah,02h mov bh,00h int 10hnotkey: mov ah,07h int 21h cmp al,0dh je to_start cmp al,1bh je over jmp notkeyto_start: clear_screen 00,00,24,79 jmp startover: clear_screen 01,01,23,78 mov ah,02h mov bh,00h mov dh,11d mov dl,15h int 10h mov ah,02h mov bh,00h mov dh,13d mov dl,15h int 10h mov ah,07h int 21h mov ah,07h int 21h clear_screen 00,00,24,79 mov ax,4c00h int 21hmain endpcode endsend start
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!