微型计算机课程设计简易计算器李智文档格式.docx
- 文档编号:22706962
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:21
- 大小:190.92KB
微型计算机课程设计简易计算器李智文档格式.docx
《微型计算机课程设计简易计算器李智文档格式.docx》由会员分享,可在线阅读,更多相关《微型计算机课程设计简易计算器李智文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
由于微软公司对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为被显示字符串的首地址
十进制数显示过程:
将十进制数送到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('
DBNDUP('
1—add'
2—subtract'
3—multiply'
4—divide'
5—returntoDOS'
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
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:
5'
与5比较
JNENEXT5;
不等于5就转到NEXT5
MOVAH,4CH;
返回DOS
NEXT5:
显示MESG1
MOVDX,OFFSETMESG1
JMPAA;
跳到AA
A1PROCNEAR
MOVAH,09H;
提示输入第一个数
MOVDX,OFFSETMESG2
MOVAH,0AH;
接收第一个数
MOVDX,OFFSETBUF1
CALLA2;
调用A2进行ASCII-二进制的转换
MOVBUF2,AX;
把第一个数转换的二进制放在BUF2
提示输入第二个数
MOVDX,OFFSETMESG3
接收第二个数
调用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:
加法程序
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还是重新计算
MOVDX,OFFSETMESG9
接收键盘数字
Q'
JEA4
JMPNEXT5;
其他数字重新计算
BBPROCNEAR
CMPAL,0H;
与零比较
JEL5
JMPL6
L5:
MOVAL,20H;
等于零,赋AL空格
JMPL7
L6:
ADDAL,30H;
不等于零,把数转为ASSCII码
L7:
BBENDP
A4:
MOVAH,4CH;
AL等于'
就返回DOS
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)=用户规定的缓冲区;
DX+1)=实际键入的字符数;
从(DS:
DX+2)开始放键入的字符串。
因此,在下面的程序中运用所键入的数字时要注意字符串的首地址。
5.1.5显示结果
MOVDX,OFFSETBUF3
将结果存入数据段中定义的缓冲区BUF3中,再通过调用DOS系统的09H号功能——显示字符串(串尾字符为$,但不显示)来完成。
5.1.6子程序A2——将数的ASCII码转为二进制数
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;
入口:
十进制数的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文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微型计算机 课程设计 简易 计算器