您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > 汇编语言斐波那锲数列
汇编语言实验报告学院:***班级:***姓名:***学号:***指导老师:**目录实验一斐波那契数列...................................................................................................................31.设计要求...........................................................................................................................32.设计思想和实施方案论述...............................................................................................33.课程设计中遇到的问题及解决方案...............................................................................54.程序流程图.......................................................................................................................65.源程序及注释...................................................................................................................6实验二统计学生成绩.................................................................................................................111.设计要求.........................................................................................................................112.设计思想和实施方案论述.............................................................................................113.典型程序模块及典型编程技巧分析.............................................................................114.课程设计中遇到的问题及解决方法.............................................................................125.程序流程图,程序清单和程序注释.............................................................................126.程序清单和注释.............................................................................................................13收获与体会.....................................................................................................................................16参考书籍:.....................................................................................................................................16实验一斐波那契数列1.设计要求用递归的方法求斐波那契的第24项(N=24),并将结果用十进制显示出来输出FIB(24)的值2.设计思想和实施方案论述FIB函数采用子程序递归调用方法,实现求斐波那契数列先写出高级语言中的斐波那契递归函数:Intfib(intN){If(N==1||N==0)result=1;Elseresult=fib(n-1)+fib(n-2);Returnresult;}其函数为高级语言的形式,其中result=fib(n-1)+fib(n-2)隐含了几个操作可把它展开为:N=N-1;注意到这里的N是形参(局部变量)与调用程序的实参不是同一个变量Inta=fib(N)N=N-1Intb=fib(N)Result=a+b;由此可知几个重要实现地方:a)保存现场:N在一个fib函数里面是局部变量,当系统调用子程序时需要保存这个局部变量,在返回时需要恢复:SUBTPROCNEARPUSHAXPUSHBX…….…….POPBXPOPAXSUBTENDP;采用保存恢复寄存器的形式b)参数传递:其中的N在调用fib传参时是作为实参,在被调用函数中还需要被使用,这是参数的传递,这里采用通过数据区传递参数(同全局变量)c)返回值:最后的result在高级语言中是通过将result赋给一个临时变量(调用该函数的程序)然后释放result这个局部变量,在本程序中采用寄存器直接传递的方法,所以在Fib函数中将result赋给一个寄存器,然后不保存它,让其传递到上层调用函数中去。3.课程设计中遇到的问题及解决方案遇到的问题在编写斐波那契函数的过程中主要遇到了问题是保存现场的问题,在高级语言中,对子程序调用时,系统会自动为我们保存当前程序的现场指令地址,局部变量。而在汇编中除了现场指令地址保存外,其他的工作都必须我们自己完成,所以在对子程序调用时,怎么保存当前的局部变量,怎么传递参数到将要调用的函数中去使用,都是很难理顺思路的地方。解决方案第一:明确哪些是局部变量,在调用完子程序返回时要恢复的。第二:局部变量作为实参,与被调用的子程序中的形参的区别。第三:确保有压栈就必须对应出栈,且系统的中断指令地址的保存与我们使用的栈是同一个栈解决方案在上面已经写过,就没有在复述了4.程序流程图5.源程序及注释DATASSEGMENTmessage1dbinputthenumber,$NUM=18h;修改此处获得第N项斐波那契数列值Ndw0;用于传参的NDATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS……….……….NN-1N-2……….21Fib(2)Fib(1)Fib(N-2)Fib(N-1)Fib(N)MainprocfarSTART:pushdssubax,axpushaxmovax,DATASmovds,axmovbyteptrN,NUMcallFIB;调用Fib子程序movdx,ax;callOutput_CTLFcallPrintOX;将十进制转换为十六进制输出movah,1int21h;等待退出屏幕retMainendp;outputCTLFOutput_CTLFprocNearpushaxpushdxmovah,02hmovdl,0dhint21hmovdl,0ahint21hpopdxpopaxretOutput_CTLFendp;inputvalueindxPrintOXprocnearmovcl,4loop1:pushcxmovcl,4roldx,clmovax,dxpopcxandax,000fhcmpax,000ahjlLessThanAaddax,07hLessThanA:addax,30hpushdxmovdl,almovah,2int21hpopdxlooploop1retPrintOXendpFIBprocnear;FIB子函数pushcx;cx与bx为局部变量pushbxmovcx,N;使用N作为实参传参,cx为形参cmpcx,1;相当于if(N=1)jleless_equal_1deccx;相当于N-1movN,cx;使用N作为实参传参callFIB;FIB(N-1)movbx,axdeccx;相当于N-1movN,cx;使用N作为实参传参callFIB;FIB(N-1)addax,bx;ax中保存FIB(N-1)+FIB(N-2),并且作为返回值jmpenderless_equal_1:movax,1;如果N=1result=1ender:popbxpopcxretFIBendpCODESENDSendstart实验二统计学生成绩1.设计要求设计10个学生的成绩分别为56、69、84、82、73、88、99、63、100和80分。试编制程序分别统计低于60分、60-69分、70-79分、80-89分、90-99分及100分的人数,并存放到S5、S6、S7、S8、S9及S10单元中。2.设计思想和实施方案论述定义以x为数组名的含10个单元的一维数组,分别存放10个学生的成绩;定义变量S5、S6、S7、S8、S9及S10,初始化为0,以存放各成绩阶段的人数,以上均以字为存储单元长度。建立子程序SEARCH,用以查找学生成绩并进行各成绩阶段的人数统计,并在主程序中调用。其中,统计应用公式——(成绩)/10-5)*2——根据成绩相s5的相对地址变化量来进行存储。3.典型程序模块及典型编程技巧分析子程序SEARCH(统计人数)SEARCH:MOVSI,0NEXT:MOVAX,x[SI]MOVBX,10DIVBLMOVBL,ALSUBBX,5SALBX,1INCS5[BX]ADDSI,2LOOPNEXTRET子程序PRINTMen人数PRINTMen:MOVAH,02HINT21HMOVDL,''MOVAH,02HINT21HRET编程技巧:采用子程序方法,使程序更易分析,模块更清晰,利用循环和相对地址变化量来减少程序的冗余度,是其看起来精简和更易分析。4.课程设计中遇到的问题及解决方法1、对汇编语言编程的基本结构都不会解决方法:看书,多看几个程序,便熟悉了基本结构datasegment,codesegment等。2、数组的地址分配方式很糊涂,其存储单元的长度与首地址的关系解决方法:请教老师同学,在多次练习小习题后,进行画图分析3、子程序的使用方法解决方法:多看程序4、公式的汇编语言转换解决方法:“心急吃不了”热豆腐,将大化小,化繁为易,一步步计算5.程序流程图,程序清单和程序注释子程序SEARCH6.程序清单和注释DATASEGMENT;数据段开始xDW56,69,84,82,73,88,99,63,100,80;定义数组,以存放学生成绩S5sDW0;定义变量s5,表示分数50-59分统计结果S6DW0;定义变量s6,表示分数60-69分统计结果S7DW0;定义变量s7,表示分数70-79分统计结果S8DW0;定义变量s8,表示分数80-89分统计结果S9DW0;定义变量s9,表示分数90-99分统计结果S10DW0;定义变量s10,表示100分统计结果子程序调用开始初始化相对地址变化量SI=0CX等于0?利用公式((成绩)/10-5)*2,计算出当前成绩相对于首地址的变化量,送给BX进入NEXT循环子程序返回否将当前地址单元的值送到AX中对应的存储单元S5[BX]的值加1CX=CX-1DATAENDS;数据段结束CODESEGMENT;代码段开始MAINPROCFAR;MAIN函数声明ASSUMECS:CODE,DS:DATASTART:PUSHDS;过程开始SUBAX,AXPUSHAXMOVAX,DATAMOVD
本文标题:汇编语言斐波那锲数列
链接地址:https://www.777doc.com/doc-5329780 .html