您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > 第五次汇编语言实验报告-子程序设计
汇编语言实验报告AssemblyLanguageProgrammingLabReports______________________________________________________________________________班级:姓名:学号:实验日期:学院:专业:实验顺序:原创:___实验名称:子程序设计实验分数:_______考评日期:________指导教师:______________________________________________________________________________一.实验目的1、掌握过程调用伪指令:PROC,ENDP,NEAR和FAR。2、掌握CALL,RET,RETn。理解子程序调用时现场保护和恢复现场的意义。3、掌握子程序传递参数的三种方式,寄存器,内存单元,堆栈。4、培养在复杂的程序设计时,采用模块化结构划分功能,分解程序的意识。5、对子函数的嵌套调用和递归调用有一定的理解。______________________________________________________________________________二.实验环境操作系统:windows8编译程序:masm5.0______________________________________________________________________________三.实验原理1.子程序递归,堆栈传参2.寄存器、存储器传参______________________________________________________________________________四.实验步骤及结果分析1.子程序递归调用(求阶乘)用堆栈进行传递参数高级语言函数调用过程Fac(n)=fac(n-1)*nn0Fac(n)=1n=0高级语言递归调用,形参中的内容在这层递归调用结束后才会被释放实参5实参4实参3实参2实参1形参n=5形参n=4形参n=3形参n=2形参n=1Fac(4)*5Fac(3)*4Fac(2)*3Fac(1)*2Fac(0)*1Fac(n-1)*nFac(n-1)*nFac(n-1)*nFac(n-1)*nFac(n-1)*nIntfac(intn){intf;If(n=0)F==1;Elsef=fac(n-1)*n;}在汇编语言中子程序没有形参和实参,直接更改的是给定寄存器或者内存单元或者栈中的数据,需要自己开辟类似形参的空间去保存相应的数据,在这里最好的办法就是用栈。源代码:stacksegmentstackdb100hdup(?)stackendsdatasegmentresultdw?dataendscodesegmentmainprocfarassumecs:code,ds:datastart:movax,datamovds,axmovax,5pushaxcallfactmovresult,axmovah,4chint21hmainendpfactprocnearpushbpmovbp,spmovax,[bp+4]cmpax,0jaresult1movax,1jmpresult2result1:decaxpushaxcallfactmovbx,[bp+4]mulbxresult2:popbpret2factendpcodeendsendstart实验结果:2.实现两个输入的十进制数相减法,相乘,相除,三者任选一个。给出设计思路,各个子程序必要时给出程序框图,给出代码,正确运行结果。两数相减设计思路:1.主程序:调用三个子程序。主程序用JMP构成循环,可以做多次计算。2.子程序surb1:功能是键盘输入,数字键ASCII码→十进制数(该十进制数保存为二进制数),用存储单元x传参。3.子程序surb2:功能为两数相减,以寄存器bx传参4.子程序surb3:功能为显示十进制数。先将二进制数→十进制数。将传参寄存器bx中的二进制数用除以10取余数的方法转换为十进制数,再将余数加30h变为十进制数的ASCII码,然后显示。子程序1:是否是否键盘输入是否回车小于0or大于9?以二进制保存ExitCx=0?Out1存储单元x传参子程序2:否是子程序3:否是,进入循环源代码:datasegmentxdw?,?cc1db0ah,0dh,'x1=$'cc2db0ah,0dh,'x2=$'cc3db0ah,0dh,'x1-x2=$'dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axmainprocfar开始X1X2?交换X1、X2的值bx←x1-x2Ax/10ax←bx余数入栈,inccxAx=0?出栈转换为ASCII码输出结束movcx,0movbx,0movsi,0movdx,offsetcc1movah,9int21hcallsurb1movdx,offsetcc2movah,9int21hmovbx,0movcx,0movsi,2callsurb1callsurb2movdx,offsetcc3movah,9int21hcallsurb3jmpmainout1:movah,4chint21hmainendpsurb1procnearmovah,1int21hcmpal,0dhjzexitcmpal,'0'jlout1cmpal,'9'jgout1andax,000fhxchgax,bxmovcx,10mulcxaddbx,axjmpsurb1exit:cmpcx,0jzout1movx[si],bxretsurb1endpsurb2procnearmovbx,xcmpbx,x+2jaejet1xchgbx,x+2jet1:subbx,x+2retsurb2endpsurb3procnearmovax,bxmovcx,0movbx,10let1:movdx,0inccxidivbxpushdxcmpax,0jnzlet1let2:popaxaddax,0030hmovdl,almovah,2int21hlooplet2retsurb3endpcodeendsendstart运行结果:____________________________________________________________________________五.实验心得疑问建议通过本次实验,学习了子程序的调用、嵌套和递归以及三种传参方式,收获很多。并且进一步学习了使用debug。
本文标题:第五次汇编语言实验报告-子程序设计
链接地址:https://www.777doc.com/doc-6341111 .html