武汉理工大学微机原理课设.docx
《武汉理工大学微机原理课设.docx》由会员分享,可在线阅读,更多相关《武汉理工大学微机原理课设.docx(27页珍藏版)》请在冰点文库上搜索。
![武汉理工大学微机原理课设.docx](https://file1.bingdoc.com/fileroot1/2023-7/14/b433e6e6-9fd3-4957-846c-21aad79706c7/b433e6e6-9fd3-4957-846c-21aad79706c71.gif)
武汉理工大学微机原理课设
课程设计任务书
学生姓名:
马雄专业班级:
电气1003班
指导教师:
徐腊梅工作单位:
自动化学院
题目:
计算器设计
初始条件:
1.计算器设计
实现一个计算程序,能实现加、减的计算:
执行时,在文件名后直接跟上计算表达式,如在命令提示符下执行,结果十进制在屏幕上显示
C:
\MASM\js6+7
时间安排:
任务
时间(天)
审题、查阅相关资料
1
分析、计算
3
编写程序
1
撰写报告
2
论文答辩
0.5
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
目录
1总体方案论证2
2程序流程图及其说明3
2.1程序流程图3
2.2流程图说明5
3软件设计5
3.1字符输入及存储设计5
3.2加减法运算的判断设计6
3.3加减法运算的设计7
3.3.1数据的提取7
3.3.2加法运算7
3.3.3减法运算9
3.4结果输出设计12
4程序调试12
5心得体会14
参考文献15
附录15
简易计算器汇编语言程序设计
1总体方案论证
该课程设计的任务是做一个简易计算器,可以对两个二位数进行加法和减法运算,例如11+23=34。
我们平常的学习中做过给出两个数进行加减法运算的题目,但是这个题目难点在于这两个要做运算的数未知,是由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个二位数进行运算,而且做的是加法运算还是减法运算也未知,所以我们还要判断这个运算为加法运算还是减法运算。
另外运算过程中的进位借位,选择什么方式进行输出,如何实现清屏等也是要解决的问题。
首先我们要解决的是输入时是用INT21H的10号功能调用还是用INT21H的1号功能调用来进行输入。
若是用10号功能调用则我们进行多字符输入,可以将输入的字符都存储到一个数据区里面,并调用9号功能调用输出存进去的字符,这种输入和输出的方案是可行的。
我选择的是利用1号功能调用来输入,即把单个字符一个个的输入并存储到一个数据区里。
我们要做的是两个二位数的运算,先认定输入的格式为ab+cd=或者ab-cd=,当然如果输入不是这样的格式计算出来的结果就不一定是我们想要的结果了。
在存储的时候也是有选择的存储,当输入的并非格式里所要求的字符时则报错。
然后我们要判断是做加法运算还是减法运算,即判断输入的运算符是‘+’号还是‘-’号,因为输入的格式固定了,所以只需要把存进数据区的第三个字符拿来和‘+’号进行比较,若相等则进行加法运算,若不等则为减法运算。
在进行运算的过程中会想到到底如何对存进数据区的数据进行提取来作运算,一种方案是将‘+’号或‘-’号之前的两位数提取出来,当然要做一个10a+b的换算,同理将后两位按照这种方式提取出来,最后进行运算。
因为考虑到这种方式在运算时个位或十位进位或者借位的情形比较麻烦,所以我想到了把两个二位数的十位提取出来进行运算存到一个数据区里,个位也同时提取出来进行运算并存到该数据区,在这里把十位和个位拆开来进行运算再考虑进借位时就方便些,并且输出的时候也比较方便。
大致地数据提取和运算如图1所示
图1数据的提取运算示意图
由于运算过程中出现的进借位问题,会导致输出的结果为一位数,二位数,三位数或者是负数,所以在选择输出的方式时若是选9号功能调用会很不方便,因为9号功能调用要求有一个输出字符的缓冲区,由于输出的结果形式太多,缓冲区太难确定,而且若结果为负数,负号也得事先进行设置,所以单字符输出是一个合理的选择。
最后还要对这个简易计算器进行功能完善,例如为了使程序符合我们使用者的操作习惯,我们可以添加按回车键换行输入,即当键入回车键后,可以换行重新输入;可以设置按C或c键清屏,当键入C或c键时,清除整个屏幕上的输入和输出的字符并可以重新输入并运算;当按下Q或q键退出程。
2程序流程图及其说明
2.1程序流程图
2.2流程图说明
该程序流程图简要地表现出了所要实现的功能以及一些功能的大概算法,同时也是我编写的程序的一个总体的框架。
通过流程图,可以看出程序开始运行时,首先输出提示语句,再输入字符,并判断输入的字符是否为Q或q,若是,则退出,不是则继续输入;判断输入的字符是否为C或c,若是,则清屏重新输入,否则继续输入;判断输入的是不是回车键,若是就回车换行输入,不是则继续输入;判断输入的是否为0~9,+,-,=这些字符,若不是会报错,是则将其存储到定义的数据区BUFF里面,再判断如果输入的不是=功能键,则继续输入,若是,则判断是做加法运算还是减法运算,最后输出结果,并重新输入,继续上面的步骤。
3软件设计
3.1字符输入及存储设计
利用INT21H的1号中断一个一个地输入字符,并将输入地字符和Q,q比较,若相等则退出程序,不等则与C,c比较,如果相等则清屏并重新输入,不等就判断输入的字符是否为0DH即回车键对应的ASCII码值,再看输入的是否为0~9,+,-,=这几个字符,若是则存储,若不是就在屏幕上输出错误提示,程序如下:
START1:
MOVAH,1;输入字符
INT21H
CMPAL,'Q';输入为Q或q时退出程序
JZEXIT
CMPAL,'q'
JZEXIT
CMPAL,'C';输入为C或c时清屏
JZQINGPING
CMPAL,'c'
JZQINGPING
CMPAL,0DH;输入回车键时,换行重新输入
JZHUANHANG
CMPAL,'+';输入的字符不为+,-,=,0到9的字符时则报错,并重新换行输入,是则存储
JNZLOOP1
JMPCUNCHU
LOOP1:
CMPAL,'-'
JNZLOOP3
JMPCUNCHU
LOOP2:
CMPAL,'0'
JBERROR
CMPAL,'9'
JAERROR
SUBAL,30H
JMPCUNCHU
LOOP3:
CMPAL,'='
JZLOOP4
JMPLOOP2
3.2减法运算的判断设计
由于输入字符的格式固定为两位数加两位数的格式,则只需把存在BUF数据区的第三个字符提出来并与加号的ASCII码值进行比较即可判断为加法过算还是减法运算了,若相等则为加法过算不等则为减法运算,具体程序实现如下:
PANDUAN:
;判断为加法还是减法运算
CMPBYTEPTR[BX+2],'+'
JZJIAFA;结果为零则为加法运算
JMPJIANFA;结果不为零则为减法运算
3.3加减法运算的设计
3.3.1数据的提取
可以将两个数的十位数提取出来作运算并存储到一个数据区里,然后将两个数的个位数提取出来作运算存储到该数据区,如下程序段落所示为把两数的十位数分别取出
LEABX,BUF
MOVDL,BYTEPTR[BX];提取两个数的十位的数据
MOVAL,BYTEPTR[BX+3]
同理,把两个数的个位数提取出来,如下
MOVDL,BYTEPTR[BX+1];提取两个数的个位的数据
MOVAL,BYTEPTR[BX+4]
3.3.2加法运算
判断为加法运算并分别提取加数和被加数个位数和十位数之后,就要进行运算了,因为要虑到运算过程中的进位,如个位进位以及十位进位,还要考虑到结果为两位数或三位数的输出情况,所以在运算时要分别判断个位是否进位,进位则进行个位进位调整,十位是否进位,进位则进行十位进位调整。
具体程序实现如下:
JIAFA:
LEABX,BUF
MOVDL,BYTEPTR[BX+1]
MOVAL,BYTEPTR[BX+4]
ADDAL,DL
CMPAL,10
JAETZ1
ADDAL,30H
MOV[SI+1],AL
MOVDL,BYTEPTR[BX]
MOVAL,BYTEPTR[BX+3]
JMPBACK1
BACK1:
ADCAL,DL
CMPAL,10
JAETZ10
ADDAL,30H
MOV[SI],AL
JCDATA3
JMPDATA2
BACK10:
MOV[SI],AL
JCDATA3
JMPDATA2
TZ10:
SUBAL,10;十位相加有进位的处理
ADDAL,30H
STC
JMPBACK10
TZ1:
SUBAL,10;个位相加有进位的处理
ADDAL,30H
MOV[SI+1],AL
MOVDL,BYTEPTR[BX]
MOVAL,BYTEPTR[BX+3]
INCAL
JMPBACK1
3.3.3减法运算
判断为减法运算并分别提取减数和被减数个位数和十位数之后,就要进行减法运算了,减法运算时比较复杂,要考虑个位的借位,十位的借位,以及结果为正数时两位数和一位数结果的输出同时还要考虑到结果为负数时输出,结果为一位数的负数输出和结果为两位数的负数输出几种情况。
首先我们将减数和被减数的十位进行比较,如果减数的十位数字大于被减数的十位数则结果为正数,若小于则为负数,若相等再比较个位数的大小,在结果为正数的情况下考虑输出为一位数还是两位数,若有借位则进行相应的调整;在结果为负数的情况下,考虑输出为一位数还是两位数,同样要对产生借位的进行处理;若十位数相等则考虑输出结果为零或正的一位数及负的一位数。
具体的程序如下:
JIANFA:
LEABX,BUF
MOVDL,BYTEPTR[BX];提取被减数和减数十位的数据
MOVAL,BYTEPTR[BX+3]
CMPAL,DL
JZCOMP1
JAFU
JMPZHENG
ZHENG:
LEASI,JIEGUO;结果为正数的运算
LEABX,BUF
MOVDL,BYTEPTR[BX+1;提取被减数和减数个位的数据
MOVAL,BYTEPTR[BX+4]
CMPDL,AL
JBJIEWEI1
SUBDL,AL
MOVAL,DL
ADDAL,30H
MOV[SI+1],AL
MOVDL,BYTEPTR[BX];提取被减数和减数十位的数据
MOVAL,BYTEPTR[BX+3]
JMPSUB1
SUB1:
SUBDL,AL
MOVAL,DL
ADDAL,30H
MOV[SI],AL
CMPAL,0
JZDATA1
JMPDATA2
JIEWEI1:
;借位处理
ADDDL,10
SUBDL,AL
MOVAL,DL
ADDAL,30H
MOV[SI+1],AL
MOVDL,BYTEPTR[BX;提取被减数和减数十位的数据
MOVAL,BYTEPTR[BX+3]
SUBDL,1
JMPSUB1
COMP1:
LEASI,JIEGUO
LEABX,BUF
MOVDL,BYTEPTR[BX+1]
MOVAL,BYTEPTR[BX+4]
CMPAL,DL
JZZERO
JAFU1
JBZHENG1
ZHENG1:
SUBDL,AL
MOVAL,DL
ADDAL,30H
MOV[SI+1],AL
JMPDATA1
FU1:
SUBAL,DL
ADDAL,30H
MOV[SI+1],AL
JMPFUSHU1
FU:
LEASI,JIEGUO;结果为负数的运算
LEABX,BUF
MOVDL,BYTEPTR[BX+1]
MOVAL,BYTEPTR[BX+4]
CMPAL,DL
JBFU_1
SUBAL,DL
ADDAL,30H
MOV[SI+1],AL
MOVDL,BYTEPTR[BX]
MOVAL,BYTEPTR[BX+3]
SUB2:
SUBAL,DL
ADDAL,30H
MOV[SI],AL
CMPAL,30H
JZFUSHU1
JMPFUSHU2
FU_1:
;借位处理
ADDAL,10
SUBAL,DL
ADDAL,30H
MOV[SI+1],AL
MOVDL,BYTEPTR[BX;提取被减数和减数十位的数据
MOVAL,BYTEPTR[BX+3]
SUBAL,1
JMPSUB2
3.4结果输出设计
最终结果的输出采用的是INT21H的9号功能调用,考虑到输出结果的形式很复杂,所以对于输出的结果分了好几种情况,例如结果为正数时的一位,二位,三位数的输出,结果为负数时的一位,二位输出以及零的输出几种情况,尤其是对于三位数的输出和负数的输出,可以分别在结果前面直接加一个‘1’和一个‘-’号。
具体的程序见附录
4程序调试
运行程序后,进入程序运行初始界面,会有一个作两位数加减法运算,输入等号后才输出结果的提示语句,如图1
图1程序运行初始界面
不是0~9,+,-,=号时,例如输入一个w,程序会有报错提示,并提示重新输入,运行界面如图2所示
图2出错并重新运行界面
当两个数运算无进位和借位时,一共有三种可能的情况,作加法运算时个位和十位均无进位,以及减法过算时个位和十位均无借位且输出为一位数和两位数的情况,运行结果如图3所示
图3没有进借位的运行界面
经检验,这三种可能情况下的所有运行结果都正确
当两个数运算个位有进借位时,其运行情况如图4所示,有加法和减法运算个位进借位的两种情况。
图4个位有进借位的运行界面
经检验运行后程序输出的结果正确
当两个数运算十位有进借位时,若是加法运算即结果一定是三位数,且百位为1的情况,加是减法运算,则分输也为一位和两位的两种情况,程序的运行界面如图5
图5十位有进借位的运行界面
经检验运行后程序输出的结果正确
当两个数运算个位和十位均有进借位时一共有如下三种情形,其运行界面如图6所示
图6个位和十位均有进借位的运行界面
经检验所有输出结果都正确
当输入C或c时则清屏,程序运行后清除整个窗口内输入和输出的字符并可以继续输入并计算。
如图7所示
图7清屏后的运行界面
经调试,基本上任务要求设计的所有功能都实现,调试出的计算结果均正确
5心得体会
两周的课程设计结束了,给我的总体感觉就是忙碌但充实,而且真正学到了东西。
以前做课程课计的时候总是前几天时间玩,后面几天才开始做,不过这次却是一直都在做这个课程设计,因为在网上我根本搜不到别人写的简易计算机的资料,所以从构思到设计流程图到编写源程序都是我一个人独立完成的,虽然这个过程比较痛苦,但是我真正的去体验了,当我编写的程序一遍一遍地报错,出的结果一次次和正确结果有出入的时候我真的好想放弃,但是我选择了坚持,通过调试程序,一步步地看寄存器和数据区的变化,最终发现了错误并改正了错误,当运行的结果全都正确的时候我真的好激动,好有成就感,因为这是我第一次自己独立地编写的长达两百多条的程序,虽然结构看上去有点乱,语句不够精练,但是不管怎样,我终于能够实现要求的功能了。
这次虽然在网上没有搜到什么资料,但是我还是学会了更好地利用资源——身边的高手,研究生学长,还有课本。
身边的高手以及学长都在我编程的过程中给了我很多很好的建议,让我在山重水复疑无路时,突然柳暗花明又一村。
而书本是我最好的帮手,有任何编程细节不太清楚的,我就去翻书,一般都能在书中找到答案,所以我认为万变不离其宗这句话是很正确的,不管老师给我们的任务如何难或复杂,也都是由书本上介绍的一条条简单的程序构成的,例如我的程序虽然长,有两百多条语句,但是却可以将其拆分成多个小块,每个小块其实都是一个最基础的小程序,并能实现一个功能,最后组合起来就实现了任务要求的比较复杂的功能了。
另外,这次无论是设计个这程序还是写课程设计报告都让我学到了好多东西,有对课本知识更加深入的了解和掌握,也有对于流程图的设计以及绘制还有word的一些用法和排版等,都让我受益匪浅,
总之,非常感谢学校和老师给我们安排了这次课程设计,不仅让我掌握了更多的知识,还让我领会到要把一件事情做好并真正有所收获还得靠自己独立地去完成并坚持不懈!
希望在以后的学习中还能多搞几次这种课程设计。
参考文献
[1]周佩玲、彭虎、傅忠谦.微机原理与接口技术(基于16位机).北京:
电子工业出版社.,2005
[2]马春燕.微机原理与接口技术(基于32位机)实验与学习辅导.北京:
电子工业出版社.,2007
[3]何小海、严华.微机原理与接口技术.北京:
科学出版社,2006
[4]钱晓捷.新版汇编语言程序设计.北京:
电子工业出版社,2007
[5]黄海萍.汇编语言与微机接口技术实验教程.北京:
国防工业出版社.2007
附录
完整的程序代码如下:
DATASEGMENT
BUFFDB6DUP(?
)
JIEGUODB3DUP(?
)
COUNTEQU6
TISHIDB'Theadditionandsubtractionoperationsoftwotwo-digit',0DH,0AH,'Input"=",thenoutputtheresult:
',0DH,0AH,'$'
ERROR1DB0DH,0AH,'Inputerror!
',0DH,0AH,'Pleaseinputagain!
',0DH,0AH,'$'
HUICHEDB0DH,0AH,'$'
TUICHUDB'Pleasepressanykeytocontinue!
','$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEADX,TISHI
MOVAH,9
INT21H
LEASI,JIEGUO
LEABX,BUFF
START1:
MOVAH,1
INT21H
CMPAL,'Q';输入为Q或q时退出程序
JZEXIT
CMPAL,'q'
JZEXIT
CMPAL,'C';输入为C或c时清屏
JZQINGPING
CMPAL,'c'
JZQINGPING
CMPAL,0DH;输入回车键换行重新输入
JZHUANHANG
CMPAL,'+';输入的字符不为+,-,=,0到9的字符时,则报错,并重新换行输入,是则存储
JNZLOOP1
JMPCUNCHU
HUANHANG:
LEADX,HUICHE;实现换行的功能
MOVAH,9
INT21H
JMPSTART1
ERROR:
LEADX,ERROR1
MOVAH,9
INT21H
JMPSTART1
CUNCHU:
;对输入的字符进行存储
MOV[BX],AL
INCBX
JMPSTART1
LOOP1:
CMPAL,'-'
JNZLOOP3
JMPCUNCHU
LOOP2:
CMPAL,'0'
JBERROR
CMPAL,'9'
JAERROR
SUBAL,30H
JMPCUNCHU
LOOP3:
CMPAL,'='
JZLOOP4
JMPLOOP2
LOOP4:
;判断为加法还是减法运算
XORBX,BX
LEABX,BUFF
MOVCX,COUNT
PANDUAN:
CMPBYTEPTR[BX+2],'+'
JZJIAFA
JMPJIANFA
JIAFA:
LEABX,BUFF
MOVDL,BYTEPTR[BX+1];提取两个加数个位的数据
MOVAL,BYTEPTR[BX+4]
ADDAL,DL
CMPAL,10
JAETZ1
ADDAL,30H
MOV[SI+1],AL
MOVDL,BYTEPTR[BX];提取两个加数十位的数据
MOVAL,BYTEPTR[BX+3]
JMPBACK1
BACK1:
ADCAL,DL
CMPAL,10
JAETZ10
ADDAL,30H
MOV[SI],AL
JCDATA3
JMPDATA2
BACK10:
MOV[SI],AL
JCDATA3
JMPDATA2
TZ10:
SUBAL,10;十位相加有进位的处理
ADDAL,30H
STC
JMPBACK10
TZ1:
SUBAL,10;个位相加有进位的处理
ADDAL,30H
MOV[SI+1],AL
MOVDL,BYTEPTR[BX]
MOVAL,BYTEPTR[BX+3]
INCAL
JMPBACK1
JIANFA:
LEABX,BUFF
MOVDL,BYTEPTR[BX];提取被减数和减数十位的数据
MOVAL,BYTEPTR[BX+3]
CMPAL,DL
JZCOMP1
JAFU
JMPZHENG
ZHENG:
LEASI,JIEGUO;结果为正数的运算
LEABX,BUFF
MOVDL,BYTEPTR[BX+1];提取被减数和减数个位的数据
MOVAL,BYTEPTR[BX+4]
CMPDL,AL
JBJIEWEI1
SUBDL,AL
MOVAL,DL
ADDAL,30H
MOV[SI+1],AL
MOVDL,BYTEPTR[BX];提取被减数和减数十位的数据
MOVAL,BYTEPTR[BX+3]
JMPSUB1
SUB1:
SUBDL,AL
MOVAL,DL
ADDAL,30H
MOV[SI],AL
CMPAL,0
JZDATA1
JMPDATA2
JIEWEI1:
;借位处理
ADDDL,10
SUBDL,AL
MOVAL,DL
ADDAL,30H
MOV[SI+1],AL
MOVDL,BYTEPTR[BX];提取被减数和减数十位的数据
MOVAL,BYTEPTR[BX+3]
SUBDL,1
JMPSUB1
COMP1:
LEASI,JIEGUO
LEABX,BUFF
MOVDL,BYTEPTR[BX+1]
MOVAL,BYTEPTR[BX+4]
CMPAL,DL
JZZERO
JAFU1
JBZHENG1
ZHENG1:
SUBDL,AL
MOVAL,DL
ADDAL,30H
MOV[SI+1],AL
JMPDATA1
FU1:
SUBA