微机原理课程设计.docx
《微机原理课程设计.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计.docx(54页珍藏版)》请在冰豆网上搜索。
微机原理课程设计
课程设计任务书
学生姓名:
专业班级:
指导教师:
工作单位:
题目:
计算器
初始条件:
设计一个简单的计算器程序。
用汇编语言(8086/DOS)编计算器程序,所设计的计算器能实现加、减、乘、除的计算。
该程序接受的是10进制数。
执行时,直接用键盘输入数字和运算符,按等号键即可完成运算。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.具备计算器的界面,在屏幕上显示出来。
2.实现按键的输入,能实现一位数的四则运算并能连续计算,以及实现有符号数的计算及清屏功能。
3.撰写符合学校要求的课程设计说明书,内容包括:
摘要、目录、正文、参考文献、附录(程序清单)。
正文部分包括:
设计任务及要求、方案比较及论证、软件设计说明(软件思想,流程,源程序设计及说明等)、程序调试说明和结果分析、课程设计收获及心得体会。
时间安排:
1.1月08日----1月10日查阅资料及方案设计
2.1月11日----6月13日编程
3.1月14日----6月16日调试程序
4.1月17日----1月18日撰写课程设计报告
5.1月19日上午准备答辩,下午正式答辩
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
摘要
汇编语言(AssemblyLanguage)是面向机器的程序设计语言,是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。
在汇编语言中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。
本次程序设计是以计算器为任务,运用汇编语言来完成。
任务要求有计算器的界面,并显示出来。
所以程序中一个重要的程序段是界面的设计。
另外对于两个数字和运算符的输入存储和显示也是比较重要的一段。
在本程序设计,我们采用了较多的子程序,使得程序的阅读理解比较清晰简单。
在输入计算表达式的时候,所输入的有效字符将在计算器的界面中高亮显示。
但由于各方面的限制,程序还只能运算一位数。
但在本程序中有一个特色是,设置一个功能键,只有当功能键处于有效状态即绿色时,计算器才处于工作状态。
此外,只要输入的字符无效时,功能键都将变成红色,中断计算器的工作。
关键词:
计算器汇编语言子程序DOS调用
计算器
1设计任务及要求
初始条件:
设计一个简单的计算器程序。
用汇编语言(8086/DOS)编计算器程序,所设计的计算器能实现加、减、乘、除的计算。
该程序接受的是10进制数。
执行时,直接用键盘输入数字和运算符,按等号键即可完成运算。
要求完成的主要任务:
1.具备计算器的界面,在屏幕上显示出来。
2.实现按键的输入,能实现一位数的四则运算并能连续计算,以及实现有符号数的计算及清屏功能。
2总体方案论证
该课程设计的任务是做一个简易计算器,可以对两个一位数进行加减乘除运算,例如8/2=4。
这个题目难点在于这两个要做运算的数未知,是由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个一位数进行运算,而且做的是运算符号也未知,所以我们还要判断这个运算是什么,并且调用相应的程序。
首先,我们必须先设计一个计算器的界面和必要的提示语句。
同时我们还要准备一行来用于表达式的显示。
接着就是两个数和运算符号的输入显示和存储。
另外,我们还设置了一个功能键,说明计算器的工作状态。
运行计算器后,首先按“Q”/“q”打开计算器,处于有效状态。
同时,只要从键盘输入有效字符,功能键将一直显示为绿色;否则,显示为红色。
当输入第一个有效数字,程序可以在表达式行显示出来,并将其对应的值出入A中,同时在显示的计算器界面中,对应的数值也将由绿色变为红色。
接着运算字符和第二个有效数字也一样。
最后,从键盘上按下“Enter”键,在屏幕上将显示“=”,同时,程序将显示计算结果。
对于键入的运算符号,程序将通过比较指令CMP来判断其属于哪一种运算,然后直接跳转到相应的程序段。
至于结果的输出,在四个不同的子运算程序中,都将结果转化为对应的ASCII码,然后再使用DOS功能调用,将其显示出来。
图2-1数据的提取运算示意图
由于计算的结果有可能出现负数,对其必须要有相应的处理。
首先判断存在BUF0中的结果是否为负数,若为正数,则直接输出;若是负数,则取补后,再输出,并在结果前显示一个“-”。
最后就是程序的退出,当从键盘输入“Q”“或q”时,程序将提示退出。
3程序流程图及其说明
3.1流程图
总体的流程图见图3-1。
图3-1总体流程图
3.2流程图说明
程序流程图是一个总体的框架,大概说明了设计的思想,简要说明实现的功能及功能的大概算法。
程序开始执行,进入欢迎界面,输出提示性语句,以及显示计算机界面。
判断输入字符是否为“O”或“o”,若输入字符“O”或“o”,则打开计算器;若输入字符“Q”或“q”,则退出计算器;若输入字符为其他字符,则继续保持计算器欢迎界面。
打开计算机后,输入第一个数,若输入字符为数字,则把数据存入数据区A,且在屏幕的表达式显示栏显示输入的数字;若输入字符为其他字符,则继续返回计算器欢迎界面。
然后输入运算符,若输入合法的运算符“+”、“-”、“*”、“/”,则可继续输入第二个数,且在屏幕的表达式显示栏显示运算符;若为其他字符,则再次返回欢迎界面。
输入第二个数,若输入的字符为数字,则把数据存入数据区B,且在屏幕的表达式显示栏显示输入的数字;若输入字符为其他字符,则再次返回计算器欢迎界面。
然后,按下回车键,得到计算结果,并且把计算结果存入数据区BUF0。
接下来,就是符号数的处理,需要对数据区BUF0的数据进行正负数的判断。
若数据区BUF0的数据为整数,则直接输出到屏幕的显示栏显示计算结果;若数据为负数,而负数在是以补码的形式存储在计算机中,当然不能直接输出,用NEG指令对就算结果求补运算,得到的结果为负数的绝对值,这是需要在求补后的数值前添加“-”号,即实现有符号数的正确计算。
对于输出的结果后,再次判断是否有运算符输入。
若有,则继续重复上述操作进行四则运算;若无,则保持运算结果界面。
再次按下“O”或“o”键,则可实现清零操作,重新开始计算器功能;若按下“Q”或“q”键,则退出程序。
总体流程图如图3-1。
4软件设计说明
4.1软件设计思想
程序基本采用结构化程序设计的思想,即将整个大程序分解成若干个小程序,采用自顶向下、逐步求精的程序设计方法,使用三种基本控制结构构造程序,任何程序都可由顺序、选择、重复三种基本控制结构构造。
在程序中通过大量采用子程序,而简化主程序,可以使程序设计的思路很清晰,也有利于程序的调试和查找错误。
本程序中的子程序:
SEVERAL_RECT:
画多个矩形方框的子程序
HIGHLIGHT:
高亮化的子程序
LOWLIGHT:
取消高亮化的子程序
POSITION:
设置修改提示性语句的位置
RECT:
绘制一个方框的子程序
FRAME1:
方框绘制和字符的子程序
FRAME2:
显示界面字符的子程序
O_F2T10:
将二进制转化为十进制的子程序
RADIX1:
进制转换处理子程序
4.2主要功能程序段设计
4.2.1界面显示程序设计
首先是提示语句的定义:
NOTE1DB0AH,0DH,'YOUAREWELCOME!
',0AH,0DH,'$'
NOTE2DB0AH,0DH,'YOUCANQUITWITH"Q"OR"q"!
',0AH,0DH,'$'
NOTE3DB'',0AH,0DH,'$'
NOTE4DB'',0AH,0DH,'$'
程序段设计:
BEN1:
;**************设置BIOS调色板*********************
movah,00h;设置绘图模式
moval,13h;四色图形模式13
int10h;Bios
movah,0bh;设置调色板
movbh,0Fh;调色板ID
movbl,02h;颜色02
int10h;Bios
;*************显示欢迎语句*********************
LEADX,NOTE1
MOVAH,09H
INT21H
LEADX,NOTE2
MOVAH,09H
INT21H
CALLRECT
;********************************************
CALLFRAME1;调用绘制方框子程序
CALLFRAME2;调用显示数字子程序
;*************************************************
4.2.2字符的输入存储和高亮显示设计
将输入的两个有效数字存入A和B中,同时在计算器界面中,将输入的字符高亮显示。
YUNSUAN:
MOVX_POS,4;行
INCDX;列
MOVY_POS,DL
ADDY_POS,1
;MOVY_POS,8;列
CALLPOSITION
;******键盘输入*******
MOVAH,07H;无回显的键盘输入
INT21H
;***********显示键盘输入的字符********
MOVBH,00H
MOVBL,06H;2-红,4-橙红,6-橘黄,7-白,8-灰;;;;与上面一样
MOVCX,1
MOVAH,0AH
INT10H
;对应的数字高亮
CMPAL,'0'
JZH_L_0
CMPAL,'1'
JZH_L_1
CMPAL,'2'
JZH_L_2
CMPAL,'3'
JZH_L_3
CMPAL,'4'
JZH_L_4
CMPAL,'5'
JZH_L_5
CMPAL,'6'
JZH_L_6
CMPAL,'7'
JZH_L_7
CMPAL,'8'
JZH_L_8
CMPAL,'9'
JZH_L_9
CMPAL,'+'
JZH_L_ADD
CMPAL,'-'
JZH_L_SUB
CMPAL,'*'
JZH_L_MUL
CMPAL,'/'
JZH_L_DIV
CMPAL,0DH;回车键,显示'='
JZH_L_EQU
JMPEXIT1
H_L_0:
MOVX_POS,14
MOVY_POS,3
MOVBL,'0'
JMPCALL_H_L1
H_L_1:
MOVX_POS,11
MOVY_POS,3
MOVBL,'1'
JMPCALL_H_L1
H_L_2:
MOVX_POS,11
MOVY_POS,7
MOVBL,'2'
JMPCALL_H_L1
H_L_3:
MOVX_POS,11
MOVY_POS,11
MOVBL,'3'
JMPCALL_H_L1
H_L_4:
MOVX_POS,9
MOVY_POS,3
MOVBL,'4'
JMPCALL_H_L1
H_L_5:
MOVX_POS,9
MOVY_POS,7
MOVBL,'5'
JMPCALL_H_L1
H_L_6:
MOVX_POS,9
MOVY_POS,11
MOVBL,'6'
JMPCALL_H_L1
H_L_7:
MOVX_POS,6
MOVY_POS,3
MOVBL,'7'
JMPCALL_H_L1
H_L_8:
MOVX_POS,6
MOVY_POS,7
MOVBL,'8'
JMPCALL_H_L1
H_L_9:
MOVX_POS,6
MOVY_POS,11
MOVBL,'9'
JMPCALL_H_L1
H_L_ADD:
;;加减乘除显示有点问题
MOVX_POS,14
MOVY_POS,15
MOVBL,'+'
JMPCALL_H_L2
H_L_SUB:
MOVX_POS,11
MOVY_POS,15
MOVBL,'-'
JMPCALL_H_L2
H_L_MUL:
MOVX_POS,9
MOVY_POS,15
MOVBL,'*'
JMPCALL_H_L2
H_L_DIV:
MOVX_POS,6
MOVY_POS,15
MOVBL,'/'
JMPCALL_H_L2
H_L_EQU:
MOVX_POS,14
MOVY_POS,11
MOVBL,'='
JMPCALL_H_L3
CALL_H_L1:
CALLHIGHLIGHT
ADDFORTH_SUAN,1
CMPYUN_HAVE,1;判断运算符是否输入
JZNEXT3
CMPFORTH_SUAN,2;判断是否有一次数字输入
JZSTORE1_1
NEXT3:
ADDLATTER_SUAN,1
CMPLATTER_SUAN,2;判断运算符后是否有一次数字输入
JZSTORE2;有则存入第二个数
JMPYUNSUAN;没有则无条件转移到开头
STORE1_1:
MOVA,BX;存入第一个数
JMPYUNSUAN;返回输入状态
STORE2:
MOVB,BX;存入第二个数
JMPYUNSUAN;返回输入状态
4.2.3加减乘除计算段程序设计
通过判断输入的运算字符,确定属于哪一种运算,再转移到相应的程序段执行。
程序设计如下:
CALL_H_L3:
;键入了回车运算符,需显示运算结果
CALLHIGHLIGHT
CALLFRAME2;调用显示数字子程序
CMPAD_D,1
JZADD2
CMPSU_B,1
JZSUB2
CMPMU_L,1
JZMUL2
CMPDI_V,1
JZDIV2
ADD2:
;加法设计
MOVX_POS,4;行
MOVY_POS,13;列
CALLPOSITION
MOVAX,A
ADDAX,B
SUBAX,96;实际调试表明要减去96方可得到结果
CALLO_F2T10
JMPEXIT1
SUB2:
;减法设计
MOVX_POS,4;行
MOVY_POS,13;列
CALLPOSITION
MOVAX,A
SUBAX,B;两数相减
CALLO_F2T10
JMPEXIT1
MUL2:
;乘法设计
MOVX_POS,4;行
MOVY_POS,13;列
CALLPOSITION
MOVX_POS,4;行
MOVY_POS,13;列
CALLPOSITION
MOVAX,A
SUBAX,30H
MOVBX,B
SUBBX,30H
MULBX
CALLO_F2T10
JMPEXIT1
DIV2:
;除法设计
MOVX_POS,4;行
MOVY_POS,13;列
CALLPOSITION
MOVAX,A
SUBAX,30H
MOVDX,0
MOVBX,B
SUBBX,30H
DIVBx
CALLO_F2T10
5程序调试
运行程序后,进入程序运行初始界面,会有一个提示语句,按“Q”或“q”后,功能键显示为绿色,计算器处于工作状态。
如图5-1。
图5-1程序运行的初始界面
输入一个运算表达式,则对应的数字和运算符将处于高亮状态。
如图5-2。
图5-2输入一个表达式后的界面图
键入“Enter”,表达式被清除掉,相应的数字和字符也取消高亮。
同时也显示出表达式的计算结果。
如图5-3
图5-3计算结果的界面图
6心得体会
《微机原理与接口技术》作为自动化专业的学生一个非常重要的专业必修课,对我们的专业能力的培养,对实践动手能力的提升都有着非常重要的意义,是要引起我们大家重视的。
而微机原理的课程设计正是要求我们通过一个具体实在的任务,将我们所学的理论知识与实际需求相结合起来,以实际要求为出发点和归宿点,时刻考虑着实际生活的种种限制,通过我们小组内部不断探讨研究,一个个解决遇到的问题,最终做出一个比较完美的作品。
或许,我们我们在期末考试中都取得了不错的成绩。
然而在真正遇到课程设计这样一个比较实际的问题面前,很多人却傻了眼。
似乎,我们无从下手。
因为我们得到的信息太少了。
我们有太多的不懂。
所以,我们小组借助于各类图书,因特网,收集各类资料,不断研究我们小组的任务,细化其中的要求,一步步抽丝剥茧,渐渐地,我们就有了眉目,对整个过程也有了较为清晰的理解。
此外,在这次课程设计中,我更深刻的体会到了一点。
就是即学即用,很多时候,我们都会面临新的疑问,新的知识。
这个时候不是我们抱怨的时候,只有我们静下心来,钻研相关的资料,学习其中的知识,并结合自己所面临的问题,有针对性的去解决它,往往这个时候,我们会有意想不到的效果。
是的,以后当我们走进社会,我们会遇到形形色色的问题,而这些我们是不可能在学校里就学会了的。
所以这样一种思维方式,一种学习方式正是我们所需要的。
我感触比较深的另外一点是老师们对报告的高要求。
一开始的时候,本以为只要我们真正的把问题研究透了,理解了,报告随便写写就无所谓了。
然而这又是我的一个错误,因为报告正是我们设计成果的一个展示,我们不是要口述告诉老师,而是要通过我们的报告将我们的想法完整正确的呈现在老师面前。
这就要求我们必须尽可能把我们要表达的意思完整地在报告里表达出来。
此外,由于设计报告有一个规范的格式,我们也必须遵循,并且是严格的遵循,容不得我们一点随便。
可能在学校里,老师们对我们比较宽松,做的不好的我们还有机会拿回去修改,然而在以后的职场中,老板就不会那么仁慈了。
所以,我们现在就必须养成良好的习惯,遵循规范要求,做一个比较完美的报告。
总之,在本次课程设计中,我的收获还是比较大的。
无论是设计这程序还是写课程设计报告都让我学到了好多东西,有对课本知识更加深入的了解和掌握,也有对于流程图的设计以及绘制还有word的一些用法和排版等,都让我受益匪浅。
非常感谢学校和老师给我们安排了这次课程设计,不仅让我掌握了更多的知识,还让我领会到要把一件事情做好并真正有所收获还得靠自己独立地去完成并坚持不懈!
我要珍惜每一次课程设计的机会,让自己不断地提高。
参考文献
[1]周佩玲、彭虎、傅忠谦.微机原理与接口技术(基于16位机).北京:
电子工业出版社.2005
[2]何小海、严华.微机原理与接口技术.北京:
科学出版社,2006
[3]钱晓捷.新版汇编语言程序设计.北京:
电子工业出版社,2007
[4]马春燕.微机原理与接口技术(基于32位机)实验与学习辅导.北京:
电子工业出版社.2007
[5]黄海萍.汇编语言与微机接口技术实验教程.北京:
国防工业出版社.2007
附录(程序代码)
DATASSEGMENT
;******************定义欢迎画面**********************
NOTE1DB0AH,0DH,'YOUAREWELCOME!
',0AH,0DH,'$'
NOTE2DB0AH,0DH,'YOUCANQUITWITH"Q"OR"q"!
',0AH,0DH,'$'
NOTE3DB'',0AH,0DH,'$'
NOTE4DB'',0AH,0DH,'$'
;******************定义光标位置**********************
X_POSDB20;行
Y_POSDB20;列
;*****************定义运算变量**********************
ADW0;为一个字
BDW0
;***************************
BUF0DB4DUP(0)
;************************
FORTH_SUANDB1
LATTER_SUANDB1
YUN_HAVEDB?
;判断运算符是否输入
;********定义键入的符号********
AD_DDB?
;+
SU_BDB?
;-
MU_LDB?
;*
DI_VDB?
;/
;******************定义个方框***********************
yposdw52;定义列起始位置0-639
xposdw60;定义行起始位置0-199
colordb?
;0-无色,1-绿,2-红,3-橘黄,4-橙红,5-紫红,7-白,8*-灰,9-蓝,10-绿,11-青绿,12-粉红,14-黄,15-白
cnt1DW0;定义方框宽度
cnt2DW0;定义方框长度
lendb0
DATASENDS
STACKSSEGMENT
DB512DUP(?
)
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
BEN1:
;**************设置BIOS调色板*********************
movah,00h;设置绘图模式
moval,13h;四色图形模式13
int10h;Bios
movah,0bh;设置调色板
movbh,0Fh;调色板ID
movbl,02h;颜色02
int10h;Bios
;*************显示欢迎语句*********************
LEADX,NOTE1
MOVAH,09H
INT21H
LEADX,NOTE2
MOVAH,09H
INT21H
CALLRECT
;********************************************
CALLFRAME1;调用绘制方框子程序
CALLFRAME2;调用显示数字子程序
;************************************************
MOVAH,08H;按O键打开计算器
INT21H
CMPAL,'O'
JZOPEN
CMPAL,'o'
JZOPEN
CMPAL,'q'
JZEXIT
CMPAL,'Q'
JZEXIT
JMPBEN1;跳转至等待按