微机原理简易计算器课程设计报告Word文档下载推荐.docx
《微机原理简易计算器课程设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《微机原理简易计算器课程设计报告Word文档下载推荐.docx(23页珍藏版)》请在冰豆网上搜索。
![微机原理简易计算器课程设计报告Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-12/10/dd673fc1-78a9-4480-b972-8648db80f49d/dd673fc1-78a9-4480-b972-8648db80f49d1.gif)
前言4
1、设计题目5
2、设计内容5
基本内容5
主要功能5
3、设计原理及方案6
总体方案6
程序流程图7
主程序7
计算子程序8
系统模块详细设计9
界面设置9
算法选择设置10
数制转换设置11
4.汇编源程序代码13
5、调试运行结果20
操作说明20
调试运行结果20
6、心得体会23
7、参考文献24
前言
课程设计是培养和锻炼学生在学习完本门课后综合应用所学理论知识,解决实际工程设计和应用问题的能力的重要教学环节。
它具有动手、动脑和理论联系实际的特点,是培养在校工科大学生理论联系实际、敢于动手、善于动手和独立自主解决设计实践中遇到的各种问题能力的一个重要教学环节。
计算器在我们日常生活中应用是相当普遍的,可以说它已经成为现代社会生活不可或缺的一部分。
本次课程设计就是根据微机原理与接口的相关知识,利用BIOS和DOS的中断来设计一个简易计算器,能够实现加减乘除四则运算,并在屏幕上显示一个主菜单,提示用户输入相应的数字键,分别执行加、减、乘、除四种计算功能和结束程序的功能。
同时利用BIOS中断的10号功能调用来设置显示方式,利用DOS中断的01号和02号子功能来完成键盘接收,结果显示。
通过本次课程设计,要求学生熟悉和掌握微机系统的软件的方法、设计步骤,使学生得到微机开发应用方面的初步训练,熟练应用8086汇编语言编写应用程序和实际设计中的软件调试方法和步骤,熟悉微机系统的软件开发工具的使用方法。
通过课程设计实践,不仅要培养学生事实求是和严肃认真的工作态度,培养学生的实际动手能力,检验学生对本门课学习的情况,更要培养学生在实际的工程设计中查阅资料,撰写设计报告表达设计思想和结果的能力。
:
1、设计题目
简易计算器
'
2、设计内容
基本内容
1、编写一个程序,能从键盘上读入数据,并完成加、减、乘、除的计算。
2、利用BIOS和DOS的中断来设计一个计算器,要求在屏幕上显示一个主菜单,提示用户输入相应的数字键,分别执行加、减、乘、除四种计算功能和结束程序的功能。
3、利用BIOS中断的10号功能调用来设置显示方式。
4、利用DOS中断的01号和02号子功能来完成键盘接收,结果显示。
主要功能
一、显示主菜单功能
)
主菜单如下:
Pleaseinputanumbertochoosethearithmeticoperation
1—add2—subtract3—multiply
4—divideq—returntoDOS
二、计算功能
1、别按数字键“1”、“2”、“3”,则执行相应子模块1、2、3,进行两个字节与两个字节的加法、减法和乘法运算,并在屏幕上显示运算结果。
2、按数字键“4”,执行子模块4,进行两个字节除一个字节的除法运算,并显示结果。
3、按字母键“q”,执行子模块5,程序退出,返回DOS。
4、若按其它键则显示提示字符串:
“PleasePressNumber1、2、3、4、q:
”,然后继续显示主菜单。
3、设计原理及方案
总体方案
利用BIOS中断的10号功能调用来设置显示方式。
利用DOS中断的01号、02号子功能来完成键盘接受、结果显示。
设置屏幕显示方式。
:
MOVAH,00H
MOVAL,NUM(NUM为显示方式属性字)
INT10H
接着从键盘上接受键值,并判别后转到相应的子模块进行运算,并显示结果。
MOVAH,01H
INT21H;
AL=键入字符的ASCII码
从键盘上接收一串字符串命令:
MOVAH,0AH
;
MOVDX,OFFSETBUF;
BUF为数据段中定义的数据缓冲区
INT21H
显示单个字符命令:
MOVAH,02H
显示一串字符串的命令:
MOVAH,09H
BUF为被显示字符串的首地址
】
十进制数显示过程:
将十进制数送到BX中,BX除以1000,余数送BX中,商在AL中,范围为0~9,显示AL中的内容。
BX除以100,余数送BX中,商在AL中,显示AL中的内容,依次类推,直到分出个位数字。
如最高位为0,则不应显示,而非最高位的0则显示。
可利用设标志位并结合商的方法来决定是否显示0。
程序流程图
3.2.1主程序
图主程序流程图
~
^
3.2.2计算子程序
图计算子程序流程图
系统模块详细设计
本次设计需要实现的模块图图如1所示
图模块图
(1)界面设置
主要实现确定界面样式的功能,以菜单形式显示。
(2)`
(3)算法选择设置
用于选择加、减、乘、除来进行运算。
(3)数制转换设置
应用十进制——二进制的转换算法来处理加、减、乘、除四则运算。
3.3.1界面设置
1、设置屏幕显示方式:
MOVAH,00H
MOVAL,2
"
通过调用BOIS的O2H号功能来设置屏幕显示方式。
此处AL=2,即设置屏幕显示方式为80*25黑白文本。
2、显示主菜单:
DOS不仅为用户提供了许多指令,而且还有用户可以直接调用的上百个常用子程序。
这些子程序的功能主要是进行磁盘读/写、基本输入/输出管理等。
在使用时,用户只需要了解各个子程序的编号即可,这些编号成为DOS功能调用号。
其调用过程为:
(1)DOS功能条用号送AH寄存器。
(2)如果需要,按要求给定输入参数(由得不需要输入参数)。
(3)写入中断指令“INT21H”。
调用结束,按功能使用其输出参数。
&
本程序主菜单显示代码如下:
MOVAH,09H
MOVDX,OFFSETTOP
INT21H
先在数据段中定义主菜单中要显示的字符串,再通过调用DOS系统的09H号功能——显示字符串(串尾字符为$,但不显示)来完成。
3.3.2算法选择设置
汇编语言中加减乘除运算指令分别为ADD、SUB、、MUL、DIV。
首先选择要进行的四则运算,规定:
若选择1,则进行加法;
选择2,则进行减法;
选择3,则进行乘法;
选择4,则进行除法。
具体计算过程分析如下:
1、从键盘接收一个数字:
MOVAH,01H
通过调用DOS系统的01H号功能——键入字符并回车来实现,其出口参数为键入字符的ASCII码,存在AL中。
2、接收键入用于计算的数:
MOVAH,0AH
MOVDX,OFFSETBUF1
通过调用DOS系统的0AH号功能——键入字符串至内存缓冲区来实现,其入口参数如下:
DS:
DX=存放键入字符串的缓冲区的首地址;
(DS:
DX)=用户规定的缓冲区;
DX+1)=实际键入的字符数;
从(DS:
DX+2)开始放键入的字符串。
因此,在下面的程序中运用所键入的数字时要注意字符串的首地址。
|
3、显示结果:
MOVDX,OFFSETBUF3
将结果存入数据段中定义的缓冲区BUF3中,再通过调用DOS系统的09H号功能——显示字符串(串尾字符为$,但不显示)来完成。
3.3.3数制转换设置
1、子程序A2——将数的ASCII码转为二进制数:
A2PROCNEAR
《
MOVCL,BUF1+1;
把BUF1+1中的实际键入的字符数放入CL
MOVCH,0;
CH清零
MOVBX,OFFSETBUF1+2;
把第一个数字的地址放在BX
PUSHBX;
保存BX中的值
PUSHCX;
保存CX中的值
L1:
MOVAL,[BX]
ANDAL,0FH;
把ASCII码转换为十进制
MOV[BX],AL;
存放十进制
[
INCBX;
下一个数字的地址
LOOPL1
POPCX;
恢复CX
POPBX;
恢复BX
MOVAX,0;
将累加和赋零
MOVSI,10
L2:
MULSI
ADDAL,[BX]
\
ADCAH,0
INCBX
LOOPL2;
累加乘10
L3:
RET
A2ENDP
入口:
十进制数的ASCII在BUF1内;
出口:
转换后的二进制数在AX内。
算法:
先将其转换为十进制,再用累加和乘10加X的方法变为二进制,如将163转换为二进制数,可先将累加和赋0,再计算(((0*10+1)*10+6)*10+3)结果为二进制数。
2、将计算结果的二进制数转换为对应的十进制数ASCII码并输出显示(A3程序段):
$
该模块的程序设计详见程序清单及说明中A3、BB程序段
入口:
二进制数在AX内;
转换后的ASCII码在BUF内。
AX内的数范围在+32767到-32768之间,先检查AX符号位,决定输出‘+’‘-’,若为负,先求补码得到原码后可与正数统一处理。
方法:
把将被转换的二进制数先除以10000,商为万位数,再将余数除以1000,商为千位数,以此类推,求出百十位数,剩下的为个位数。
最后各个数加上30H,即为对应字符。
—
4.汇编源程序代码
DATASEGMENT
N=15
TOPDB5DUP(0AH)
DBNDUP('
'
),'
Pleaseinputanumbertochoosethearithmeticoperation'
0DH,0AH
<
1—add2—subtract3—multiply'
4—divideq—returntoDOS'
Choice(1.2.3.:
$'
MESG1DB0DH,0AH,'
Pleasepressnumber:
1.2.3.!
MESG2DB0DH,0AH,'
Pleaseinputthefirstnumber:
MESG3DB0DH,0AH,'
Pleaseinputthesecondnumber:
MESG4DB0DH,0AH,'
PlayAdd:
MESG5DB0DH,0AH,'
PlaySubtract:
MESG6DB0DH,0AH,'
PlayMultiply:
MESG7DB0DH,0AH,'
PlayDivide:
MESG8DB0DH,0AH,'
TheResult:
MESG9DB0DH,0AH,'
PRESSQRETURNDOC,ANYPRESSRETURNSTART!
BUF1DB6;
十进制数的缓冲区,可接收6个字符
DB;
保留,用于10号调用时DOC填入实际输入字符数
DB6DUP();
一个符号位,四位数字ASCII码,加上一个回车符
¥
BUF2DW;
将第一个数转换为二进制后,放于这里
BUF3DB6DUP(),'
;
将结果转换为ASCII码后,放在这里
DATAENDS
STACKSEGMENTSTACK'
STACK'
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAH,00H;
设置屏幕显示方式
MOVAH,09H;
显示菜单
MOVDX,OFFSETTOP
AA:
MOVAH,01H;
从键盘接收一个数字
CMPAL,'
1'
与1比较
JNENEXT1;
不等于1就转到NEXT1
JMPJIA;
等于1就转到加法程序
NEXT1:
2'
与2比较
JNENEXT2;
不等于2就转到NEXT2
JMPJIAN;
等于2就转到减法程序
NEXT2:
3'
与3比较
JNENEXT3;
不等于3就转到NEXT3
JMPCHENG;
等于3就转到乘法程序
NEXT3:
4'
与4比较
JNENEXT4;
不等于4就转到NEXT4
JMPCHU;
等于4就转到除法程序
NEXT4:
q'
与q比较
JNENEXT5;
不等于q就转到NEXT5
MOVAH,4CH;
回DOS
NEXT5:
显示MESG1
MOVDX,OFFSETMESG1
JMPAA;
跳到AA
A1PROCNEAR
提示输入第一个数
MOVDX,OFFSETMESG2
MOVAH,0AH;
接收第一个数
CALLA2;
调用A2进行ASCII-二进制的转换
MOVBUF2,AX;
把第一个数转换的二进制放在BUF2
提示输入第二个数
MOVDX,OFFSETMESG3
接收第二个数
调用A2把第二个数进行ASCII-二进制转换
RET
A1ENDP
MOVCL,BUF1+1;
%
MOVCH,0;
MOVBX,OFFSETBUF1+2;
PUSHBX;
PUSHCX;
ANDAL,0FH;
MOV[BX],AL;
INCBX;
>
LOOPL1
POPCX;
POPBX;
MOVAX,0;
MOVSI,10
ADDAL,[BX]
ADCAH,0
(
INCBX
LOOPL2;
JIA:
加法程序
MOVDX,OFFSETMESG4
CALLA1;
调用A1
ADDAX,BUF2;
把转换后的放在BUF2中的第一个数和放在AX
JMPA3;
的第二个数相加
JIAN:
减法程序
MOVDX,OFFSETMESG5
CALLA1
MOVBX,AX;
把转换后的放在AX的第二个数放到BX
MOVAX,BUF2;
把转换后放在BUF2中的第一个数放到AX
`
SBBAX,BX;
两数相减
JMPA3
CHENG:
乘法程序
MOVDX,OFFSETMESG6
把转换后的放在BUF2中第一个数放到AX
》
MULBX;
两数相乘
CHU:
除法程序
MOVDX,OFFSETMESG7
MOVDX,AX;
把转换后的放在AX的第二个数放到DX
DIVDL;
两数相除,商在AL里
MOVAH,0H;
使AH清零
A3:
MOVBUF3,'
+'
把BUF3放'
CMPAX,0;
把结果于0比较
JGEL4;
AX>
0转到L4
NEGAX;
AX<
0将AX取反
-'
L4:
CWD
MOVBX,10000
DIVBX;
商为第一位数字放在AL,余数放在DX
CALLBB
MOVBUF3+1,AL;
把第一个数放在BUF3+1单元中
MOVAX,DX;
把放在DX中的余数放到AX
MOVBX,1000
商为第二位数字放在AL,余数放在DX
MOVBUF3+2,AL;
把第二个数放在BUF3+2单元中
MOVBL,100
DIVBL;
商为第三位数字放在AL,余数放在AH
MOVBUF3+3,AL;
把第三个数放在BUF3+3单元中
MOVAL,AH;
把放在AH中的余数放到AL
CBW
MOVBL,10
商为第四位数字放在AL,余数放在A
MOVBUF3+4,AL;
把第四个数放在BUF3+4单元中
ADDAH,30H;
把个位转为ASSCII码
MOVBUF3+5,AH;
把第五个数放在BUF3+5单元中
,
提示结果
MOVDX,OFFSETMESG8
MOVAH,09H
MOVDX,OFFSETBUF3;
把放在BUF3缓冲区中的结果显示出来
提示是返回DOS还是重新计算
JMPNEXT5;
其他数字重新计算
BBPROCNEAR
CMPAL,0H;
与零比较
JEL5
JMPL6
L5:
MOVAL,20H;
等于零,赋AL空格
JMPL7
L6:
ADDAL,30H;
不等于零,把数转为ASSCII码
L7:
BBENDP
A4:
AL等于'
Q'
就返回DOS
CODEENDS
ENDSTART
5、调试运行结果
操作说明
(1)按提示输入1,2,3,4。
(2)1:
加法ADD。
(3)2:
减法SUB。
(4)3:
乘法MUL。
(5)4:
除法DIV。
(6)输入一个十进制数,回车。
(7)再输入一个十进制数,回车。
(8)显示计算结果。
(9)退出按q。
调试运行结果
(1)进入系统界面,程序运行截图如图所示。
图进入系统界面
(2)加法:
算法选择1,按提示输入两个十六进制数,回车后显示计算式和结果。
程序运行截图如图所示。
图加法程序截图
(3)减法:
算法选择2,按提示输入两个十进制数,回车后显示计算结果,程序运行截图如图所示。
图减法程序截图
(4)乘法:
算法选择3,按提示输入两个十进制数,回车后显示计算结果。
图乘法程序截图
(5)除法:
算法选择3,按提示出入两个十进制数,回车后显示计算结果,程序运行截图如图所示。
图除法程序截图
(6)退出:
按q键即可退出程序。
图退出运行截图
程序运行后可以看出,程序完成了十进制加减乘除四则运算,按q键则退出程序,符合设计要求。
同时,屏幕上可以显示计算结果,也完成了设计要求。
6、心得体会
本次为期一周的微机原理与接口课程设计已经结束了,在这并不算长的时间里我却获益良多。
第一,我对本学期所学的理论知识有了更加深刻的理解。
首先是对汇编语言的编程思想、程序设计流程有了更加深刻的认识。
另外,我的课程设计中运用了许多BIOS中断和DOS中断的功能,例如利用BIOS中断的10号功能调用来设置显示方式,利用DOS中断的01号、02号子功能来完成键盘接受、结果显示。
从而加深了我对BIOS和DOS中断的理解。
以前在课堂上一些一知半解的东西,经过这次的实际应用也顿时觉得豁然开朗。
第二,提高了我理论联系实际的能力。
在本科生的学习中,大部分是对理论知识的学习,很少有真正实际应用与实践的机会。
每个学期末的课程设计无疑是十分难得的,我们应好好利用并倍加珍惜。
在上理论课时,对各种程序设计思想都只是有一种肤浅的认识,并没有特别深刻的了解。
即使是实验课也只是停留在比较浅显的阶段,并不能对所学知识进行深入的研究。
但这次的课程设计却让我对学习的理论知识有了更加深刻的认识,并将其运用到实际的软件设计中,在学会运用的过程中再一次对理论进行了升华。
为以后的工作打下了良好的基础。
第三,使我认识到了团结协作的重要性。
完成本次课程设计也不是一件轻松的事情,设计的过程中也总会出现这样那样的问题。
有些问题凭自己绞尽脑汁的空想是很难解决的,这个时候我们就需要其他同学或老师的帮助。
在遇到疑难时,有时看着很困难的问题,在通过与同学们的讨论分析