微型计算机课程设计简易计算器李智.docx
- 文档编号:9570928
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:21
- 大小:190.92KB
微型计算机课程设计简易计算器李智.docx
《微型计算机课程设计简易计算器李智.docx》由会员分享,可在线阅读,更多相关《微型计算机课程设计简易计算器李智.docx(21页珍藏版)》请在冰豆网上搜索。
微型计算机课程设计简易计算器李智
课程设计
设计名称:
微型计算机技术及应用——简易计算器
学院:
信息工程学院
课程:
微型计算机技术及应用
姓名:
智
学号:
201407010252
班级:
2014级计算机科学与技术二班
摘要
本次课程设计是通过使用DOSBox汇编语言编程软件实现的利用汇编语言编写的较为复杂的程序设计。
该课程设计主要是设计一个较为简单的计算器,界面显示要求用户从键盘上分别输入两个随机数,完成四则运算,然后将运算结果显示到屏幕上。
该设计智能实现简单的正整数之间的四则运算,无法对小数进行精确地识别。
而除法运算可以精确到3位小数,减法可以显示出负数的结果。
采用DOS调用(INT21H)来完成键盘的输入和屏幕的输出。
通过这次的课程设计能够进一步加深对专业知识和理论知识学习的认识和理解。
关键词:
DOSBox;微机原理;计算器;汇编语言
一、前言
1.1背景
计算器是现代人发明的可以进行数字运算的电子机器。
现代的电子计算器能进行数学运算的手持电子机器,拥有集成电路芯片,但结构比电脑简单得多,可以说是第一代的电子计算机(电脑),且功能也较弱。
随着微机和手机的普及,计算器逐渐退出了人们的视野,只能被局限于在课堂之上的计算工具。
虽然计算器的使用围逐渐缩小,但计算器依旧在不断发展。
即使科技的发展带动着小型计算器成为一个移动的计算实验室。
但它的核心却依然没有逃脱最简单的四则运算:
加、减、乘和除。
1.2项目介绍
本次课程设计就是根据微机原理与接口的相关知识,利用BIOS和DOS的中断来设计一个简易计算器,能够实现加减乘除四则运算,并在屏幕上显示一个主菜单,提示用户输入相应的数字键,分别执行加、减、乘、除四种计算功能和结束程序的功能。
同时利用BIOS中断的10号功能调用来设置显示方式,利用DOS中断的01号和02号子功能来完成键盘接收,结果显示。
二、课程设计的目的与任务
2.1设计目的
为了使学生加深对所学的微机原理知识的理解,培养学生的专业素质,提高其利用微机原理知识处理问题的能力,为今后专业课程的学习、毕业设计和工作打下良好的基础。
使学生能比较扎实地掌握微机原理的基础知识和基本理论,掌握控制系统及有关设备的分析、开发等基本技能,受到必要工程训练、初步的科学研究方法训练和实践锻练,增强分析问题和解决问题的能力,了解微机原理和接口技术的新发展。
2.2设计任务
本课程设计是制作出一个简易的计算器,并可以在DOCBOX上运行,并且正确地完成加、减、乘、除等四则运算。
三、设计过程
3.1基础理论
3.1.1DOSBox简介
由于微软公司对windos7的64位操作系统取缔了为汇编程序开放的Edit、Masm、Link以及Debug等的功能。
所以我选择了一款比较简单但同样适用的Dos环境仿真器——DOSBox。
DOSBox是一种创造类DOS环境的开源x86仿真器,通常用于运行近代计算机或者非IBMPC兼容机的MS-DOSIBMPC兼容程序。
不仅如此,它还是一个完整的中央处理器仿真器,并不是一个兼容层如dosemu或者依赖386类处理器虚拟化能力的Windows与OS/2VDM。
不需要x86中央处理器或者任何DOS版本以运行,并且能运行真实模式与保护模式的程序。
虽然DOSBox是Dos的仿真器,但它只是具有搭载环境的能力,却并没有自带汇编程序的运行环境,。
我们需要下载相对应的运行环境masm或tasm。
当在下载完成后,我们需要对DOSBox进行相对应的设置。
当配置好环境后,现在我们就可以使用它进行Edit,Masm,Link,Debug了
EDIT:
Masm和Link:
完成masm和link两步以后,我们就得到了可以运行的程序exe文件了:
Debug:
通过这几个步骤,我们就可以得到我们需要的可以正确执行地exe文件了。
3.1.2中断
3.1.2.1何谓中断
所谓中断,是指CPU在执行当前程序时,由于外部事件和部事件,使得CPU中断正在执行的程序,转到为外部与部事件服务的程序中去执行。
当服务程序执行完毕,再返回带刚才被中断的程序的断点处,继续执行。
8086有一个强有力的中断系统,可以处理256种不同的中断,每个中断对应一个类型号,所以,256种中断对应的中断类型号为0~255.
这256种中断可以分成两大类:
一类叫硬件中断;一类叫软件中断。
硬件中断是通过外部的硬件产生的,所以,也常常把硬件中断。
硬件中断又分为两类:
一类叫非屏蔽中断;另一类叫可屏蔽中断。
非屏蔽中断是通过CPU的NMI引脚进入,它不受中断允许标志IF的屏蔽,并且整个系统中只有一个非屏蔽中断。
可屏蔽中断是通过CPU的INTR引脚进入的,并且只有当中断允许标志IF为1时,可屏蔽中断才能进入,如果中断允许标志IF为0,则可屏蔽中断受到禁止。
软件中断是CPU根据某条指令或者软件对标志寄存器的设置而产生的,从软件中断的产生过程来说,完全和硬件电路无关。
典型的软件中断是除数为0引起的中断和中断指令引起的中断。
3.1.2.2中断向量和中断向量表
8086的中断系统以位于存0段的0~3FFH区域的中断向量表为基础,中断向量表中最多可容纳256个中断向量。
所谓中断向量,实际上就是中断处理子程序的入口地址,每个中断类型对应一个中断向量。
中断向量并不是任意存放的。
一个中断向量占4个存储单元,其中,前两个单元存放中断处理子程序入口地址的偏移量(IP),低位在前,高位在后,后两个单元存放中断处理子程序入口地址的段地址(CS),同样也是低位在前,高位在后。
256个中断的前5个是专用中断。
类型0的中断称作除数为0中断;类型1的中断称为单步中断;非屏蔽中断对应类型2;类型3的中断为断点中断;而类型4的中断为溢出中断。
除了非屏蔽中断外,其他几个中断都是软件中断。
3.1.2.3中断方式
为了提高CPU的效率和使系统有实时性能,可采用中断传送方式。
在中断方式下,外设具有申请CPU服务的主动权,当输入设备将数据准备好或输出设备可接收数据时,便可向CPU发中断请求,使CPU暂时停下来目前的工作而和外设进行一次数据传输。
等输入操作或输出操作完成后,CPU继续进行原来的工作。
(如左图:
)
四、设计
4.1总体方案
利用BIOS中断的10号功能调用来设置显示方式。
利用DOS中断的01号、02号子功能来完成键盘接受、结果显示。
设置屏幕显示方式。
MOVAH,00H
MOVAL,NUM
INT10H
接着从键盘上接受键值,并判别后转到相应的子模块进行运算,并显示结果。
MOVAH,01H
INT21H;AL=键入字符的ASCII码
从键盘上接收一串字符串命令:
MOVAH,0AH
MOVDX,OFFSETBUF;BUF为数据段中定义的数据缓冲区
INT21H
显示单个字符命令:
MOVAH,02H
INT21H
显示一串字符串的命令:
MOVAH,09H
MOVDX,OFFSETBUF;BUF为被显示字符串的首地址
INT21H
十进制数显示过程:
将十进制数送到BX中,BX除以1000,余数送BX中,商在AL中,围为0~9,显示AL中的容。
BX除以100,余数送BX中,商在AL中,显示AL中的容,依次类推,直到分出个位数字。
如最高位为0,则不应显示,而非最高位的0则显示。
可利用设标志位并结合商的方法来决定是否显示0。
4.2原理框图
主程序
提示输入第一个数
提示输入第二个数
计算
判断结果正负,并储存结果
将结果转为ASCII码,并显示结果
提示返回DOS还是重新计算
将第一个数的ASCII码转为二进制并保存
将第二个数的ASCII码转为二进制并保存
结束
子程序
4.3程序代码
DATASEGMENT
N=15
TOPDB5DUP(0AH)
DBNDUP(''),'Pleaseinputanumbertochoosethearithmeticoperation',0DH,0AH
DBNDUP(''),'',0DH,0AH
DBNDUP(''),'1—add',0DH,0AH
DBNDUP(''),'2—subtract',0DH,0AH
DBNDUP(''),'3—multiply',0DH,0AH
DBNDUP(''),'4—divide',0DH,0AH
DBNDUP(''),'5—returntoDOS',0DH,0AH
DBNDUP(''),'',0DH,0AH
DBNDUP(''),'CHOICE(1.2.3.4.5):
$'
MESG1DB0DH,0AH,'PLEASEPRESSNUMBER1.2.3.4.5!
$'
MESG2DB0DH,0AH,'PLEASEINPUTTHEFIRSTNUMBER:
$'
MESG3DB0DH,0AH,'PLEASEINPUTTHESECONDNUMBER:
$'
MESG4DB0DH,0AH,'PLAYADD:
$'
MESG5DB0DH,0AH,'PLAYSUBTRACT:
$'
MESG6DB0DH,0AH,'PLAYMULTIPLY:
$'
MESG7DB0DH,0AH,'PLAYDIVIDE:
$'
MESG8DB0DH,0AH,'THERESULT:
$'
MESG9DB0DH,0AH,'PRESSQRETURNDOS,ANYPRESSRETURNSTART!
$'
BUF1DB6;十进制数的缓冲区,可接收6个字符
DB?
;保留,用于10号调用时DOS填入实际输入字符数
DB6DUP(?
);一个符号位,四位数字ASCII码,加上一个回车符
BUF2DW?
;将第一个数转换为二进制后,放于这里
BUF3DB6DUP(?
),'$';将结果转换为ASCII码后,放在这
DATAENDS
STACKSEGMENTSTACK'STACK'
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAH,00H;设置屏幕显示方式
MOVAL,0
INT10H
MOVAH,09H;显示菜单
MOVDX,OFFSETTOP
INT21H
AA:
MOVAH,01H;从键盘接收一个数字
INT21H
CMPAL,'1';与1比较
JNENEXT1;不等于1就转到NEXT1
JMPJIA;等于1就转到加法程序
NEXT1:
CMPAL,'2';与2比较
JNENEXT2;不等于2就转到NEXT2
JMPJIAN;等于2就转到减法程序
NEXT2:
CMPAL,'3';与3比较
JNENEXT3;不等于3就转到NEXT3
JMPCHENG;等于3就转到乘法程序
NEXT3:
CMPAL,'4';与4比较
JNENEXT4;不等于4就转到NEXT4
JMPCHU;等于4就转到除法程序
NEXT4:
CMPAL,'5';与5比较
JNENEXT5;不等于5就转到NEXT5
MOVAH,4CH;返回DOS
INT21H
NEXT5:
MOVAH,09H;显示MESG1
MOVDX,OFFSETMESG1
INT21H
JMPAA;跳到AA
A1PROCNEAR
MOVAH,09H;提示输入第一个数
MOVDX,OFFSETMESG2
INT21H
MOVAH,0AH;接收第一个数
MOVDX,OFFSETBUF1
INT21H
CALLA2;调用A2进行ASCII-二进制的转换
MOVBUF2,AX;把第一个数转换的二进制放在BUF2
MOVAH,09H;提示输入第二个数
MOVDX,OFFSETMESG3
INT21H
MOVAH,0AH;接收第二个数
MOVDX,OFFSETBUF1
INT21H
CALLA2;调用A2把第二个数进行ASCII-二进制转换
RET
A1ENDP
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
JIA:
MOVAH,09H;加法程序
MOVDX,OFFSETMESG4
INT21H
CALLA1;调用A1
ADDAX,BUF2;把转换后的放在BUF2中的第一个数和放在AX的第二个数相加
JMPA3
JIAN:
MOVAH,09H;减法程序
MOVDX,OFFSETMESG5
INT21H
CALLA1
MOVBX,AX;把转换后的放在AX的第二个数放到BX
MOVAX,BUF2;把转换后放在BUF2中的第一个数放到AX
SBBAX,BX;两数相减
JMPA3
CHENG:
MOVAH,09H;乘法程序
MOVDX,OFFSETMESG6
INT21H
CALLA1
MOVBX,AX;把转换后的放在AX的第二个数放到BX
MOVAX,BUF2;把转换后的放在BUF2中第一个数放到AX
MULBX;两数相乘
JMPA3
CHU:
MOVAH,09H;除法程序
MOVDX,OFFSETMESG7
INT21H
CALLA1
MOVDX,AX;把转换后的放在AX的第二个数放到DX
MOVAX,BUF2;把转换后的放在BUF2中第一个数放到AX
DIVDL;两数相除,商在AL里
MOVAH,0H;使AH清零
JMPA3
A3:
MOVBUF3,'+';把BUF3放'+'
CMPAX,0;把结果于0比较
JGEL4;AX>0转到L4
NEGAX;AX<0将AX取反
MOVBUF3,'-';把BUF3放'-'
L4:
CWD
MOVBX,10000
DIVBX;商为第一位数字放在AL,余数放在DX
CALLBB
MOVBUF3+1,AL;把第一个数放在BUF3+1单元中
MOVAX,DX;把放在DX中的余数放到AX
CWD
MOVBX,1000
DIVBX;商为第二位数字放在AL,余数放在DX
CALLBB
MOVBUF3+2,AL;把第二个数放在BUF3+2单元中
MOVAX,DX;把放在DX中的余数放到AX
MOVBL,100
DIVBL;商为第三位数字放在AL,余数放在AH
CALLBB
MOVBUF3+3,AL;把第三个数放在BUF3+3单元中
MOVAL,AH;把放在AH中的余数放到AL
CBW
MOVBL,10
DIVBL;商为第四位数字放在AL,余数放在A
CALLBB
MOVBUF3+4,AL;把第四个数放在BUF3+4单元中
ADDAH,30H;把个位转为ASSCII码
MOVBUF3+5,AH;把第五个数放在BUF3+5单元中
MOVAH,09H;提示结果
MOVDX,OFFSETMESG8
INT21H
MOVAH,09H
MOVDX,OFFSETBUF3;把放在BUF3缓冲区中的结果显示出来
INT21H
MOVAH,09H;提示是返回DOS还是重新计算
MOVDX,OFFSETMESG9
INT21H
MOVAH,01H;接收键盘数字
INT21H
CMPAL,'Q'
JEA4
JMPNEXT5;其他数字重新计算
BBPROCNEAR
CMPAL,0H;与零比较
JEL5
JMPL6
L5:
MOVAL,20H;等于零,赋AL空格
JMPL7
L6:
ADDAL,30H;不等于零,把数转为ASSCII码
L7:
RET
BBENDP
A4:
MOVAH,4CH;AL等于'Q'就返回DOS
INT21H
CODEENDS
ENDSTART
五、系统模块详细设计与调试
5.1系统模块详细设计
5.1.1设置屏幕显示方式
MOVAH,00H
MOVAL,0
INT10H
通过调用BOIS的OOH号功能来设置屏幕显示方式。
此处AL=0,即设置屏幕显示方式为40*25黑白文本。
5.1.2显示主菜单
MOVAH,09H
MOVDX,OFFSETTOP
INT21H
先在数据段中定义主菜单中要显示的字符串,再通过调用DOS系统的09H号功能——显示字符串(串尾字符为$,但不显示)来完成。
5.1.3从键盘接收一个数字
MOVAH,01H
INT21H
通过调用DOS系统的01H号功能——键入字符并回车来实现,其出口参数为键入字符的ASCII码,存在AL中。
5.1.4接收键入用于计算的数
MOVAH,0AH
MOVDX,OFFSETBUF1
通过调用DOS系统的0AH号功能——键入字符串至存缓冲区来实现,其入口参数如下:
DS:
DX=存放键入字符串的缓冲区的首地址;(DS:
DX)=用户规定的缓冲区;(DS:
DX+1)=实际键入的字符数;从(DS:
DX+2)开始放键入的字符串。
因此,在下面的程序中运用所键入的数字时要注意字符串的首地址。
5.1.5显示结果
MOVAH,09H
MOVDX,OFFSETBUF3
INT21H
将结果存入数据段中定义的缓冲区BUF3中,再通过调用DOS系统的09H号功能——显示字符串(串尾字符为$,但不显示)来完成。
5.1.6子程序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)结果为二进制数。
5.1.7将计算结果的二进制数转换为对应的十进制数ASCII码并输出显示(A3程序段)
入口:
二进制数在AX;出口:
转换后的ASCII码在BUF。
算法:
AX的数围在+32767到-32768之间,先检查AX符号位,决定输出‘+’还是‘-’,若为负,先求补码得到原码后可与正数统一处理。
方法:
把将被转换的二进制数先除以10000,商为万位数,再将余数除以1000,商为千位数,以此类推,求出百十位数,剩下的为个位数。
最后各个数加上30H,即为对应字符。
5.2程序编译、运行与调试
在DOS环境下,键入EDIT。
启动全屏幕编辑软件EDIT,输入源程序。
输入完毕,按Alt+F选择SAVE保存程序(规定扩展名为*.ASM),按Alt+X退出EDIT状态。
退出EDIT环境后,输入ASM或MASM文件名↙(省略扩展名,系统默认为.ASM),对源程序进行汇编。
源程序经汇编后产生三个输出文件:
第一个是OBJ文件,即二进制目标文件,这是汇编的主要目的;第二个是LST文件,即列表文件;第三个是CRF文件,对于一般的程序可以不建立后两个文件。
汇编时,计算机会询问汇编后生成的OBJ文件名、LST文件名和CRF文件名,问句的右侧是示回答,如果不想生成LST文件和CRF文件,则按回车键回答。
汇编过程中,如果源程序中有语法错误,则汇编过程结束后,汇编程序会指出源程序中的错误,这时,可以再用编辑程序来修改源程序中的错误,最后,得到没有语法错误的OBJ文件。
汇编程序产生的二进制目标文件不是可执行文件,还必须用连接程序(LINK)把OBJ文件转换成可执行的EXE文件。
LINK程序有两个输入文件OBJ和LIB,两个输出文件EXE和MAP。
连接时,输入LINK文件名↙,对汇编生成的*.OBJ文件进行连接,计算时会询问生成的EXE文件名、MAP文件名以及参与连接的库文件名,如果不想生成MAP文件,没有库文件参与连接,则按回车键作答。
最后,生成相应的*.EXE文件。
从LINK过程的提示信息中,可看到最后给出了一个“无堆栈段”的警告性错误,这并不影响程序的执行。
至此,产生了一个EXE文件,在DOS环境下可以直接运行该文件。
在程序得到正确的结果之前,会产生一些错误,只有经过调试阶段才能纠正程序中的错误,从而的到正确的结果。
在程序编译过程中会提示语法错误,可再用编辑程序来修改源程序中的错误。
当没有语法错误而得不到正确结果时,可用调试程序DEBUG来调试。
它通过单步、设置断点等方式为汇编语言程序员提供了非常有效的调试手段。
六、设计总结
本次为期一周的微机原理与接口课程设计已经结束了,在这并不算长的时间里我却获益良多。
第一,我对本学期所学的理论知识有了更加深刻的理解。
首先是对汇编语言
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微型计算机 课程设计 简易 计算器