




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章结构化程序设计,5.1子程序的概念5.2子程序的定义、调用和返回*5.3子程序的现场保护与参数传递*5.4子程序设计*5.5子程序的嵌套与递归调用5.6宏汇编程序设计,教学基本内容,5.1子程序的概念,1、子程序:在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。过程(子程序):是指功能相对独立的一段程序。主程序和子程序间的关系:调用子程序的程序称为主调程序或主程序,被调用的程序称为子程序。,、程序中使用子程序的好处子程序作为一个功能性模块,供一个程序甚至多个程序使用:可以简化源程序结构;提高程序的可读性与可维护性;有利于代码复用;提高程序的设计效率。,1、子程序的定义:由子程序定义伪指令PROC和ENDP来完成。其格式如下:子程序名PROCNEAR/FAR;过程体子程序名ENDP解释:(1)子程序名是子程序入口地址的符号表示。同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。(2)PROC表示子程序定义开始,ENDP表示子程序定义结束。(3)NEAR/FAR2、子程序的调用和返回过程定义后,可在主程序中用CALL指令,反复调用。过程结束,由返回指令RET返回主程序。,演示,5.2子程序的定义、调用和返回,主程序与子程序,CALL过程名,主程序,RET,子程序,回到CALL指令后的指令处返回地址,5.2子程序的定义、调用和返回(续),子程序调用指令(CALL),CALL指令分成4种类型CALL子程序名;段内直接调用CALLr16/m16;段内间接调用CALLfarptr子程序;段间直接调用CALLfarptrmem;段间间接调用CALL指令需要保存返回地址:段内调用偏移地址IP入栈SPSP2,SS:SPIP段间调用偏移地址IP和段地址CS入栈SPSP2,SS:SPCSSPSP2,SS:SPIP,5.2子程序的定义、调用和返回(续),子程序返回指令(RET),RETn功能:弹出CALL指令压入堆栈的返回地址段内返回偏移地址IP出栈IPSS:SP,SPSP2段间返回偏移地址IP和段地址CS出栈IPSS:SP,SPSP2CSSS:SP,SPSP2,注意:在使用CALL和RET时,要保证过程的正确调用和返回说明:RET可以带参数,子程序返回指令(RET),放在子程序的末尾,它使子程序在执行完任务后将堆栈中的断点弹出,控制程序返回主程序继续执行被打断的程序。而返回地址(断点)就是子程序调用时入栈保护的断点地址IP(段内调用)或IP和CS值(段间调用)。通常,RET指令的类型是隐含的,它自动与子程序定义时的类型相匹配,如果是段内,返回时将栈顶的一个字弹给IP寄存器;如为段间,返回时先从栈顶弹出一个字给IP,接着再弹出一个字给CS。但是,当采用间接调用时,必须注意:保证CALL指令的类型与过程中RET指令的类型匹配,以免发生错误。例如CALLWORDPTRBX只能是段内调用,而CALLDWORDPTRBX能够调用一个远过程(段间调用),这样RET才能够识别返回类型。,例:NEAR类型子程序codeSEGMENT;code段CALLsubp;调用指令,xor指令的地址入栈xorax,axmovah,4chint21hsubpPROCNEAR;子程序定义RET;返回subpENDPcodeENDSENDSTART,、子程序的书写形式,1多处调用完成同一功能的子程序:codeSEGMENTstart:CALLsubCALLsubMOVAH,4CHINT21HsubPROC、RETsubENDPcodeENDSendstart,2模块化程序设计:多个子程序的调用codeSEGMENTbegin:CALLsub1CALLsub2CALLsub3MOVAH,4CHINT21Hsub1PROC、RETsub1ENDPsub2PROC、RETsub2ENDPsub3PROC、RETsub3ENDPcodeENDSENDbegin,子程序结构示例,子程序的位置通常在主程序的所有可执行指令之前或之后,不能放在主程序的可执行指令序列内部,否则会破坏主程序结构,5.3子程序的现场保护与参数传递,PROGPROCPUSHAXPUSHBXPUSHCX;保护现场PUSHDXPOPDXPOPCXPOPBX;恢复现场POPAXRET;返回断点处PROGENDP,例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则可采用此方法保护和恢复现场。,一、信息的保护与恢复,二、主程序与过程的参数传递方式,主程序子程序的参数传递:入口参数也称入口条件,是指主程序调用子程序前,为子程序内部数据处理准备所需的预置值;出口参数也称出口条件,是子程序返回主程序后,把子程序处理的结果传递给主程序的数据。参数传递的基本方法有:(1)寄存器法:通过CPU寄存器传递参数。传递数据方便、快捷,但所能传递的数据长度和个数都有限。(2)变量法:通过内存单元(组)传递参数。传递数据的长度和个数可不受限制,程序设计比较灵活。(3)堆栈法:通过堆栈传递参数。用堆栈保存所要传递的数据或存储地址,利用堆栈数据存取的特点,是常用的参数传递方法。,例5-1:分别用三种参数传递方法编写求12的和的程序。要求将结果送到内存单元,并显示。,DATASEGMENTSUMDB0DATAENDSSTACKSEGMENTDB100DUP(?)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAL,1MOVBL,2CALLsubprogmovah,4cHint21hCODEENDSENDSTART,SubprogPROCADDAL,BLORAL,30HMOVSUM,ALMovdl,alMovah,2Int21hRETsubENDP,通过寄存器传送,通过变量传送,DATASEGMENTSUMDB0D1DB?D2DB?DATAENDSSTACKSEGMENTDB100DUP(?)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVD1,1MOVD2,2CALLSPROGMOVAH,4chINT21HCODEENDSENDSTART,SPROGPROCMOVAL,D1ADDAL,D2ORAL,30HMOVSUM,ALMOVdl,alMOVah,2INT21hRETSPROGENDPENDSTART,SprPROCPUSHBPMOVBP,SPMOVAX,BP+6MOVBX,BP+4ADDAL,BLORAL,30HMOVDL,ALMOVAH,2INT21HMOVSUM,ALPOPBPRETSprENDP,DATASEGMENTSUMDB0DATAENDSSTACKSEGMENTDB100DUP(?)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAL,1MOVBL,2MOVAH,0MOVBH,0PUSHAXPUSHBXCALLSPRPOPBXPOPAXMOVAH,4CHINT21HCODEENDSENDSTART,通过堆栈功能最强/最灵活/最复杂,例5-2:多字节数相加的程序(寄存器传递过程参数),datasegmentnum1db01h,02h,03h,04h,05h,06hnum2db0ffh,07h,0ffh,03h,01h,06hlenequ$-num2dataendsstacksegmentstackdw100dup(?)stackendscodesegmentassumecs:code,ds:data,ss:stack,Start:movax,datamovds,axleasi,num1leadi,num2movcx,lencallmpaddmovah,4chint21h,MpaddprocpushaxpushcxpushsipushdijcxzexitclcNext:moval,diadcsi,alincsiincdiloopnextExit:popdipopsipopcxpopaxretMpaddendpCodeendsendstart,例5-3多字数相加的程序(堆栈传递子程序参数)RET指令中参数的应用例子,datasegmentva11dw9898h,7676h,5454h,3232h;被加数va12dw9898h,7676h,5454h,3232h;加数bufferdw4dup(?);和lenequ$-bufferdataendsstacksegmentstackdw100dup(?)stackendscodesegmentassumecs:code,ds:data,ss:stack,es:data,;主程序为过程MAINPROCFARpushdsxorax,axpushaxmovax,datamovds,axmoves,axmovax,len/2pushaxmovax,offsetbufferpushaxmovax,offsetva11pushaxmovax,offsetva12pushax,Calladd64movah,4chint21hmainendp;主程序结束,;子过程ADD64开始add64procpushbp;movbp,sppushbxpushsipushdipushcxpushf;保存现场movsi,bp+4;movbx,bp+6movdi,bp+8movcx,bp+10;读取参数cld,clcagain:lodswadcax,bxstoswincbxincbxloopagainpopf;popcxpopdipopsipopbxpopbp;恢复现场ret8;返回调用点,并废除4个参数共8字节add64endp;子过程结束codeendsendmain,在子程序设计中要明确地定义出这个子程序的入口参数和出口参数,使调用者能方便地使用子程序。在子程序中要合理地保存主程序和子程序都用到的寄存器和存储单元,以使主程序能正确地运行。,子程序是提高程序设计效率的良好手段,也为模块化设计提供了很好的基础。,总结,总结,注意:前面
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 滨州市中石化2025秋招面试半结构化模拟题及答案市场营销与国际贸易岗
- 国家能源绍兴市2025秋招面试专业追问及参考法学岗位
- 厦门市中储粮2025秋招笔试行测高频题库及答案
- 常德市中石油2025秋招笔试模拟题含答案电气仪控技术岗
- 中国移动兰州市2025秋招企业文化50题速记
- 常德市中石油2025秋招面试半结构化模拟题及答案电气仪控技术岗
- 邵阳市中储粮2025秋招面试专业追问题库基建工程岗
- 2025年刚体转动考试题及答案
- 中国联通怒江自治州2025秋招企业文化50题速记
- 中国广电临夏回族自治州2025秋招笔试行测题库及答案计算机类
- 二年级下册查字典练习题
- 2024-2025学年浙江省宁波市镇海区蛟川书院八年级(上)期中数学试卷
- 房地产 总承包工程技术标述标汇报 -总承包工程技术标答辩标准范本2023版
- 石棉矿域生态修复法
- 儿童入园(所)健康检查表
- (正式版)JBT 14581-2024 阀门用弹簧蓄能密封圈
- 幼儿园-消毒工作流程图
- 电缆修理工安全生产责任制
- 拼音拼读音节带声调完全版
- 某桥梁箱涵、箱通工程监理细则
- 【教案】圆锥曲线光学性质的数学原理及应用教学设计人教A版(2019)选择性必修第一册
评论
0/150
提交评论