微机课设汇编--键盘打字练习.doc_第1页
微机课设汇编--键盘打字练习.doc_第2页
微机课设汇编--键盘打字练习.doc_第3页
微机课设汇编--键盘打字练习.doc_第4页
微机课设汇编--键盘打字练习.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

武汉理工大学微机原理与接口技术课程设计说明书学 号: 0121111350226课 程 设 计题 目计算机键盘打字练习软件设计学 院自动化学院专 业电气工程及其自动化班 级1102姓 名王斌指导教师张锐2014年1月10日摘要 汇编语言程序设计是电子信息类专业的重要基础课程,是计算机应用开发人员必须接受的最重要的专业基础训练之一,是计算机软,硬件研究的基础,是一个优秀计算机工作者必须掌握的基础知识和基本技能。汇编语言也是计算机能够提供给用户的最快而又最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言。因而,对程序的空间个时间的要求很高的场合,汇编语言的应用时必不可少的。本次通过对键盘练习打字程序的设计和应用,能够尽可能的提高汇编语言水平。 Assembly language programming is the important basic course of electronic and information profession is a computer application developers must accept one of the most important professional basic training is a computer soft and hardware research foundation, is a good computer workers must master the basic knowledge and basic skills. Assembly language is also a computer can provide users with the fastest and most efficient language, is also able to use the computer all hardware features and the only language can directly control the hardware. Thus, a high requirement on the application of space time, the application of assembly language when necessary. This through the keyboard typing practice program design and application of as much as possible to improve the level of assembly language. 目 录一、设计要求41.1设计任务41.2设计要求41.3设计目的4二、设计环境52.1DOS中断介绍5三、软件设计53.2 软件设计7 3.2.1主模块及子模块说明73.2.2主界面模块73.2.3随机字母产生模块93.2.4字母落下模块103.2.5暂停模块113.2.6返回主界面模块12四、程序调试124.1 运行界面分析12五、心得体会155.1 设计体会155.2 系统改进15参考文献161彭虎.微机原理与接口技术.北京:电子工业出版社,2008162王爽.汇编语言.清华大学出版社,2008163沈美明.IBMPC汇编语言程序设计.清华大学出版社,2008164任向民.汇编语言程序设计实用教程.清华大学出版社,2009165朱耀庭.汇编语言程序设计.清华大学出版社,200916一、设计要求1.1设计任务利用PC机键盘和时间中断、字符显示实现打字练习程序。1.2设计要求1.使用汇编语言设计一个运行于计算机的键盘打字练习的软件,软件应实现显示预定义或计算产生的字符串对比从用户键盘输入的字符串,评分或直到全部输入正确为止。可以附加字符出现在不同位置和随机产生字符效果。2.说明书撰写格式应符合课程设计说明书统一书写格式。1.3设计目的 这次课设的任务是写一个程序,运行可执行程序后,出现主界面,按回车键出现由26个字母组成的乱序行,这时其中任一字母落下,在键盘上敲入该字母,如果输入正确,字母消失;按回车键进入打字练习;按ESC键返回主界面;按空格键暂停;按Q退出。通过课程设计,主要达到以下目的:(1)增进对汇编语言的认识,加强用汇编语言编程的能力;(2)掌握汇编语言的中断调用功能的应用,可以用汇编语言调用各种中断调用功能,并由此实现对硬件的控制等;(3)了解和掌握汇编语言程序设计过程、方法及实现,为以后微机原理课程的学习打下良好基础;(4)通过课程设计可以使我们更加了解书上的知识,了解书上的语句并且能够应用自己的程序中;(5)掌握屏幕输出显示的设计方法。二、设计环境2.1DOS中断介绍 在微电脑的系统中,DOS(Disk Operating System,磁碟作业系统)与BIOS(BasicInput Output System,基本输入输出系统)都提供了许多好用的中断服务常式(Interrupt Service Routine,ISR)来给我们这些程式设计师使用,例如萤幕、键盘、磁碟机、印表机、滑鼠-等多种有关於输入输出装置的控制程式。注意,通常这些中断服务常式我们是看不到的,要用到它时,呼叫即可。 一般我们只要在程式中直接使用(INT中断编号)中断指令,即可执行该中断编号的中断服务常式,80X86系列的电脑规划出256种的中断情况(即00HFFH),我们程式设计师只要针对该中断情况的一些需求来配以片段的指令,即可完成该中断情况的动作,即当CPU执行到中断呼叫指令(INT),就会中断目前程式的执行,而将程式执行的控制权转移到该中断服务常式中,待完成之后,才又回到刚刚的中断而继续往下执行其他的指令。应用程序 硬件BIOSDOS 图1图1为用户与DOS,BIOS的关系图三、软件设计3.1 硬件设计通过将从8259A的INT端与主8259A的IRQ2相连来实现两片8259A的级联,主8259A的IRQ0接收8254的55ms定时器中断,IRQ1接收键盘中断。主8259A的INT端与CPU相连。 图23.2 软件设计3.2.1主模块及子模块说明主界面是程序的初始入口,也是其他功能模块的接入点。主模块是打字模块,也是核心模块,主要通过各个键盘符来控制各个子模块之间的协调。子模块分为判断输入字符判断模块(这当中包含两个小的子模块:主界面输入字符判断和打字模块输入字符判断)、暂停模块、退出模块(这当中包含两个小的子模块:打字界面返回主界面模块和主界面退出程序模块)。3.2.2主界面模块 当程序运行后,我们首先要进行选择,是要继续进行即进入打字练习程序还是终止练习退出程序。所以,在这里我们需要设置一个程序,该程序要判断键盘键入的字符,我们不妨规定ESC键和ENTER键分别为终止程序的控制键和进入打字练习程序的控制键,即当检验到键盘输入ESC后,退出程序;当键盘输入为ENTER时进入打字练习程序。单元程序如下:ZK db WELCOME TO PLAY THIS GAME!$ no db date:2010/01/11$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 Q 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 ;输入为ENTRY进入打字练习 cmp al,51h jne put ;输入为“Q”退出程序 mov ah,4ch int 21h以上代码是清屏,并调用宏实现主界面的显示,并在主界面中设置了菜单显示后的光标位置,以方便使用者的操作。 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),如果是的话,程序将跳转到程序disappear,disappear是定义的又一个程序,该程序即为打字练习程序的核心部分。如果不是ENTER的话,将执行下一条指令,即判断键盘键入的是否为Q键,此功能由CMPAL,51H来实现,其中51H是Q键的ACSII码的十六进制的表示。如果是Q键的话,程序将退出打字练习程序。如果键盘键入的既不是ENTER也不是Q键的话,程序将继续等待键盘的输入,直到输入的按键为ENTER和Q当中的一个为止。3.2.3随机字母产生模块当用户选择继续运行程序且进入打字练习界面时,则程序需要首先为用户输出一列随机的字符序列,这时程序就需要自动的调用产生随机字符序列的程序。程序段如下:letters db jwmilzoeucgpravskntxhdyqfb db iytpkwnxlsvxrmofzhgaebudjq db nwimzoexrphysfqtvdcgljukdaletters_bak db jwmilzoeucgpravskntxhdyqfb db iytpkwnxlsvxrmofzhgaebudjq db nwimzoexrphysfqtvdcgljukda ;定义待“下落”的字符letter_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中存放的则是重复输出字符的个数。3.2.4字母落下模块程序进入打字功能,自动落下字母,等待键盘输入字符,以此来判断输入者想什么,如果键盘输入与预期的相符合则程序自动执行相关功能。如果输入字符与落下字符相同,程序执行当前字母消失和产生下一落下字母的功能,字母落下功能的实现是通过逐行替换的方法实现的,字母在当前行出现会有一个延迟时间,当过了这个延迟时间时,程序执行当前位置清空操作,并在下一行显示上一行的字母。代码如下: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.5暂停模块如果输入空格,则程序执行暂停功能,暂停功能的实现是通过以下方法实现的:当从键盘输入空格时,程序收到暂停信号,执行跳转,跳转到一个死循环模块,就是无限显示当前屏幕,不做其他任何操作,直到键盘再次输入空格时,程序收到暂停结束指令,跳转回到主程序模块,继续执行主模块的功能。代码如下: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 pass3.2.6返回主界面模块如果键盘输入ESC,程序结束当前运行,返回到程序的主界面,然后等待主界面中键盘的输入,这又跳回到主界面模块。相关代码包含在3.2.1主界面功能代码段当中。四、程序调试4.1 运行界面分析程序运行后的主界面如图4-1,主界面第一行是欢迎语,第二行为程序制作的日期。接下来是操作说明。图4-1 程序主界面当用户按下ENTER键时,程序自动跳入到图4-2的界面,字母随机落下,用户便可以开始打字练习了。练习只要按照说明来做就可以了。图4-2 打字界面当用户按下“Q”键时,程序回到主界面如图图4-1,当用户按下的既不是ENTRY,也不是“Q”键时,程序仍然保留在主界面,如图图4-3。图4-3 按下非ENTRY、非“Q”界面 当键盘输入字母与屏幕落下字母相同时,字母消失;不相同时,字母没有消失,直到碰到下面“地面”。 打字过程按下空格键,则打字练习暂停,对其他键无反应,再次按下空格键,又恢复打字练习。4.2 调试过程及分析 开始在网上找到的源程序代码能够满足题目的大多数要求,但是在主界面按下除ENTRY以外的任何键时,程序都会退出来,在源程序中找到对应的退出语句时,发现判断退出的分支语句没起到作用,后来根据流程图,合理地调整了一下退出语句中的分支结构,调试后,程序能够实现在主界面按下“Q”键退出打字练习程序的功能。 当程序正在运行时,如果之前已按下空格键暂停,则此时按下ESC退不出去,必须再次按下空格让程序开始运行才能退出。这是因为按下空格键时,程序跳转到一个死循环模块,无限显示当前屏幕,直到键盘再次输入空格。五、心得体会5.1 设计体会课程设计对我们多数初学汇编的学生来说,确实是一座高峰。翻越他是需付出努力的。我也是在探索了好久才弄明白一点点皮毛,在此做个小总结,也许对自己今后的学习有些借鉴作用。在整个程序的编写中,调试占了很大部分的时间,要想写好汇编程序,必须认真对待代码的每一个细节。通过这次实际动手能力的培养,我进一步熟悉了汇编的结构和使用法,基本达到了借助工具资料,能独立阅读较长的程序代码。我觉得学习汇编的一个较大好处就是可以了解电脑中每一个字节数据的来龙去脉,我觉得学习汇编可以发挥一下自己的空间想象力。通过这次课程设计,我也掌握了不少在互联网上搜索程序源代码的方法。5.2 系统改进这次课程设计,其主题内容都以满足课程实际的要求,各功能都能相应的完成,即写一个程序,运行可执行程序后,出现主界面,按回车键出现由26个字母组成的乱序行,这时其中任一字母落下,在键盘上敲入该字母,如果输入正确,字母消失;按回车键进入打字练习;按ESC键返回主界面;按空格键暂停;按Q退出,但是感觉整个程序界面不够细致,不够人性化,如果自己时间充裕,相信可以将界面做得更好一些。参考文献1彭虎.微机原理与接口技术.北京:电子工业出版社,20082王爽.汇编语言.清华大学出版社,20083沈美明.IBMPC汇编语言程序设计.清华大学出版社,20084任向民.汇编语言程序设计实用教程.清华大学出版社,20095朱耀庭.汇编语言程序设计.清华大学出版社,2009附录程序清单:init_game macro op1,op2,op3,op4,op5,op6 mov cx,00h mov dh,op1 mov dl,op2op6:mov ah,02h ;定义操作数op6 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 WELCOME TO PLAY THIS GAME!$ no db date:2014/01/10$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 Q to exit!$speed dw 00ffh letters db dyqfbjwmilzoeucgpravskntxh db nxlsvxrmofzhgaebudjqiytpkw db oexrphysfqtvdcgljukdanwimzletters_bak db dyqfbjwmilzoeucgpravskntxh db nxlsvxrmofzhgaebudjqiytpkw db oexrphysfqtvdcgljukdanwimz ;定义待“下落”的字符letter_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 assume cs:code,ds:data,ss:stack start: main proc far 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,00010000b 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 begin ;输入为ENTRY进入打字练习 cmp al,51h jne put ;输入为“Q”退出程序 mov ah,4ch int 21h 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,00hnextsi: 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: ;击中字母后输出空

温馨提示

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

评论

0/150

提交评论