键盘录入数据的转换与显示概要.docx
《键盘录入数据的转换与显示概要.docx》由会员分享,可在线阅读,更多相关《键盘录入数据的转换与显示概要.docx(45页珍藏版)》请在冰豆网上搜索。
键盘录入数据的转换与显示概要
课程设计任务书
学生姓名:
专业班级:
指导教师:
工作单位:
题目:
键盘录入数据的转换与显示(有拓展任务)
初始条件:
掌握汇编语言程序设计方法,所设计的程序运行后可通过键盘控制,满足系统功能,并实现该系统设计方案。
在DOS,windows,汇编软件环境下运行。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
本程序能从键盘读入二个五位十进制数(1位符号位+4位数值位),并将这二个十进制数分别转换为二进制数,然后求其和,再将和以十进制形式进行显示。
2.课程设计说明书应包括:
a)设计任务及要求
b)方案比较及认证
c)程序设计基本思想,程序流程图,部分源程序及注解
d)调试记录及结果分析
e)参考资料
f)附录:
全部源程序清单
g)总结
时间安排:
2013年元月07日--元月09日选题、查阅资料和方案设计
2013年元月10日--元月14日编程
2013年元月15日--元月16日调试程序,改进与提高
2013年元月17日撰写课程设计报告(有调试过程及结果的截屏)
2013年元月18日答辩和交课程设计报告
指导教师签名:
2013年元月18日
系主任(或责任教师)签名:
年月日
目录
1设计任务及要求分析1
1.1设计任务1
1.2要求分析1
2各模块原理框图2
2.1基础任务流程图2
2.2拓展任务一流程图3
2.3拓展任务二流程图4
2.4拓展任务三流程图5
3系统模块详细设计与调试6
3.1基础任务的设计6
3.1.1输入两个数据6
3.1.2两个二进制数求和并显示和6
3.1.3十进制数转换成二进制数:
7
3.1.4二进制数转换为十进制数:
8
3.1.5程序调试结果9
3.2拓展任务一设计9
3.3拓展任务二设计11
3.3.1主程序模块.11
3.3.2赋权宏模块.11
3.3.3加减乘除运算子程序模块.11
3.3.4调用赋权宏子程序模块.12
3.3.5清屏子程序模块.12
3.3.6回车换行宏模块.12
3.3.79号功能显示字符串宏模块.12
3.3.8程序调试结果图12
3.4拓展任务三设计13
3.5调试结果分析15
5心得体会16
参考文献18
附录一源程序及注释19
本科生课程设计成绩评定表32
键盘录入数据的转换与显示
摘要:
本次微机原理课程设计题目是将二个五位十进制数转化为二进制后相加后再转化为十进制输出。
这次程序是运行于硬件和DOS操作系统下的,本程序通过调用DOS下的基本输入输出中断,实现数据的输入和输出。
程序中有两个子程序,分别负责将十进制数转化为二进制数和二进制转化为十进制。
最后调用DOS输出中断显示在屏幕上,最后看用户是否输入的是Q或者q,若是则程序结束,若不是则程序循环。
因为答辩过程中老师认为设计任务较为简单,于是我们组一起研究出了一些拓展功能:
比如输入字母的大小写转换和输入数字的四则运算,让我们本次课程设计学到更多的知识。
关键词:
ASCII码二进制DOS调用中断数据输入
1设计任务及要求分析
1.1设计任务
基础任务:
从键盘读入二个五位十进制数(1位符号位+4位数值位),并将这二个十进制数,分别转换为二进制数,然后求其和,再将和以十进制形式进行显示。
按Q退出程序。
拓展任务:
(1)输入一堆字符串字母,能将其中小写字母变为大写字母,大写字母不变;
(2)输入的数字可进行加减乘除四则运算得到结果。
(3)对输入的两串字符串进行匹配判断。
1.2要求分析
从设计任务中可以看出此次课设要求是:
从键盘中输入两个五位十进制数(格式如-1234、+2012等),显然通过键盘输入的此类十进制数实际上输入的是对应字符的ASCII码,若想求两个数的和必须先将这两个数对应的二进制数求出,然后再求其和,求和完成后将二进制数再转换成对应的十进制数用显示器输出,完成两个五位十进制数的求和然后以十进制的形式显示。
而拓展任务一字母大小写转换则是将输入字符串中的小写字母识别出来并加上一定数使其变为大写,大写字母则不变化;拓展二任务是将输入两个数据进行四则运算,可以对运算法则进行选择最后输出结果;拓展任务三则是将输入字符串的每个字母进行比较,若全部相同则匹配,若有一个不相同就输出不匹配信息。
2各模块原理框图
2.1基础任务流程图
图2-1基础任务流程图
2.2拓展任务一流程图
图2-2拓展任务一流程图
2.3拓展任务二流程图
图2-3拓展任务二流程图
2.4拓展任务三流程图
图2-4拓展任务三流程图
3系统模块详细设计与调试
3.1基础任务的设计
3.1.1输入两个数据
MOVAH,09H
INT21H
通过调用DOS系统的01H号功能——键入字符并回车来实现,其出口参数为键入字符的ASCII码,存在AL中
DATASEGMENT
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETINPUT1
MOVAH,9;多字符输出到屏幕
INT21H;提示输入一个数
MOVDX,OFFSETIN_ASC_BUF
MOVAH,0AH;多字符输入
INT21H;读取第一个数
CALLASC_TO_BIN;转换第一个数为二进制
MOVB_BUF1,AX;保存第一个数
MOVDX,OFFSETINPUT2
MOVAH,9
INT21H;提示输入一个数
MOVDX,OFFSETIN_ASC_BUF
MOVAH,0AH
INT21H;读取第二个数
CALLASC_TO_BIN;转换第二个数为二进制
3.1.2两个二进制数求和并显示和
显示结果:
MOVAH,09H
MOVDX,OFFSETOUT_ASC_SUM
INT21H
将结果存入数据段中定义的缓冲区OUT_ASC_SUM中,再通过调用DOS系统的09H号功能——显示字符串(串尾字符为$,但不显示)来完成。
ADDAX,B_BUF1;计算这二个数之和
CALLBIN_TO_ASCII;将和转换为ASCII码,以供显示用
MOVDX,OFFSETOUTPUT
MOVAH,9;多字符输出
INT21H
MOVDX,OFFSETOUT_ASC_SUM;将二个数的和转换为ASCII码后放于此处,
;以供9号调用显示
MOVAH,9
INT21H;输出总和
MOVDX,OFFSETQUIT
MOVAH,9
INT21H
MOVAH,1
INT21H
CMPAL,'Q';是否输入Q
JZOVER
CMPAL,'q';是否输入q
JZOVER
JMPSTART
OVER:
MOVAH,4CH;结束
INT21H
3.1.3十进制数转换成二进制数:
入口:
十进制数的ASCII码在IN_ASC_BUF内
出口:
转换后的二进制数在AX内
算法:
先将其转换成十进制数字,再用累加和乘10加X的方法变成二进制数,如将358转换为二进制数,可先将累加和赋0,再计算(((0*10+3)*10+5)*10+8),结果为二进制数,再由符号位决定是否需要求补。
ASC_TO_BINPROC
MOVCL,IN_ASC_BUF+1;取字符个数
MOVCH,0
DECCL;扣除符号位
MOVBX,OFFSETIN_ASC_BUF+3;调整BX指向十进制数的最高位
PUSHBX
PUSHCX
L1:
MOVAL,[BX]
ANDAL,0FH
MOV[BX],AL
INCBX
LOOPL1;将所有数字字符的高四位清0
POPCX
POPBX
MOVAX,0;累加和赋初值
MOVSI,10
L2:
MULSI
ADDAL,[BX]
ADCAH,0
INCBX
LOOPL2;累加乘10
CMPIN_ASC_BUF+2,'+'
JZL3;符号是正号,转移
NEGAX;符号是负号,求补
L3:
RET
ASC_TO_BINENDP
3.1.4二进制数转换为十进制数:
入口:
二进制数在AX内
出口:
转换后的ASCII码在OUT_ASC_SUM变量内
算法:
AX中的数范围在+32767到-32768之间,先检查AX中的符号位,以决定输出“+”还是“-”,若是负数,应先求补,得到原码后即可与正数作统一处理。
转换方法为将被转换的二进制数先除以10000,商;即为万位数,再将余数除以1000,商为千位数,以此类推,求出百、十位数,剩下的为个位数。
最后,将各个数加上30H,即成为对应字符。
BIN_TO_ASCIIPROC
MOVOUT_ASC_SUM,'+'
CMPAX,0
JGEL4;不是负数,转移
NEGAX
MOVOUT_ASC_SUM,'-'
L4:
CWD
MOVBX,10000
DIVBX
ADDAL,30H
MOVOUT_ASC_SUM+1,AL;保存万位数字
MOVAX,DX;将余数置入AX内,以便当作被除数
CWD
MOVBX,1000
DIVBX
ADDAL,30H
MOVOUT_ASC_SUM+2,AL;保存千位数字
MOVAX,DX;将余数置入AX内,以便当作被除数
MOVBL,100
DIVBL
ADDAL,30H
MOVOUT_ASC_SUM+3,AL;保存百位数字
MOVAL,AH
CBW
MOVBL,10
DIVBL
ADDAL,30H
MOVOUT_ASC_SUM+4,AL;保存十位数字
ADDAH,30H
MOVOUT_ASC_SUM+5,AH;保存个位数字
RET
BIN_TO_ASCIIENDP
3.1.5程序调试结果
如图所示:
图3-1基础任务程序调试结果
3.2拓展任务一设计
可以输入任意长度大小写或大小写混合字符串,并转换成纯大写或小写字符串
DATASSEGMENT;数据段
DATA1DB100DUP(?
)
STRING1DB0DH,0AH,'$'
STRING2DB'PLEASEINPUTSTRING:
',0DH,0AH,'$'
STRING3DB'THERESULT=',0DH,0AH,'$'
DATASENDS
STACKSSEGMENTSTACK;堆栈段
DW128DUP(?
);注意这里只有128个字节
STACKSENDS
CODESSEGMENT;代码段
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS;初始化
MOVDS,AX
MOVES,AX
MOVBX,0
LEADX,STRING2;提示输入
MOVAH,09
INT21H
INPUT:
MOVAH,01;输入字符放在AL中
INT21H
CMPAL,0DH
JEHUANHAN
CMPAL,5BH
JNCCHANGE
MOVDATA1[BX],AL;AL中的字符存入DATA1的第BX位
INCBX
LOOPINPUT
CHANGE:
SUBAL,20H;小写转大写
;ADDAL,20H
MOVDATA1[BX],AL
INCBX
JMPINPUT
HUANHAN:
LEADX,STRING1;换行,回车
MOVAH,09
INT21H
LEADX,STRING3;提示输出
MOVAH,09
INT21H
SHUCHU:
MOVDATA1[BX],'$'
LEADX,DATA1;把字符串的首地址放进DX
MOVAH,09;输出DATA1中已经改变了的字符串
INT21H
CODESENDS
ENDSTART
输入程序后结果如图:
图3-2大小字母转换运行结果图
3.3拓展任务二设计
3.3.1主程序模块.
主程序模块首先实现调用子程序clear清屏,初始化数据段,加载附加段,调用显示宏show显示界面,将寄存器ax,bx,cx,dx初始化赋初值为0,调用回车换行宏,输入字符或数字并判断,调用子程序dyfq调用赋权宏fq为符号赋权,从而判断优先级,调用加减乘除运算子程序ys对判断出的相应运算符进行运算,输出运算结果,判断是否继续,继续则返回输入,不继续则退出程序.
3.3.2赋权宏模块.
通过定义宏fq,定义了变元a,b进行参数传递,并使用替换运算符&使变元a与标号s对应.接着给对应的符号赋予权值,将其权值存入ch中.
3.3.3加减乘除运算子程序模块.
运算模块实现了将ax入栈保存,然后将ax,bx赋值为0,判断cl中的符号是否为乘号*,若为乘号*则将number中的数字与其下一位的数字相乘,并把结果存入该位置,类似的若不为乘号*则接着判断是否为除号/,若为除号/则进行除法运算,然后判断是否为加法,为加法则进行加法运算,接着判断是否为减法,为减法则进行减法运算并将结果存入当前的计算的第二个数的位置.
3.3.4调用赋权宏子程序模块.
该模块实现了调用赋权宏fq为(,),*,/,+,-,=等符号分别赋权值为5,1,4,4,3,3,0.从而可以通过设定的权值来判断优先级.
3.3.5清屏子程序模块.
本模块先将即将用到的ax,bx,cx,dx寄存器入栈保存,通过ah=06h屏幕上卷功能,用bh=07h将屏幕设置为黑底白字格式,给dh,dl赋值将其清屏位置设定在30行80列范围.从而实现了清屏功能,然后再将ax,bx,cx,dx寄存器出栈.
3.3.6回车换行宏模块.
通过2号功能的输出功能,将0dh赋予dl输出,再调用2号功能,将0ah赋予dl输出,从而实现回车换行功能.
3.3.79号功能显示字符串宏模块.
通过定义宏show,用9号显示功能,通过变元str将字符串显示出来.
3.3.8程序调试结果图
如图所示:
图3-3输入数据四则运算结果图
3.4拓展任务三设计
字符串匹配设计:
CRLFMACRO;显示回车
MOVDL,0DH
MOVAH,02H
INT21H
MOVAH,02H
MOVDL,0AH
INT21H
ENDM
DATASEGMENT
MESS1DB'MATCH',0DH,0AH,'$'
MESS2DB'NOMATCH',0DH,0AH,'$'
MESS3DB'INPUTSTRING1!
',0DH,0AH,'$'
MESS4DB'INPUTSTRING2!
',0DH,0AH,'$'
MAXLEN1DB100
STRING1DB100DUP(?
)
MAXLEN2DB100
STRING2DB100DUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVAH,09H
MOVDX,OFFSETMESS3
INT21H;显示提示信息1
MOVAL,MAXLEN1
MOVBX,OFFSETSTRING1
MOV[BX],AL;最大字符缓冲
MOVAH,0AH
MOVDX,OFFSETSTRING1
INT21H;接收键入的字符串1
CRLF
MOVAH,09H
MOVDX,OFFSETMESS4
INT21H;显示提示信息2
MOVAL,MAXLEN2
MOVBX,OFFSETSTRING2
MOV[BX],AL;最大字符缓冲设置
MOVAH,0AH
MOVDX,OFFSETSTRING2
INT21H;接收键入的字符串2
CRLF
CLD
LEASI,STRING1;字符串1的地址送给SI
MOVCL,[SI+1];字符串1的字符数送给CX
MOVCH,0
BEING:
LEADI,STRING2;字符串2的地址送给DI
MOVDL,[DI+1];字符串2的字符数送给DX
MOVDH,0
J1:
MOVAL,[SI+2];字符串1的第一个字符在字符串2中匹配
CMP[DI+2],AL
JEJ3;匹配成功则跳转
J2:
INCDI;指向字符串2下一个字符
DECDX
JZNOMAT;字符串2完,不匹配
JMPJ1;字符串2没完,重新匹配
J3:
DECCX
JZMATCH;字符串1完,匹配
DECDX
JZNOMAT;字符串2完,不匹配
INCSI;指向串1下一个字符
INCDI;指向串2下一个字符
MOVAL,[SI+2]
CMP[DI+2],AL
JEJ3;匹配,跳转
DECDX
JZNOMAT;字符串2完,不匹配
LEASI,STRING1;重新从串1的第一个字符匹配
MOVCL,[SI+1]
MOVCH,0
JMPJ1
MATCH:
MOVAH,09H;输出匹配信息
MOVDX,OFFSETMESS1
INT21H
JMPNEXT
NOMAT:
MOVAH,09H;输出不匹配信息
MOVDX,OFFSETMESS2
INT21H
NEXT:
MOVAH,4CH;程序终止
INT21H
CODEENDS
ENDSTART
输入程序后调试结果如图:
图3-4字符串匹配问题输出结果
3.5调试结果分析
从图3-1到3-4可以看出,程序运行结果完全满足预期要求。
但是在程序的调试过程中还是出现了许多的问题:
第一,输出结果产生闪退,但我们细心检查每一个error的部分然后在网上查阅了大量资料,知道了在程序尾部的中断命令经常会引起程序闪退,找到根源后调整尾部命令即可使程序顺利运行。
第二,输入的字符非Q、q时,程序也会结束。
在和Q、q比较的程序段之后、过程终止程序段之前加上jmpstart语句,即正常了。
第三,在使用复制操作DUP时,未将复制数目与DUP用空格分隔开,导致运行错误。
第四,进行CALL指令调用子程序时,容易遗漏在CALL后的RET指令,导致运行时出现错误。
第五,在使用条件转移指令jz时,发现不能生成obj文件,经检查发现jz与要调用的程序距离太远,把二者距离拉近后问题得到解决。
调试过程截图如下所示:
图3-5因缺少ret产生错误
图3-6找到错误行并加上ret后正常运行
图3-7程序发生闪退时加上JMP语句解决
5心得体会
在这次微机原理与接口技术课程设计过程中,我所选的课题是“键盘录入数据的转换与显示程序设计”。
最开始看完设计要求后,通过查书和上网找资料选择所需的汇编程序,将每一块的设计要求转换成能够实现其功能的模块汇编语句,然后合在一起完成整个程序的设计,最后通过计算机中的MF2KP软件对该汇编程序进行调试运行,得到了所要的结果。
但第二天去跟老师答辩的过程中我发现我们的题目过于简单,其实在键盘输入这一块还可以往多方面延伸拓展其他功能使其变得丰富一些,于是我们又继续研究除输入数字整数求和外的其他功能,最后终于延伸了三个拓展功能,分别是输入数据的加减乘除四则运算,输入字符串的匹配与否和输入字母的大小写转换。
在将模块程序进行整合的过程中,由于每一块所用语句中的操作数有些不同,因而在运行的出现了不少错误,但是我们并没有泄气而是根据提示所在错误行一条条对源程序进行修改,修改之后再进行运行,还是出错,只能再次回到源程序进行修改,不仅仅要看出错的那一行,还要联系前后找出错误的根源。
经过这样的一次次编译修改,最终才没有错误出现。
然后根据提示输入数据,得出正确的结果。
总体来说,在整个的课程设计过程中,我又重新巩固了微机原理与接口技术这门课程的许多知识,包括数据的转换、DOS的调用和字符串大小写的转化等等。
虽然平时理论学习已经接触了许多类似这样的题目,但是真正动手做起来还是感觉完全不一样,并不是写写画画就能完成,而是真正将程序输入软件中不断调试找出错误得到最终结果,在看似简单的过程中收获了许多以往课本上学不到的经验和知识。
对于MFPCI98这个汇编软件我本来有了一定的熟悉和了解,知道如何来操作它,通过它来实现汇编语句的功能。
在这次课程设计过程中,我将理论与实践结合,不仅仅是调用软件中已经存在的程序了,而是自己创建新文件再进行汇编。
通过这样的实践让我对所学的理论知识更加理解,更加明白。
因为只是通过学习课本上的知识,在实际应用中不能很好的运用,而借助这个软件我可以更好的运用,也能更好的锻炼自己。
参考文献
[1]周佩玲彭虎傅忠谦.微机原理与接口技术.北京:
电子工业出版社,2007
[2]冯继超.微机原理实验指导书.武汉:
武汉理工大学教材中心,2008
[3]李超.计算机三级PC技术.北京:
高等教育出版社,1994
[4]李亮.关于汇编语言的编程.北京:
北京大学出版社,2003
[5]周佩玲彭虎傅忠谦.微机原理与接口技术学习指导.北京:
电子工业出版社,2008
附录一源程序及注释
DATASEGMENT
INPUT1DB0AH,'PLEASEINPUTANUMBER(LESSTHAN5FIGURES):
$';输入A字符
INPUT2DB0AH,'PLEASEINPUTBNUMBER(LESSTHAN5FIGURES):
$';输入B字符
QUITDB0AH,'ENTERQORqTOQUIT:
$';退出程序
IN_ASC_BUFDB6;十进制数的输入缓冲区,共可接收6个字符
DB?
;保留,用于10号调用时DOS填入实际输入字符个数
DB6DUP(?
);一个符号位,四位数字ASCII码,加上一个回车符,共计6字符
B_BUF1DW?
;一个数转换为二进制后,放于此处
OUTPUTDB0AH,'THESUMIS:
','$'
OUT_ASC_S