微机原理课程设计报告文档格式.docx
《微机原理课程设计报告文档格式.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计报告文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
八.系统模块详细设计与调试5
一)系统模块详细设计5
1、设置屏幕显示方式5
2、显示主菜单6
3、从键盘接收一个数字6
4、接收键入用于计算的数6
5、显示结果6
6、子程序A26
7、A3程序段7
二)程序编译、运行与调试7
九.运行结果7
1.进入系统8
2.加法运算8
3.减法运算9
4.乘法运算9
5.除法运算10
6.退出系统10
十.设计总结10
十一.参考文献11
十二.附件材料11
一.设计题目
简易计算器
二.主要内容
编制一个程序,利用BIOS和DOS的中断来设计一个计算器,要求在屏幕上显示一个主菜单,提示用户输入相应的数字键,分别执行加、减、乘、除四种计算功能和结束程序的功能。
利用BIOS中断的10号功能调用来设置显示方式。
利用DOS中断的01号和02号子功能来完成键盘接收,结果显示。
三.具体要求
编写一个程序,能从键盘上读入数据,并完成加、减、乘、除的计算。
四.进度安排
周一
周二
周三
周四
周五
讲课设内容,安排任务
查资料,确定硬件电路方案
编程调试
写总结报告
五.成绩评定
考核方法:
现场验收(占50%),课程设计报告(占50%)。
考核内容:
学习态度(出勤情况,平时表现等)、方案合理性、程序编制质量、演示效果、设计报告质量。
成绩评定:
优,良,中,及格,不及格。
特别说明:
如发现抄袭,按照不及格处理。
六.总体方案
利用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。
七.原理框图
a)主程序b)计算子程序
八.系统模块详细设计与调试
一)系统模块详细设计
1、设置屏幕显示方式:
MOVAH,00H
MOVAL,2
通过调用BOIS的OOH号功能来设置屏幕显示方式。
此处AL=2,即设置屏幕显示方式为80*25黑白文本。
2、显示主菜单:
MOVAH,09H
MOVDX,OFFSETTOP
先在数据段中定义主菜单中要显示的字符串,再通过调用DOS系统的09H号功能——显示字符串(串尾字符为$,但不显示)来完成。
3、从键盘接收一个数字:
MOVAH,01H
通过调用DOS系统的01H号功能——键入字符并回车来实现,其出口参数为键入字符的ASCII码,存在AL中。
4、接收键入用于计算的数:
MOVAH,0AH
MOVDX,OFFSETBUF1
通过调用DOS系统的0AH号功能——键入字符串至内存缓冲区来实现,其入口参数如下:
DS:
DX=存放键入字符串的缓冲区的首地址;
(DS:
DX)=用户规定的缓冲区;
DX+1)=实际键入的字符数;
从(DS:
DX+2)开始放键入的字符串。
因此,在下面的程序中运用所键入的数字时要注意字符串的首地址。
5、显示结果:
MOVDX,OFFSETBUF3
将结果存入数据段中定义的缓冲区BUF3中,再通过调用DOS系统的09H号功能——显示字符串(串尾字符为$,但不显示)来完成。
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)结果为二进制数。
7、将计算结果的二进制数转换为对应的十进制数ASCII码并输出显示(A3程序段):
该模块的程序设计详见附件材料——程序清单及说明中A3、BB程序段
二进制数在AX内;
转换后的ASCII码在BUF内。
AX内的数范围在+32767到-32768之间,先检查AX符号位,决定输出‘+’还是‘-’,若为负,先求补码得到原码后可与正数统一处理。
方法:
把将被转换的二进制数先除以10000,商为万位数,再将余数除以1000,商为千位数,以此类推,求出百十位数,剩下的为个位数。
最后各个数加上30H,即为对应字符。
二)程序编译、运行与调试
在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来调试。
它通过单步、设置断点等方式为汇编语言程序员提供了非常有效的调试手段。
九.运行结果
1.进入系统
2.加法运算
3.减法运算
4.乘法运算
5.除法运算
6.退出系统
十.设计总结
此次课程设计,我根据以往的一些经验教训,一步一步进行设计制作,首先根据题目及设计要求,去图书馆或上网搜集相关资料。
接着根据资料设计合适的方案,调试。
最终在努力下成功完成了这次设计任务。
这次课程设计不仅锻炼了我最基本的微机原理方面的设计能力,更重要的是让我更深刻的认识了微机原理这门课程在实际中的应用,检验了我的学习情况,加深了对书本中理论知识的认识,也更有利于我们对这门课程的理解。
在此次设计时我们也遇到了不少的困难和问题,如ASCII码的二进制转换……但在共同努力下,最终还是克服了这些困难,使问题得到了解决。
其中遇到的问题很多都是在书上不能找到的,需要自身的一次次实践。
也正是在这个过程中,使我初步学会了如何解决实际问题。
本次的课程设计要感谢老师在课程设计过程中给予的指导和宿舍的同学的帮助,这是我们团结协作一起努力的结果,这次的课程设计后,我们会将这次过程中锻炼的出的动手能力和理解能力运用到以后的学习中,使以后的学习更上一层楼。
十一.参考文献
《微机原理实验与课程设计指导书》,陆红伟编,中国电力出版社,2006年
《8086微型计算机组成、原理及接口》,顾滨,机械工业出版社,2001年
《微型计算机原理及应用》,吕淑萍等,哈尔滨工程大学出版社,2004年
《微型计算机技术及应用》,戴梅萼,清华大学出版社,2005年
《微机原理及应用》,徐晨等编,高等教育出版社,2004年
《微机原理、汇编与接口技术实验教程》,朱定华编,清华大学出版社,2007年
十二.附件材料
程序清单及说明:
DATASEGMENT
N=15
TOPDB5DUP(0AH)
DBNDUP('
'
),'
Pleaseinputanumbertochoosethearithmeticoperation'
0DH,0AH
DBNDUP('
DBNDUP('
1—add2—subtract3—multiply'
4—divideq—returntoDOS'
Choice(1.2.3.4.q):
$'
MESG1DB0DH,0AH,'
Pleasepressnumber1.2.3.4.q!
MESG2DB0DH,0AH,'
Pleaseinputthefirstnumber:
MESG3DB0DH,0AH,'
Pleaseinputthesecondnumber:
MESG4DB0DH,0AH,'
PlayAdd:
$