您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 汇编语言 完全数 课程设计报告书
汇编语言课程设计课程设计任务书学生姓名王丽专业班级软件0302班指导老师陈天祥工作单位武汉理工大学题目:打印完全数一个数,若约数(不含它本身)的和恰好等于它本身就称为完全数初始条件:理论:学完汇编课程,掌握汇编语言的使用。实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。要求完成的主要任务:1.本次课程设计着重于理论设计,同时培养动手能力。要求运用自己所学知识进行设计实现,体现自己的知识掌握水平。所作设计需进行论证,一方面是从理论上进行推理验证,另一方面是实验论证。2.阅读有关的参考资料,熟悉开发工具,运用软件工程设计方法,进行系统总体分析与设计,规划出系统的总体机构,每个功能的分布情况,以形成系统的框架设计。3.程序用汇编语言开发完成,严禁抄袭(发现后抄袭者和被抄袭者一律不及格)。4.完成整个程序的设计及调试、测试工作后,应提供相应的课程设计报告书及程序总体分析与算法设计和源程序代码等。5.课程设计报告书内容:(1)设计题目(2)设计要求(3)设计思路及程序清单(5)运行结果(6)心得体会6.要求按格式规范撰写课程设计报告文档,文档中包括系统结构图,代码设计说明以及各功能模块程序的设计说明和各功能选项的使用要求及条件,各输入输出数据的约束条件及代码的使用等。7.课程设计报告格式应尽可能规范,易读易懂,说明问题;学生自己排版、打印全部课程设计报告书内容;学生要按指定时间上交课程设计报告书。时间安排:1、12月26日至12月27日接受课程设计,阅读有关的参考资料,熟悉开发工具,运用软件工程设计方法,对设计题目进行总体分析与算法设计。.2、12月28日至12月29日编写程序,到实验室进行程序调试。3、12月30日至12月31日继续到实验室进行程序调试、完善。撰写课程设计报告书,到实验室进行编缉排版,交课程设计报告书。指导教师签名:年月日系主任(或责任教师)签名:年月日汇编语言课程设计11.设计题目打印完全数2.设计要求用汇编程序MASM,编写一个程序,打印10000以内的完全数。若一个数的约数(不含它本身)的和恰好等于它本身,则该数是完全数。用循环除法(除数从2到被检测数)循环判断2――10000的数是否是完全数。根据题目,运用所学的汇编知识和程序设计知识,完善设计思路,尽量使程序完整,具有模块化,易懂;熟悉汇编程序环境,掌握汇编命令和汇编语言,增强动手能力;增强独立解决问题的能力。3.设计思路3.1原始条件及参数:被除数以双字为单位,高16位保存在DX中,低16位保存在AX中,初始值为2;检测范围用n来限定除数以字位单位,用count表示,保存在BX中,初始值为2约数和保存在CX中,初始值为13.2算法设计及流程图:3.2.1主程序算法及流程图:初始条件:设i为被除数,j为除数,t为余数,c为约数和Inti=2;//被除数从2开始循环体:While(i=10000)//求10000以内的完全数{intj=2,c=1;//除数从2开始,约数和初始为1While(j=i)//除数小于被除数{t=imodj;//求模If(t==0){c=j+c;}//如果能够整除,保存约数和j++;}//除数自增if(c==i)printi;//打印完数汇编语言课程设计2i++;}//被除数自增退出:Exit3.2.2print子程序算法及流程图开始2—n1—cx,2—countn—ax,0—dxax/bx—dx,bx==axPrinticx=axdx=0cx+bx—cx,InccountNNN结束Incnn==10000汇编语言课程设计3初始条件:被除数保存在AX中,将除数设置为10将BX,CX压入堆栈,保护现场循环体:被除数除以10,将余数压入堆栈,堆栈中数目加1继续除以10,直到被除数不可以再除弹出堆栈中的内容退出:Exit初始值:n—ax将bx,cx压入堆栈,保存数据0ah—cx,0—dx0—dxdivcx将dx压入堆栈bx+1—bxcmpax,0ax==0dx以ASCII码形式输出结束N汇编语言课程设计44.程序清单datasegmentndw10000;求10000以内的完数countdw?;作为除数dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axmovn,2;从2开始判断是否视完数l1:movcount,2;cx保留约数和,初始值为1movcx,1;bx作为除数,从2开始l2:movax,npushax;保存现场,保留ax的值movdx,0;被除数的高16位置0divbxcmpdx,0jnzl3;dx保存余数,若余数不为0,则转向l3,继续除下一个除数addcx,bx;若余数为0,则把除数相加l3:inccount;除数加1popax;ax出栈cmpax,countjnzl2;比较被除数和除数,若相等,则转向l2,cmpn,cxjnzl4;比较约数和与被除数是否相等,若相等,转向l4,测试下一个数movdx,0movax,n汇编语言课程设计5callprint;调用子程序,打印完数,每显示一个完数,紧跟一个空格movdl,''movah,02hint21hl4:incn;测试2――10000的完数cmpn,10000jnzl1movah,4chint21hprintproc;打印子程序pushcx;保护现场pushbxmovcx,0ah;cx作除数,以10为基数movbx,0;bx作计数器,计算压入堆栈的完数个数print_l1:movdx,0divcxpushdx;将余数压入堆栈保留incbx;压入数目增加1cmpax,0jnzprint_l1;反复调用print_11,直到被除数不能再除print_l2:popdx;循环弹出余数adddl,30h;余数以ASCII码的表示movah,02hint21h;输出调用decbx;堆栈中数的个数减1jnzprint_l2;弹出堆栈中所有的数汇编语言课程设计6popbx;还原现场popcxretprintendp;子程序结束codeendsendstart;程序结束5.运行结果该程序是:查找10000以内的完全数,文件名为wanshu.asm,执行结果如下:6.心得体会6.1程序设计体会在程序设计的过程中,我体会到了一些程序设计的基本方法和设计技巧,这些有助于拓宽我的解题思路,一定程度上帮助我解决设计上存在的问题。6.1.1算法设计在此过程中,除数,被除数,约数和的初始值的定义至关重要。由于本程序要反复除以除数,并把余数与0比较,把约数进行相加,因此应该尽量控制程序作除法运算的次数,达到最快的运行速度。在此程序中,我把除数的初始值设置为2,约数和的初始值设置为1,避免了被除数屡次除以1以及约数屡次从1开始相加。每测试一个数字,除数都从2开始,循环除,直至达到被除数本身(根据题目要求,除数达到”被除数/2”即可满足循环条件)。这影响了程序的运行速度,汇编语言课程设计7是这个程序的一个缺陷。6.1.2程序编写的规范性编写程序要注意格式的规范性。在此过程中,我的程序出现了前后不对应的情况,系统提示程序没有结束,经过检查才发现,最后缺少一个结束语句。汇编的每一段都应该有开始和结束的标志;同时,使用汇编的语句时要注意简洁和清晰,当一种操作可以用不同的语句表示时(如loop相当于dec和jnz两个语句的组合),要比较不同代码的优缺点,被选择使用的语句应该能表现程序的结构性。6.1.3合理使用寄存器由于要求打印10000以内的完数,理论上除数至少应该到达5000,用8位二进制表示此数是远远不够的。但如果除数用16位表示,被除数将占用32位。受到机器及运行环境的限制,无法使用386以上机型中的EBX,EAX,ECX,EDX等寄存器,因此,我采用DX,AX分别保存被除数的高16位和低16位,对于除法运算的结果,使用系统默认处理。商保存在AX中,余数保存在DX中;同时,利用累加器CX的特殊功能,用其保存约数和,以方便计算。6.1.4合理使用堆栈在编写程序的过程中,我明显的感觉到寄存器不够用。因此,我利用堆栈保护现场,保存相关的数据。虽然入栈,出栈的操作频繁,可能会一定程度上延缓了程序的执行速度,但它解决了寄存器数量上的限制。另外,由于除法计算的余数和商分别保存到DX和AX中,而AX在后续的程序中要使用到,因此要着重注意对AX的数据保存。6.1.5变量的使用AX既要用来存放被除数,也需要存放除法所得的商,因此,我设置了变量n,通过”movax,n”语句可以把待检测的数在需要时临时送入AX,冲掉AX内原来的值。另外,我还设置了变量count,用寄存器BX保存除数,利用count的自增来实现除数的改变,通过”movbx,count“语句把除数送入BX。变量与堆栈联合使用,可以方便的改变和保存所需要的数据,使程序简单易懂。6.2程序错误及改正汇编语言课程设计8在程序编译的过程中,遇到了一些令我措手不及的错误.由于初次遇到此类问题,我花费了大量的时间阅读代码,浏览程序,并查找课本和资料,找出指令的差别尤其是中断指令部分的差别.6.2.1结束命令错误最初的编译,遇到该问题,仔细检查源代码,才发现l4段的退出部分出现问题.我将显示命令”movah,09hint21h”误当作结束命令.改为”movah,4chint21h“后,顺利结束了该程序,也解决了运行时出现的该问题。6.2.2除数溢出错误除数溢出问题是本次课程设计中我遇到的最困难的问题.开始时我把除数定义在2——“被除数/2”方案一:“被除数/2”用右移一位AX实现当AX中为1时,右移一位则AX为0,除数为0,出现逻辑错误;当AX为奇数时,右移一位则结果不精确,运行结果同样出现错误.方案二:“被除数/2”用除2的除法实现汇编语言课程设计9由于程序由两层循环嵌套组成,又调用了一个输出完全数的子程序,寄存器在各段中使用频繁,数据的保存和恢复频繁,容易破坏程序的条理性.而增加一次除法大大增加了寄存器的负荷,因此该方案也不是一种好的方案.于是,我把除数定义在2——被除数的范围内,解决了除数溢出的问题和寄存器的限制,但同时也给程序的计算增加了“被除数/2”的复杂度。6.3课程设计的不足我设计和编写的程序完成了题目的要求,可以查找出任意正数范围内的完全数,但它存在两个不足:第一:现在的程序,如果要修改完全数的查找范围,就必须在源程序中改动,重新定义n的值.但如果在程序之初给出提示,让用户输入所要查找的范围,并把该数赋值给n,从而通过n重新定义被除数就更完善了.第二:考虑到寄存器数量上的限制和程序的可读性和条理性的要求,我扩大了除数的范围,使除数不再溢出.但这在一定程度上延迟了程序的执行速度.如果能找出协调这二者的方法,程序就更完善了.6.4课程设计的收获在本次的课程设计过程中,我最大的收获就是学到了不少新的知识,同时可以把自己学到的汇编语言的知识和以前学的程序设计的知识应用到实践中,熟悉了开发环境,提高了自己的动手能力,并顺利地完成了此次的任务.课程设计让我从中得到莫大的信心,鼓励,快乐和成就感.编程过程中,我遇到了一些困难.这时,我通过上网查询和去图书馆查找资料解决问题,有效地利用网络资源和学校图书资源,同时也了解了更多的知识获取的途径,扩大了自己的知识面.遇到问题时,多数情况下我是自己独立解决的,这锻炼我独立思考问题和独立解决问题的能力;如果自己通过查找资料无法解决,我就向老师和同学寻求帮助,不但学到了新的,更完善解决问题的方法,还学会了与人沟通,与人交流.我认识到有时候,其他人的一点提示,就会令自己茅塞顿开,得到灵感.因此,在作课程设计时,不要吝惜自己的思路和想法,尽可能多的与大家的交流.许多时候,我们都能从中得到进步,得到提示,甚至得到更好的方案.同时,我也发现了自己的一些问题.例如,编写程序不够规范,总是在出现问题汇编语言课程设计10时,才意识到格式和编程习惯的重要性,然后手忙脚乱的去修改,给自己的自信和成就感带来很大的挑战.
本文标题:汇编语言 完全数 课程设计报告书
链接地址:https://www.777doc.com/doc-2368324 .html