微机原理统计打字练习对错率的程序设计课程设计.docx
《微机原理统计打字练习对错率的程序设计课程设计.docx》由会员分享,可在线阅读,更多相关《微机原理统计打字练习对错率的程序设计课程设计.docx(31页珍藏版)》请在冰豆网上搜索。
微机原理统计打字练习对错率的程序设计课程设计
摘要
随着时代的进步,打字是现代生活中每个人都需要做的事了,无论是娱乐还是工作。
而打字的速度和正确率也很重要。
用汇编语言编写一个练习打字的小软件,既有趣有能学以致用,增强动手创新能力。
汇编语言是面向机器的程序设计语言。
在汇编语言中,用助记符代替机器指令和操作码,用地址符号或标号代替指令或操作数的地址,如此就增强了程序的可读性和编写难度,像这样的符号化的程序设计语言就是汇编语言,因此亦称为符号语言。
汇编语言是直接面向处理器的程序设计语言,处理器在指令的控制下工作,处理器可以识别的每一条指令称为机器指令。
基本上,汇编语言列每一条指令都对应着处理器的一条机器指令。
汇编语言包括两个部分:
语法部分和编译器。
语法部分提供与机器指令相对于的助记符,方便指令的书写和阅读。
汇编语言设计的程序直接简洁,目标代码小,占用内存少,执行速度快,但缺乏可移植性,容易产生bug,难于调试,开发效率低。
微机原理及接口技术是一门实践性和工程性很强的专业技术课,因此不仅要重视理论教学更应注意实践技能的培养和训练。
课程设计是本课程的重要组成部分,通过课程设计,使学生巩固、加深和拓宽学习内容的理解,培养分析、设计和调试8086微机系统的能力。
关键字:
汇编语言指令操作数
目录
1.设计任务及要求1
1.1《微机原理与接口技术》课程设计目的1
1.2设计任务1
1.3设计要求1
2.方案比较及论证2
2.1方案比较2
2.2方案论述2
3.软件设计说明3
3.1软件思想3
3.2程序流程图5
3.3代码设计7
4.程序的调试与运行10
4.1调试环境简介10
4.2调试过程及结果分析10
1.程序调试过程10
5.课程设计收获及心得体会13
附录一15
统计打字练习对错率的程序设计
1.设计任务及要求
1.1《微机原理与接口技术》课程设计目的
对典型的微机应用系统进行设计,要求根据具体的课题题目画出系统结构框图、系统接线图;能用所学习的汇编语言进行典型的程序设计并上机进行调试。
并能根据要求写出设计课程设计报告,报告要求文字整洁、语言通顺、制图规范、程序完整正确。
1.2设计任务
设计一个统计打字练习对错率的程序。
在缓冲区中预放了一些字母,运行时,按照屏幕上显示的字母输入练习,每输入完一行按回车键后,显示练习输入的对错率。
按Q退出程序。
1.3设计要求
1.设计要求:
(1)设计一个在键盘上练习打字并能统计正确率的程序。
(2)熟悉和掌握有关键盘和时间的中断及字符显示计数。
(3)编制键盘中断和时间中断处理程序,并保存原中断向量。
程序运行时,使用自编的中断向量处理程序。
程序退出时,恢复中断向量。
2.设计功能:
(1)按照显示的字母输入练习,每输入完一行按回车键后,可显示出练习输入的时间及正确率,打字练习过程中输入的字符与打字练习的内容不符时会产生警报,打字练习可以一直进行下去直至练习者停止
(2)能用自编的中断向量处理程序处理中断。
2.方案比较及论证
2.1方案比较
根据打字计时练习的设计要求可知,我们可以依据缓冲区中字符系列的产生这一要求的实现有两种设计方案:
方案一是缓冲区中的字母是预先设定好的,后面所进行的打字练习是依照预先设定好的字符系列进行;方案二是缓冲区中的字母是随机生成的,每一次打字练习的字符系列都是随机产生的。
其他要求的实现都是一样的。
方案一:
缓冲区中的字符系列是预先设定好的。
这种设计方案要求在内存中预先开辟一段存储空间存放将要进行打字练习的字符系列,在后面进行打字练习的时候再将字符系列取出进行操作。
这种设计方案占用的内存较多并且需要先将字符系列取出后再进行操作,程序写起来很长,指令太多,同时设计的方案对于使用者来说太过单一,想尝试不同字符系列的打字练习时还要另行修改程序,适用性差。
方案二:
缓冲区中的字符系列是系统自动随机生成的。
这种设计方案要求系统随机生成字符系列,不需要预先分配内存单元,在开始新一轮的打字练习时就自动随机生成字符系列。
这种设计方案运用到的指令少,占用的内存少,设计的程序适用性好,不需要修改程序就可以尝试不同的字符系列的打字练习。
2.2方案论述
在设计打字练习时,根据打字练习的过程来设计打字计时练习的程序,首先在打字练习的界面上要有输出的提示信息提示对打字练习要进行的操作,其次是打字练习内容字母系列的生成,然后才开始进行打字练习,打字计时练习的过程在系统内部是一个不断循环的过程,在系统内部时钟每次嘀嗒计数循环一次,首先需要判断是否从键盘键入字符,这里面有一个循环检测的过程直至有字符键入系统,其次需要知道键入的字符是否是特殊字符,判断打字练习进行哪步操作。
这是一个大的分支程序,需要有很多的跳转并且需要不断的调用子程序实现不同的功能。
最后在一轮打字练习结束时需要有一个分支的选择,是再次进行打字练习的设置还是退出打字练习的程序。
3.软件设计说明
3.1软件思想
由打字计时练习的设计要求可知设计主要分为以下几个步骤:
打字练习过程中提示信息的输出,随机字母系列的生成,打字练习过程中键入字符的正确与否,打字练习过程的正确率的显示,字母系列是否键入完毕。
运用汇编语言设计的程序分为主程序和子程序。
主程序主要用于随机字母系列的生成,打字计时练习过程键入字符正确与否的判断,字母系列是否输入完毕,打字计时练习的新一轮的开始。
子程序分别实现不同的功能,分别如下:
子程序SHUCHU_TISHI中,实现的是打字练习过程中输出提示信息。
子程序DECDIV实现的是数字以ASCII字符形式输出
子程序TIME实现的是打字练习过程的输出
子程序SOUND实现的打字计时练习过程中键入字符与相应打字内容不等时的警报。
方案一的设计思路:
系统随机生成打字练习的内容
将需要输出的提示信息,记录打字练习的正确率参数单元等预先放在DATA数据段中,程序开始时就输出提示信息然后系统随机生成打字内容存放在内存中,然后开始打字练习,由自编的中断程序PRESS检测按键时产生的中断,并把按键的扫描码转换为ASCII码,这个工作和ROM09类型的键盘中断例行程序所完成的工作大致相同,只是在解释各个键时作了简化,即只解释了可显示字符,如英文字母、数字及一些符号;其他特殊键,如组合键、双态键、功能键等都未作解释,只作为字符码0来处理。
在主程序部分保存原09类型的中断向量,设置自编例行程序的中断向量,设置中断屏蔽位,然后开中断。
键入的字符时,还应判断字符是否为空格(20H)。
如为空格,需要再次的调用INT21H中断,从键盘输入字符直至输入的字符不是空格,还要判断是否是退出和回车,如果是跳到重新输入字符处,重新开始从键盘键入字符判断。
如果不是,进入键入的字符是否是正确处,进行各自相应的操作直至键入某一功能键(如Esc键、Shift键等)退出程序,结束打字练习。
在键盘打字计时采用10类型的键盘中断,来取得输入字符并将字符显示在屏幕上。
在统计正确率时需要利用数制转换子程序,将系统自行计数的二进制转换成十进制输出。
自行编制键盘中断处理程序,并保存原中断向量。
程序运行时,使用自编的中断向量处理程序。
程序退出时,恢复中断向量。
自编中断处理程序也是本课题需要考虑的重要问题。
虽然系统自带了许多中断例行程序可以由INT指令来执行,但在本课题中需要对原中断例行程序的功能进行扩充才可。
3.2程序流程图
主程序如图所示:
图一主程序流程图
上图为主程序流程图,是依据设计思路中未调用子程序的几个步骤得来。
SOUNDPROC
PUSHAX报警子程序流程图如图3所示:
PUSHCX
INAL,61H
ANDAL,11111101B
OUT61H,AL
MOVCX,10000
AGAIN_S:
XORAL,2
OUT61H,AL
CALLDELAY
LOOPAGAIN_S
POPCX
POPAX
RET
SOUNDENDP
DELAYPROC
PUSHCX
MOVCX,0FFFH
NEXT_D:
NOP
LOOPNEXT_D
POPCX图3报警子程序流程图
RET
DELAYENDP
在主程序中对键入字符ACSII是否介于33和127之间的判断,其流程图如图4所示:
图4:
键入字符的判断流程图
3.3代码设计
1.功能模块说明
(1)定义数据段,设置主要参数:
输出提示信息,记录正确率的参数
(2)代码段
调用中断8259,键盘中断
(3)使用子程序分化各子功能
SHUCHU_TISHIPROC;输出提示信息
SOUNDPROC;发声
DECDIVPROCNEAR;转化成字符显示
2.具体代码实现及关键代码分析
;定义堆栈段
;**********************************************************************************
SSEGSEGMENTSTACK'STACK'
DW100DUP(?
)
SSEGENDS
;**********************************************************************************
整个程序按两个中断源分为两部分。
在数据段中,前半部分是键盘处理所需要的数据变量,包括输入字符,字符缓冲区,09H中断向量的保存单元等。
后半部分有一个打字练习内容及其地址表SADDR,记录对错率的变量COUNT0,COUNT1中断向量的存贮单元等。
在堆栈段定义一个“先进先出”的缓冲区(buffer):
由于键盘是通过中断方式工作的,由于键盘中断的出现是完全随机的,因此要示键盘I/O程序要缓冲或保留它接收的任一键盘输入。
故需定义一个缓冲区,也叫循环队列。
;定义数据段
;**********************************************************************************DSEGSEGMENT'DATA'
;显示窗口内容
MSG1DB'PRESS"ENTER"TOSTART!
$'
MSG2DB'PRESS"ESC"TOEND!
$'
MSG4DB'THERATEOFCORRECT:
$'
MSG5DB'PRESS"ENTER"TORESTART!
$'
MSG6DB'PRESS"ESC"TOOUT!
$'
SECONTDB0
COUNT0DW0;为了记录正确的字符数
COUNT1DW0;字符总个数
COUNT2DW0;为了到行尾时自动翻行的控制
DSEGENDS
;**********************************************************************************
数据段定义了在后面要用到的记录打字练习的正确率及需要输出的提示信息
;定义代码段
;**********************************************************************************
CSEGSEGMENT'CODE'
ASSUMECS:
CSEG,SS:
SSEG,DS:
DSEG
;**********************************************************************************
主程序start:
输出打字操作的提示信息,随机生成字符系列,打字练习过程,打字正确率的计算。
;输出提示信息程序SHUCHU_TISHIPROC:
通过对DH,DL的赋值将光标定位在DH行DL列,调用宏定义OUTPUT设置输出字符串的属性并在DH行DL列输出
;输出提示信息***********************************
SHUCHU_TISHIPROC
ADDDH,3
ADDDL,28
OUTPUTMSG1,14,DH,DL
ADDDH,2
ADDDL,2
OUTPUTMSG2,11,DH,DL
RET
SHUCHU_TISHIENDP
;*********************************************
;正确率统计和报警程序
由于本次课设还要求设计的汇编语言程序具有统计正确率的功能,所以必须要有一段可以实现记录输入字符个数,并通过一个判断输入的字符是否与屏幕上由程序自动生成的字符串当中相对应的字符相同的程序,若相同的话,则使得统计输入正确的字符的寄存器增加一,然后将这两个程序联合使用来实现正确率的功能。
由于这两个程序当中有需要调用其他子程序,涉及到的程序过多,这里只给出一小段核心程序,如下:
MOVTODH,DL;显示光标的位置
MOVAX,COUNT0
CALLBINDEC;显示输入字母的个数
MOVAH,2
MOVDL,'/'
INT21H
MOVAX,BINDEC;显示输入正确的字母个数
CALLCHANGE
POPDX
JMPPRESS
首先在这段程序当中,用到了宏指令MOVTO,前面也说到了该宏指令可以通过控制DH、DL的值来控制输出字符的位置。
从而可以方便的控制想要显示的内容在屏幕上的位置。
在这段程序当中还涉及到了INT21H中断的应用,当AH当中为02H时,DL当中的存储内容就是直接显示的内容,在这里我们用到“/”即分数的形式来表达正确率,而不是直接计算出百分比。
“/”前面显示的内容是用户输入的内容与程序显示的字符一致的个数,作为分子,而“/”后面显示的内容是用户一共键入的字符个数,作为分母。
由于在计算机当中,数据均以二进制的形式来储存,但二进制并不是我们所习惯的数值表达方式,所以数据输出前需要经过一个进制转换程序的处理,经转换以后再输出到屏幕上供用户观看。
在这里就又涉及到了进制转换程序。
由于在本程序当中,进制转换程序并不是主要的程序单元,它只用作为辅助程序。
需要提到的是当用户键入的字符错误,即不与程序自动产生的字符串中对应的字符相同时,需要调用到报警程序单元。
用户键入错误字符有报警是本次课设的又一个主要要求,显然在调用报警程序之前,需要先判断键入的字符是否正确,在错误时才会调用报警程序,这就需要有一个可以判断键入字符的单元程序,该判断单元需要在用户每键入一个字符后便执行一次,因此它可以直接接在输入字符程序后面。
4.程序的调试与运行
4.1调试环境简介
软件简介:
MFPCI98集成实验环境是针对汇编语言初学者的特点开发的一个简单易用的汇编语言学习软件(支持最新操作系统Vista),它具有错误信息自动定位、关键字实时帮助并且在帮助中动画演示汇编指令的执行过程、语法着色、无限次撤消与恢复、WORD式的查找、替换、定位、支持中文、长文件名、软件可以安装在任意文件夹等功能。
4.2调试过程及结果分析
1.程序调试过程
启动全屏幕编辑软件MFPCI98,输入源程序。
输入完毕后,按Ctrl+S保存程序,规定扩展名为*.ASM。
对源程序进行汇编。
源程序进行汇编有三个步骤:
第一个是汇编生成OBJ文件,即二进制目标文件,这是汇编的主要目的。
第二个是连接。
第三个是运行。
汇编过程中,如果源程序有语法错误,则汇编结束后,会指出源程序中的错误,这时可以通过修改源程序中的错误,最后,得到没有语法错误的OBJ文件。
当没有语法错误而又无法得到正确结果时,可用调试来进行验证。
它通过单步、设置断点等多种方式为我们提供非常有效的调试手段。
2.程序运行结果
3.调试窗口如下:
1)设置主程序段显示输出信息,程序功能应该实现下图所示:
2)按下ENTER键后开始打字练习出现的界面:
3)从键盘上键入字母系列后的界面:
4)按下ESC键后,程序停止运行,运行RESTART程序,其输出界面如下:
5)按下ENTER后重新开始新一轮的打字练习,界面如下:
3.调试中出现的问题:
在设计程序过程中没有注意到要操作的目标数据(内存中的数据)的大小和使用的操作容器(寄存器)的大小不是一致。
在整个程序中没有考虑到光标的定位,致使字符的输出在屏幕上没有任何规律。
在对堆栈进行操作时,没考虑到压入和弹出堆栈的顺序。
在自编中断程序时当中断结束时,必须恢复原来的中断向量,否则后续程序不能正确使用系统提供的例行程序。
设置和恢复中断向量时,要访问程序内部数据变量,DS作为调用参数寄存器,要正确设置。
某些硬件中断例行程序在程序起始处将DS置成了ROM的数据段,所以在该中断的嵌套例行程序中,若要访问自编程序的数据变量,则必须将DS切换成用户数据段。
5.课程设计收获及心得体会
这次的课程设计有很多的感悟与收获。
运用汇编语言来编写一个实用的程序对于我来说是很有难度的。
但是当真的要做的时候也只好尽自己最大的努力去做。
我在这个过程中有很多自己的感受,感觉汇编语言真的是很神奇,很有意思。
从最刚开始的什么都不会到后来可以自己编程序,看着自己做出来的东西,心里感觉很快乐,这次的设计和其他课程设计有共同的地方,那就是不仅加深和巩固了我们的课本知识,而且增强了我们自己动脑动手的能力。
但是我想它也有它的独特之处,那就是让我们进入一个神奇的编程世界。
对于我来说真的新奇,很有趣,也使我有更多的兴趣学习汇编。
在课程设计中过程中尤其是汇编的时候总会出现这样或者那样的问题,这要求我们要学会分析问题并且学会解决问题,有时需要查书籍查资料看自己的错误在哪里,在这个过程中调试是极为重要的,通过一步一步的调试找出问题的症结所在。
有时刚刚解决了这里的一个问题别的地方又有新的问题出现,这是我们不能泄气,我们要学会思考,是什么原因使得别的地方又有新的问题,是不匹配还是其他原因。
总的来说我觉得微机原理与接口技术是一门很有趣的课程。
它在讨论某一部分原理时又要涉及到其它部分的工作原理。
这样一来,不仅不能在短时间内较深入理解计算机的工作原理,而且也很难孤立地理解某一部分的工作原理。
总是学会了一些新知识,弄清了一些原来保留的问题,又出现了一些新问题直到把保留的问题基本搞清楚。
6.参考文献
[1]赵润林、范国渠.汇编语言程序设计教程与实训[M].北京大学出版社.2006
[2]杨季文.80X86汇编语言程序设计教程[M].清华大学出版社.1998
[3]钱晓捷.汇编语言程序设计[M].电子工业出版社.2000
[4]温冬蝉,沈美明.IBMPC汇编语言程序设计[M].清华大学出版社.2002
[5]艾德才等编著.微型接口技术实用教程[M].清华大学出版社.2002
[6]姚燕南,薛均义主编.微型计算机原理与接口技术[M].高等教育出版社.2004
附录一
程序代码如下:
LFEQU0AH
CREQU0DH;宏定义部分
PRINTMACROP1,P2;输出“*”
PUSHAX
PUSHBX
PUSHCX
MOVAH,09H
MOVAL,P1
MOVBH,0
MOVBL,P2
MOVCX,1
INT10H
POPCX
POPBX
POPAX
ENDM
MOVTOMACROP1,P2;移动光标到指定位置
PUSHAX
PUSHDX
MOVAH,2
MOVDH,P1
MOVDL,P2
INT10H
POPDX
POPAX
ENDM
OUTPUTMACROMSG,P1,P2,P3;输出字符串
LOCALDIFFER,EXITOF
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHDI
MOVDH,P2
MOVDL,P3
MOVBH,0
MOVBL,P1
MOVDI,0
DIFFER:
MOVAH,02H
INT10H
MOVCL,MSG[DI]
CMPCL,'$'
JEEXITOF
MOVAH,9
MOVAL,MSG[DI]
MOVCX,1
INT10H
INCDI
INCDL
JMPDIFFER
EXITOF:
POPDI
POPDX
POPCX
POPBX
POPAX
ENDM
DSEGSEGMENT'DATA'
;显示窗口内容
MSG1DB'PRESS"ENTER"TOSTART!
$'
MSG2DB'PRESS"ESC"TOEND!
$'
MSG4DB'THERATEOFCORRECT:
$'
MSG5DB'PRESS"ENTER"TORESTART!
$'
MSG6DB'PRESS"ESC"TOOUT!
$'
SECONTDB0
COUNT0DW0;为了记录正确的字符数
COUNT1DW0;字符总个数
COUNT2DW0;为了到行尾时自动翻行的控制
DSEGENDS
SSEGSEGMENTSTACK'STACK'
DW100DUP(?
)
SSEGENDS
CSEGSEGMENT'CODE'
ASSUMECS:
CSEG,SS:
SSEG,DS:
DSEG
;*******************************************
STARTPROCFAR
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DSEG
MOVDS,AX
MOVES,AX
CALLSHUCHU_TISHI;输出提示信息
LZ:
MOVAH,1;带回显的键符输入
INT21H
MOVBL,AL;AL=输入的字符
CMPAL,CR;判断输入的字符是否是ENTER键
JEPRACTISE
CMPAL,1BH;判断是否要退出打字练习程序
JETZD_1
JMPLZ
PRACTISE:
MOVDH,4
MOVDL,1
LOOP1:
MOVTODH,DL
PRINT'',0
INCDL
CMPDL,46
JBLOOP1
MOVDH,2
MOVDL,1
MOVTODH,DL
MOVAH,0
INT1AH
MOVAL,DL;随机生成字母
CONT_1:
CMPAL,7EH
JACONT
CMPAL,21H
JBCON
JMPCONTI
CONT:
SUBAL,7EH
JMPCONT_1
CON:
ADDAL,20H
JMPCONT_1
CONTI:
MOVCX,45
MOVAH,9
MOVB