微机原理课程设计Word文档格式.docx
《微机原理课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
备注
1
选择课程设计题目,查阅相关资料
周二
2
进行软硬件设计
周三
3
上机调试
周四
4
撰写设计报告
5
演示及答辩
周五
四、设计成果要求
1.系统硬件设计合理,软件编程达到设计要求。
2.系统硬件结构图和软件流程图绘制清楚规范。
3.设计报告完整规范。
五、考核方式
根据设计任务的完成情况、课程设计报告撰写情况及演示答辩情况采用五级记分制评定成绩。
201002020211李俊杰201002020224张茜201002020228周小朋
《微机原理及应用》课程设计
一、课程设计目的与要求
5.提高学生的实践动手能力和创新能力
二、课程设计正文
设计题目一:
求最大公约数
设计任务及要求:
提示输入两个小于100的十进制正整数,求出这两个数的最大公约数,数据的输入和结果的输出都要有必要的提示,且提示独占一行。
(1)在屏幕上显示INPUTSTRING1:
”,“INPUTSTRING2:
”,“GREATESTCOMMONDIVISORIS:
”;
(2)在键盘上输入两个数并在屏幕上显示,每个数以ENTER键结束;
(3)把输入的十进制数转换成二进制数,并求出它们的最大公约数;
(4)把二进制表示的最大公约数转换成ASCII码,并在屏幕上显示。
设计题目二:
大奖赛计分程序
从键盘上输入十个十进制数(一位或两位的整数),代表十个评委的评分,减去十个数的最大数和最小数,求出平均值,并在屏幕上以十进制显示。
(1)在屏幕上显示“INPUT:
(2)输入分数并在屏幕上显示,每个分数以ENTER键结束;
(3)把输入的十进制数转换成二进制数,并求出最大数和最小数;
(4)求出十个数的总和,减去最大数和最小数后再求平均数;
(5)把二进制的平均数转换成十进制,并在屏幕上显示。
三、课程设计总结:
(1)求最大公约数
这次的微原课程设计,老师提供了硬件和软件两个大的方向给我们,但我从几次的微原实验发现我对硬件的掌握和理解确实不好,所以我选择了做软件类的课程设计。
课上老师说可根据提供的题目参考着来自己选择对应的题目,所以我们选择了两个题目,分别是求最大公约数和大奖赛计分程序的设计。
一开始以为题目要求的把输入的两个数的所有公约数显示出来比较麻烦,所以改成了求最大公约数,可编着才知道求最大公约数的算法实在比较难想,废了不少时间。
在求最大公约数的编程中,遇上了好几个麻烦,其中我觉得比较有代表性的是以下几个方面:
<
1>
输入两个数的问题,是紧接着程序分别写输入程序还是采用CALL函数调用,但一看后面的第二个课题要输入10个数,我们果断的选择了函数调用的方法,但还是不知道该怎么设计输入程序,因为根本没见过,最后在一本参考书中发现了经典的多位数输入程序函数,也就是我们程序中的INPUT函数,才解决了输入的问题;
2>
最大公约数的核心算法不清楚,因为我们学到的汇编毕竟是低级语言,和以前的C++相比,它的算法一定要更精巧和简洁。
在网上搜到了它的核心算法后,我们自己编写了求最大公约数的这一部分程序,没有参照任何的资料,感觉很棒;
3>
输出最大公约数时该怎么输出的思想也是很模糊的,对是根据它有一位还是两位分别跳转到对应的输出段还是直接编写对一位数和两位数都有效的输出程序拿捏不定。
最后在网上找到了输出一位的程序段,我们相互讨论和摸索之后,编出了现在能输出两位数的程序;
4>
对编译错误的改正还比较简单,但程序中出现了能编译、能输入、能输出但结果不对的问题。
从头到尾查了好几遍,但就是找不到问题。
最后输入了很多遍,从输出结果看出了规律才找到了问题所在。
那段错误程序如下:
MOVAL,BL;
最大公约数计算结束,把最大公约数保存到AL中
XORAH,AH;
将AL中的一个8位无符号数扩展成16位,存放在AX中
MOVCL,10
DIVCL;
将公约数除以10,商就是显示器十位上的值,余数就是各位的值
CMPAL,0
JZNEXT3;
若AL中的商等于0,则直接跳到NEXT3,不显示十位上的0
MOVDL,AL
ADDDL,30H
MOVAH,2
INT21H;
若AL中的商不为0,则输出显示在屏幕上
NEXT3:
ANDDL,0
MOVDL,AH
ANDAH,0
INT21H
大量的对程序进行实验才发觉输入两个一位的数字时候是完全正确的,而输入的两个数的最大公约数是两位时,输出结果的个位总是要不正确要不和正确值偏差点,再实验后发现输入的两个数的最大公约数是两位时,输出结果的个位永远是2,我们这才发现了问题是在哪。
原来如果输入两个最大公约数是两位的数时,第一次取的余数(也就是输出数的个位)默认放在了AH里,而02H功能调用输出十位上的数时,AH被重新赋值了2,所以输出显示的也永远是2,。
而当输入的两个数的最大公约数是一位时,在CMPAL,0
JZNEXT3那里就跳转到了输出个位的指令,从而输出正确。
最后把AH中的个位先赋给了一个空闲寄存器,等输出个位时再掉用那个空闲寄存器而不是AH就轻松解决了问题,可找过程的过程确实很艰辛,但也弄懂了很多很多其他的东西。
最后就是对程序进行解释说明了,写好之后才发觉会编程和能说清楚是两码事,但本来还是有点模糊的程序写完注释之后就感觉特别的清晰明朗,这不得不说是意外的收获。
(2)大奖赛计分程序
源程序建立以后要对其进行汇编,汇编程序会指出源程序中的错误,这些错误要经过调试阶段才能纠正,从而得到正确的结果。
常用的调试程序为DEBUG程序,它通过单步,设置断点等方式提供了非常有效的调试手段。
现将本程序设计中遇到的错误和修正总结如下:
1.在初次编译时,汇编程序提示有大量错误,仔细检查后发现比较指令格式运用出错,不能对两个存储器数直接进行比较。
原程序CMPAA,BB修改后MOVAL,AA
MOVBL,BB
MOVAL,BL
2.将源程序再次汇编后得到没有语法错误OBJ文件,然后用LINK程序把OBJ文件转换成可执行的EXE文件,在DOS环境下可直接运行该文件,但运行后系统提示除数溢出,我们在程序中找不到错误,只好用DEBUG调试。
只需EDIT环境,输入TDEBUG加文件名之后回车,就可以进入DEBUG环境进行程序调试。
我们根据系统提示用F8单步进行调试,观察每一步结果,当执行到数值转换哪里时,我们发现结果出现了问题,两位数转换之后是正确的,但一位数却出现了错误。
于是对程序进行了修改,但还是出现了错误,最后通过查阅书籍得到了一个可以将键盘上输入的0~99之间的十进制整数转换成响应二进制并存储的程序(程序段中的INPUT子程序),我们经过仔细研究并看懂了这个程序,然后用他换掉了原来的换码程序,并通过CALL指令来调用此子程序。
3.继续编译执行,这次依然没有出现语法上的错误,但通过计算器检验程序的输出结果依然有误,通过仔细检查程序发现,对十个数进行相加后把总和放到了AL寄存器里面,造成溢出,从而输出了错误了结果,然后我们又对程序作了相应修改。
原程序:
ADDAL,BL
修改后:
ADDAX,BX
再次编译,通过几次计算器的检验,程序均得到了正确的结果。
本程序设计结束。
通过本次试验,我们掌握了汇编程序的基本设计方法,加深了对本门课程的理解和掌握,达到了本次课程设计的目的。
附录:
求最大公约数程序:
DATASEGMENT;
数据段定义
STRING1DB'
INPUTSTRING1:
$'
STRING2DB'
INPUTSTRING2:
STRING3DB'
GREATESTCOMMONDIVISORIS:
$'
AADB20DUP(?
)
BBDB20DUP(?
)
DATAENDS;
数据段定义结束
CODESEGMENT;
代码段定义
ASSUMECS:
CODE,DS:
DATA;
定义代码段和数据段的默认寄存器
START:
MOVAX,DATA;
程序开始执行
MOVDS,AX
LEADX,STRING1;
取第一个提示语的有效地址放入DX中
MOVAH,09H
输出第一个提示输入语
CALLINPUT;
调用函数INPUT,输入第一个数
MOVAA,BL;
将第一个数存入存储空间AA中
LEADX,STRING2;
取第二个提示语的有效地址放入DX中
输出第二个提示输入语
CALLINPUT;
输入第二个数数
MOVBB,BL;
将第二个数存入存储空间BB中
LEADX,STRING3;
取第三个提示语的有效地址放入DX中
输出结果提示语
MOVAL,AA
MOVBL,BB
CMPAL,BL
JGNEXT
XCHGAL,BL;
把输入的两个数取出,较大的数存入AL,较小的数存入BL
NEXT:
ANDAH,0;
用辗转相除法求最大公约数
DIVBL
CMPAH,0
JZNEXT2;
AL中的数除以BL中的数,直到AH中存的余数等于0跳转到NEXT2
MOVAL,BL;
若AH中的余数不等于0,继续进行最大公约数的计算
MOVBL,AH
JMPNEXT
NEXT2:
MOVCH,AH;
把余数放入空闲寄存器CH,防止02H功能调用重新对AH赋值
MOVDL,CH
把CH中的余数也就是个位紧接着十位显示在屏幕上
INPUT:
MOVBX,0;
定义输入函数INPUT,供CALL指令随时调用
ABC:
MOVAH,1
01H功能调用,输入第一个数的第一个数字到AL中
CMPAL,0DH
JZEXIT;
判断输入是否是回车键,是的话说明输入结束,跳转到EXIT返回源程序
ANDAX,000FH
XCHGAX,BX;
若不是回车键,则把AH清零,和BX中的数据交换
MOVCX,10
MULCX
ADDBX,AX
JMPABC
EXIT:
RET;
输入数字结束,输入的数存在BX寄存器中返回源程序
CODEENDS;
代码段定义结束
ENDSTART;
程序结束
求最大公约数的程序流图:
大奖赛计分程序的设计程序:
DATASEGMENT;
STRING0DB'
INPUT0:
INPUT1:
INPUT2:
INPUT3:
STRING4DB'
INPUT4:
STRING5DB'
INPUT5:
STRING6DB'
INPUT6:
STRING7DB'
INPUT7:
STRING8DB'
INPUT8:
STRING9DB'
INPUT9:
MAXDB16DUP(?
MINDB16DUP(?
AADB16DUP(?
BBDB16DUP(?
CCDB16DUP(?
DDDDB16DUP(?
EEDB16DUP(?
FFDB16DUP(?
GGDB16DUP(?
HHDB16DUP(?
IIDB16DUP(?
JJDB16DUP(?
CODESEGMENT;
代码段定义
MOVAX,DATA;
LEADX,STRING0;
取第一个提示语的有效地址
09H功能调用
调用函数INPUT,开始输入数字
MOVAA,BL;
将输入的数字存入存储空间AA
LEADX,STRING1;
重复上述过程,将输入的数字存入相应的存储空间
INT21H
CALLINPUT
MOVBB,BL
LEADX,STRING2
MOVCC,BL
LEADX,STRING3
MOVDDD,BL
LEADX,STRING4
MOVEE,BL
LEADX,STRING5
MOVFF,BL
LEADX,STRING6
MOVGG,BL
LEADX,STRING7
MOVHH,BL
LEADX,STRING8
MOVII,BL
LEADX,STRING9
MOVJJ,BL;
输入数字结束,将第十个数字存入存储空间JJ
MOVAL,AA;
开始分别调用十个存储空间里的数进行比较,把最大的数存到AL中
JANEXT1
XCHGAL,BL
NEXT1:
MOVBL,CC
JANEXT2
NEXT2:
MOVBL,DDD
JANEXT3
MOVBL,EE
JANEXT4
NEXT4:
MOVBL,FF
JANEXT5
NEXT5:
MOVBL,GG
JANEXT6
NEXT6:
MOVBL,HH
JANEXT7
NEXT7:
MOVBL,II
JANEXT8
NEXT8:
MOVBL,JJ
JANEXT9
NEXT9:
MOVMAX,AL;
将输入的最大值放入存储空间MAX中,找寻最大数值过程结束
开始分别调用十个存储空间里的数进行比较,把最小的数存到AL中
JBNEXT11
NEXT11:
JBNEXT22
NEXT22:
JBNEXT33
NEXT33:
JBNEXT44
NEXT44:
JBNEXT55
NEXT55:
JBNEXT66
NEXT66:
JBNEXT77
NEXT77:
JBNEXT88
NEXT88:
JBNEXT99
NEXT99:
MOVMIN,AL;
将输入的最小数放入存储空间MIN,找寻最小数值过程结束
MOVBL,BB;
把AA和BB中的值分别赋给AL和BL,让随后的运算程序得以执行
XORAH,AH
XORBH,BH;
把AH和BH清零,防止累加之后AL存储空间不够占用AH的空间
ADDAX,BX;
依次进行累加,把累加值存入AX
MOVBL,CC
ADDAX,BX
MOVBL,DDD
MOVBL,EE
MOVBL,FF
MOVBL,GG
MOVBL,HH
MOVBL,II
MOVBL,JJ
ADDAX,BX;
将10个数的和放在AX寄存器中,累加结束
MOVBL,MAX;
将最大值赋给BL
BH清零,使随后减法运算BX中只有最大值MAX的数据
SUBAX,BX
MOVBL,MIN;
将最小值赋给BL,因BH没用到,所以这里不用再次清零
SUBAX,BX;
减去最大数和最小数,将结果保存在AX中
MOVCL,8
DIVCL
MOVDH,AH;
将8个数的和除8后的余数放在DH寄存器中
XORAH,AH;
开始把整数部分输出,AH清零,防止后面DIV运算中AH影响结果
MOVCL,10
MOVCH,AH;
把要输出的整数部分的个位数赋给CH,防止后续功能调用时覆盖AH
JZNEXT;
判断输出的最高位是否为0,若是则跳转,不显示在屏幕上
ADDDL,30H;
将相应的数转换成对应的ASCII码
INT21H;
若输出的最高位不为0,则用02H功能调用显示在屏幕上
NEXT:
MOVDL,CH;
把要显示数的个位上的数赋给DL
将要显示数的个位上的数转换成ASCII码
将要显示数的个位上的数紧接着十位输出在屏幕上
MOVDL,2EH
MOVAH,02H
将小数点显示在屏幕上
MOVAL,DH
MULCL
MOVDL,AL;
先对8位数的和除以8的余数乘10再除以8,商就是小数第一位
把该过程的余数赋给空闲寄存器DH,防止后面02H功能调用覆盖AH
ADDDL,30H;
将第一位小数转换成相应的ASCII码
将第一位小数显示在屏幕上
XORAL,AL
MOVAL,DH;
把DH中的余数赋给AL,开始求第二位小数
AH清零,防止前面02H功能调用赋给AH的数值影响
同求第一个小数时的原理
MOVDH,AH
将第二位小数转换成对应的ASCII码
将第二位小数显示在屏幕上
XORAL,AL;
开始计算第三位小数
由于8个整数的和除以8最多会产生3位小数,因此此运算没有余数
将第三位小数转换成对应的ASCII码
将第三位小数显示在屏幕上
INPUT:
MOVBX,0;
MOVAH,1
CMPAL,0DH
ANDAX,000FH
输入数字结束,输入的数存在BX寄存器中返回源