
求最大公约数和大奖赛计分程序微机原理课程设计1.doc
17页课程设计报告( 2012—2013 年度第 一 学期)课 程:微机原理及应用 题 目:求最大公约数和大奖赛计分程序院 系:自动化系班 级:自动化1002班学 号:学生姓名:指导教师:设计周数:成 绩: 日期:2013年 1 月 11 日《微机原理及应用》课程设计任 务 书一、 目的与要求1. 通过对微机系统分析和具体设计,使学生加深对所学课程的理解2. 掌握汇编语言程序设计的基本方法和典型接口电路的基本设计方法3. 培养学生分析问题、解决问题的能力4. 培养学生对微型计算机应用系统的基本设计能力5. 提高学生的实践动手能力和创新能力二、 主要内容1. 求最大公约数和大奖赛计分程序2. 根据所选题目的要求对微机系统进行程序设计,绘制程序总体流程图并编写源程序上机调试3. 写出课程设计报告,对整个设计过程进行归纳和综合,对设计中所存在的问题和不足进行分析和总结,提出解决的方法、措施、建议和对这次设计实践的认识和收获 三、 进度计划序号设计内容完成时间备注1选择课程设计题目,查阅相关资料周二2进行软硬件设计周三3上机调试周四4撰写设计报告周四5演示及答辩周五四、 设计成果要求1. 系统硬件设计合理,软件编程达到设计要求。
2. 系统硬件结构图和软件流程图绘制清楚规范3. 设计报告完整规范五、 考核方式根据设计任务的完成情况、课程设计报告撰写情况及演示答辩情况采用五级记分制评定成绩学生姓名:201002020211 李俊杰 201002020224 张茜 201002020228 周小朋指导教师:焦嵩鸣 《微机原理及应用》课程设计 一、课程设计目的与要求1. 通过对微机系统分析和具体设计,使学生加深对所学课程的理解2. 掌握汇编语言程序设计的基本方法和典型接口电路的基本设计方法3. 培养学生分析问题、解决问题的能力4. 培养学生对微型计算机应用系统的基本设计能力5. 提高学生的实践动手能力和创新能力二、课程设计正文设计题目一:求最大公约数设计任务及要求:提示输入两个小于100的十进制正整数,求出这两个数的最大公约数,数据的输入和结果的输出都要有必要的提示,且提示独占一行1)在屏幕上显示INPUT STRING1:”,“INPUT STRING2:”, “GREATEST COMMON DIVISOR IS:”;(2)在键盘上输入两个数并在屏幕上显示,每个数以ENTER键结束;(3)把输入的十进制数转换成二进制数,并求出它们的最大公约数;(4)把二进制表示的最大公约数转换成ASCII码,并在屏幕上显示。
设计题目二:大奖赛计分程序设计任务及要求:从键盘上输入十个十进制数(一位或两位的整数),代表十个评委的评分,减去十个数的最大数和最小数,求出平均值,并在屏幕上以十进制显示1)在屏幕上显示“INPUT:”;(2)输入分数并在屏幕上显示,每个分数以ENTER键结束;(3)把输入的十进制数转换成二进制数,并求出最大数和最小数;(4)求出十个数的总和,减去最大数和最小数后再求平均数;(5)把二进制的平均数转换成十进制,并在屏幕上显示三、课程设计总结:(1)求最大公约数 这次的微原课程设计,老师提供了硬件和软件两个大的方向给我们,但我从几次的微原实验发现我对硬件的掌握和理解确实不好,所以我选择了做软件类的课程设计课上老师说可根据提供的题目参考着来自己选择对应的题目,所以我们选择了两个题目,分别是求最大公约数和大奖赛计分程序的设计一开始以为题目要求的把输入的两个数的所有公约数显示出来比较麻烦,所以改成了求最大公约数,可编着才知道求最大公约数的算法实在比较难想,废了不少时间在求最大公约数的编程中,遇上了好几个麻烦,其中我觉得比较有代表性的是以下几个方面:<1> 输入两个数的问题,是紧接着程序分别写输入程序还是采用CALL函数调用,但一看后面的第二个课题要输入10个数,我们果断的选择了函数调用的方法,但还是不知道该怎么设计输入程序,因为根本没见过,最后在一本参考书中发现了经典的多位数输入程序函数,也就是我们程序中的INPUT函数,才解决了输入的问题;<2> 最大公约数的核心算法不清楚,因为我们学到的汇编毕竟是低级语言,和以前的C++相比,它的算法一定要更精巧和简洁。
在网上搜到了它的核心算法后,我们自己编写了求最大公约数的这一部分程序,没有参照任何的资料,感觉很棒;<3> 输出最大公约数时该怎么输出的思想也是很模糊的,对是根据它有一位还是两位分别跳转到对应的输出段还是直接编写对一位数和两位数都有效的输出程序拿捏不定最后在网上找到了输出一位的程序段,我们相互讨论和摸索之后,编出了现在能输出两位数的程序;<4> 对编译错误的改正还比较简单,但程序中出现了能编译、能输入、能输出但结果不对的问题从头到尾查了好几遍,但就是找不到问题最后输入了很多遍,从输出结果看出了规律才找到了问题所在那段错误程序如下:MOV AL,BL ;最大公约数计算结束,把最大公约数保存到AL中 XOR AH,AH ;将AL中的一个8位无符号数扩展成16位,存放在AX中 MOV CL,10 DIV CL ;将公约数除以10,商就是显示器十位上的值,余数就是各位的值 CMP AL,0 JZ NEXT3 ;若AL中的商等于0,则直接跳到NEXT3,不显示十位上的0 MOV DL,AL ADD DL,30H MOV AH,2 INT 21H ;若AL中的商不为0,则输出显示在屏幕上 NEXT3:AND DL,0 MOV DL,AH ADD DL,30H AND AH,0 MOV AH,2 INT 21H 大量的对程序进行实验才发觉输入两个一位的数字时候是完全正确的,而输入的两个数的最大公约数是两位时,输出结果的个位总是要不正确要不和正确值偏差点,再实验后发现输入的两个数的最大公约数是两位时,输出结果的个位永远是2,我们这才发现了问题是在哪。
原来如果输入两个最大公约数是两位的数时,第一次取的余数(也就是输出数的个位)默认放在了AH里,而02H功能调用输出十位上的数时,AH被重新赋值了2,所以输出显示的也永远是2,而当输入的两个数的最大公约数是一位时,在CMP AL,0JZ NEXT3那里就跳转到了输出个位的指令,从而输出正确最后把AH中的个位先赋给了一个空闲寄存器,等输出个位时再掉用那个空闲寄存器而不是AH就轻松解决了问题,可找过程的过程确实很艰辛,但也弄懂了很多很多其他的东西最后就是对程序进行解释说明了,写好之后才发觉会编程和能说清楚是两码事,但本来还是有点模糊的程序写完注释之后就感觉特别的清晰明朗,这不得不说是意外的收获2)大奖赛计分程序源程序建立以后要对其进行汇编,汇编程序会指出源程序中的错误,这些错误要经过调试阶段才能纠正,从而得到正确的结果常用的调试程序为DEBUG程序,它通过单步,设置断点等方式提供了非常有效的调试手段现将本程序设计中遇到的错误和修正总结如下:1.在初次编译时,汇编程序提示有大量错误,仔细检查后发现比较指令格式运用出错,不能对两个存储器数直接进行比较原程序 CMP AA,BB 修改后 MOV AL,AA MOV BL,BB MOV AL,BL2.将源程序再次汇编后得到没有语法错误OBJ文件,然后用LINK程序把OBJ文件转换成可执行的EXE文件,在DOS环境下可直接运行该文件,但运行后系统提示除数溢出,我们在程序中找不到错误,只好用DEBUG调试。
只需EDIT环境,输入TDEBUG加文件名之后回车,就可以进入DEBUG环境进行程序调试我们根据系统提示用F8单步进行调试,观察每一步结果,当执行到数值转换哪里时,我们发现结果出现了问题,两位数转换之后是正确的,但一位数却出现了错误于是对程序进行了修改,但还是出现了错误,最后通过查阅书籍得到了一个可以将键盘上输入的0~99之间的十进制整数转换成响应二进制并存储的程序(程序段中的INPUT子程序),我们经过仔细研究并看懂了这个程序,然后用他换掉了原来的换码程序,并通过CALL指令来调用此子程序3.继续编译执行,这次依然没有出现语法上的错误,但通过计算器检验程序的输出结果依然有误,通过仔细检查程序发现,对十个数进行相加后把总和放到了AL寄存器里面,造成溢出,从而输出了错误了结果,然后我们又对程序作了相应修改原程序:ADD AL,BL修改后:ADD AX,BX再次编译,通过几次计算器的检验,程序均得到了正确的结果本程序设计结束通过本次试验,我们掌握了汇编程序的基本设计方法,加深了对本门课程的理解和掌握,达到了本次课程设计的目的 附录:求最大公约数程序:DATA SEGMENT ;数据段定义STRING1 DB 'INPUT STRING1:$'STRING2 DB 'INPUT STRING2:$'STRING3 DB 'GREATEST COMMON DIVISOR IS: $'AA DB 20 DUP(?) BB DB 20 DUP(?)DATA ENDS ;数据段定义结束CODE SEGMENT ;代码段定义 ASSUME CS:CODE,DS:DATA ;定义代码段和数据段的默认寄存器START: MOV AX,DATA ;程序开始执行 MOV DS,AX LEA DX,STRING1 ;取第一个提示语的有效地址放入DX中 MOV AH,09H INT 21H ;输出第一个提示输入语 CALL INPUT ;调用函数INPUT,输入第一个数 MOV AA,BL ;将第一个数存入存储空间AA中 LEA DX,S。












