第六章子程序设计.ppt

上传人:王** 文档编号:185253 上传时间:2023-04-02 格式:PPT 页数:28 大小:220.50KB
下载 相关 举报
第六章子程序设计.ppt_第1页
第1页 / 共28页
第六章子程序设计.ppt_第2页
第2页 / 共28页
第六章子程序设计.ppt_第3页
第3页 / 共28页
第六章子程序设计.ppt_第4页
第4页 / 共28页
第六章子程序设计.ppt_第5页
第5页 / 共28页
第六章子程序设计.ppt_第6页
第6页 / 共28页
第六章子程序设计.ppt_第7页
第7页 / 共28页
第六章子程序设计.ppt_第8页
第8页 / 共28页
第六章子程序设计.ppt_第9页
第9页 / 共28页
第六章子程序设计.ppt_第10页
第10页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第六章子程序设计.ppt》由会员分享,可在线阅读,更多相关《第六章子程序设计.ppt(28页珍藏版)》请在优知文库上搜索。

1、2023-4-2汇编语言程序设计教程1第第6章章 子程序设计子程序设计 6.1 子程序的定义与调用6.2 子程序的参数传递方法6.3 子程序的嵌套与递归2023-4-2汇编语言程序设计教程2子程序子程序 在程序设计过程中,经常会遇到一些功能结构相同,仅是某些值不同的程序段在程序中多次出现,这样的重复编写既繁琐又费时。 为此,在设计程序时,将可以多次调用、能完成特定操作功能的程序段编写成独立的程序模块称为子程序。 调用这些子程序的程序称为主程序。 一个子程序应具备重复性、通用性、可浮动性、可递归性和可重入性。 主程序调用子程序通过调用指令CALL来实现。子程序返回主程序的功能由返回指令RET实现

2、。子程序调用时要注意保护现场,子程序返回时要及时恢复现场。2023-4-2汇编语言程序设计教程36.1 子程序的定义与调用子程序的定义与调用6.1.1 子程序的定义6.1.2 子程序的调用2023-4-2汇编语言程序设计教程4子程序定义与调用的结构子程序定义与调用的结构 2023-4-2汇编语言程序设计教程5子程序的适应范围子程序的适应范围 多次重复使用的程序段; 具有通用性的程序段; 模块化程序结构中的子模块; 具有特殊功能的程序段; 中断服务程序。2023-4-2汇编语言程序设计教程6采用子程序结构的优点采用子程序结构的优点 简化了程序设计过程,使程序设计时间大量节省。 缩短了程序的长度,

3、节省了计算机汇编源程序的时间和程序的存储空间。 增加了程序的可读性,便于对程序的修改和调试。 方便了程序的模块化、结构化和自顶向下的程序设计。2023-4-2汇编语言程序设计教程7子程序的定义子程序的定义 子程序是用过程定义伪指令PROC和ENDP来定义的,还应指出过程的类型属性,因此,子程序也可称为过程。 在PROC和ENDP之间是为完成某一特定功能的一连串指令,其最后一条指令是返回指令RET。 2023-4-2汇编语言程序设计教程8子程序定义格式子程序定义格式 过程名 PROC NEAR或FAR 过程体语句RET过程名 ENDP其中,“过程名”是子程序入口的符号地址,NEAR或FAR是过程

4、的类型属性,它指出对该过程的调用是段内的调用还是段间调用。NEAR用于段内调用,而FAR用于段间调用。2023-4-2汇编语言程序设计教程9过程属性的确定原则过程属性的确定原则 调用程序和过程若在同一代码段中,则使用NEAR属性。 调用程序和过程若不在同一代码段中,则使用FAR属性。 主程序应定义为FAR属性。因为程序的主过程被看作是DOS调用的一个子程序,而DOS对主过程的调用和返回都是FAR属性。2023-4-2汇编语言程序设计教程10子程序的调用格式子程序的调用格式 子程序的调用和返回是由CALL和RET指令完成。 子程序的正确调用和正确返回是执行子程序的基本保证。CALL指令的格式为:

5、CALL 过程名 为了使子程序正确地执行,除了正确选择过程的属性外,正确使用堆栈也是非常重要的。 2023-4-2汇编语言程序设计教程11例:段内直接调用,显示PCODE SEGMENT ASSUME CS:CODESTART:CALL DISP MOV AH, 4CH INT 21HDISP: MOV DL, P MOV AH, 2 INT 21H RETCODE ENDS END STARTDISP PROC MOV DL, P MOV AH, 2 INT 21H RETDISP ENDP2023-4-2汇编语言程序设计教程12例:段内间接调用,显示PCODE SEGMENT ASSUME

6、 CS:CODESTART:MOV OFFSET DISP CALL BX MOV AH, 4CH INT 21HDISP: MOV DL, P MOV AH, 2 INT 21H RETCODE ENDS END START2023-4-2汇编语言程序设计教程13例:段间直接调用,显示PCODE1 SEGMENT ASSUME CS: CODE1START: CALL FAR PTR DISP MOV AH, 4CH INT 21HDODE1 ENDSCODE2 SEGMENT ASSUME CS:CODE2DISP PROC FAR MOV DL, P MOV AH, 2 INT 21H

7、RETDISP ENDPCODE2 ENDS END START2023-4-2汇编语言程序设计教程14例:段间间接调用DATA SEGMENTNUM DW 1CAADDR DW OFFSET SUBRT0 DW SEG SUBRT0 DW OFFSET SUBRT1 DW SEG SUBRT1 DW OFFSET SUBRT2 DW SEG SUBRT02DATA ENDSCODE SEGMENT ASSUME CS: CODESTART: MOV BX,NUM ADD BX,BX ADD BX,BX MOV SI,OFFSET CAADDR CALL FAR TR SI+BX SUBRT0

8、 .2023-4-2汇编语言程序设计教程15子程序的返回子程序的返回 1)段内返回 RET IP (SP), SP+2SP2) 段间返回 RET IP (SP), SP+2SP CS (SP), SP+2SP2023-4-2汇编语言程序设计教程16子程序的返回子程序的返回 3)段内修改栈指针的返回指令RET nn(立即数) IP (SP), SP+2SP SP + nn SP4)段间修改栈指针的返回指令RET nn(立即数) IP (SP), SP+2SP CS (SP), SP+2SP SP + nn SP2023-4-2汇编语言程序设计教程17子程序的调用方法说明子程序的调用方法说明 子程

9、序名:供调用子程序时使用。 子程序功能:供选择子程序时参考。 占用寄存器:说明子程序执行时,要使用哪些寄存器;自程序执行完后,哪些寄存器的内容被改变,哪些寄存器的内容保持不变。 入口参数:说明子程序执行应具备的条件。 出口参数:说明子程序执行后的结果存放在何处。 子程序调用示例:说明子程序的调用格式。2023-4-2汇编语言程序设计教程18现场的保护与恢复现场的保护与恢复 如果调用程序在调用子程序之前的某些寄存器或存储单元的内容,在从子程序返回到调用程序后还要使用,而子程序又恰好使用了这些寄存器或存储单元,则这些寄存器或存储单元的原有内容遭到了破坏,那就会使程序运行出错。 为防止这种错误的发生

10、,在执行子程序之前应该把子程序所使用的寄存器或存储单元的内容保存在堆栈中,而退出子程序之前再恢复原有的内容。 2023-4-2汇编语言程序设计教程19寄存器的保护方法寄存器的保护方法 (1)在每次调用子程序时,将需要保护的寄存器的内容,在调用程序中压入堆栈;从子程序返回后,在调用程序中将栈中相应内容弹出。这种方法可能会使调用程序不易理解。 (2)进入子程序后,首先把需要保护的寄存器的内容压入堆栈,而在返回调用程序前再恢复这些寄存器的内容。这种方法的好处是:在调用程序中的任何地方都可调用子程序,而不会破坏任何寄存器的原有内容;这种方法只需要写一次入栈和出栈指令即可。2023-4-2汇编语言程序设

11、计教程206.2 子程序的参数传递方法子程序的参数传递方法6.2.1 通过寄存器传递参数6.2.2 通过堆栈传递参数6.2.3 通过存储单元传递参数2023-4-2汇编语言程序设计教程21参数传递参数传递 主程序在调用子程序时,往往要向子程序传递一些参数。同样,子程序运行后也经常要把一些结果传回给主程序。主程序和子程序的这种信息传递称为参数传递。 一般将子程序需要从主程序获取的参数称为入口参数,而将子程序返回给主程序的参数称为出口参数。 常用的有寄存器传递法、存储器传递法和堆栈传递法。 2023-4-2汇编语言程序设计教程22通过寄存器传递参数通过寄存器传递参数 通过寄存器传递参数的思想是:主

12、程序把入口参数送入某些寄存器,然后调用子程序,子程序中直接使用存放入口参数的寄存器进行处理。 子程序处理完数据后,将执行结果作为出口参数存入寄存器中。 返回主程序后,主程序对存放在寄存器中的出口参数进行相应的处理。 用寄存器传递参数方便、直观,是经常使用的方法。但能传递的参数有限,适于参数较少的情况。 2023-4-2汇编语言程序设计教程23通过堆栈传递参数通过堆栈传递参数 通过堆栈传递参数的思想是:主程序把入口参数入栈保存,然后调用子程序,子程序从堆栈中弹出入口参数进行处理。 子程序处理完数据后将执行结果作为出口参数入栈保存,返回主程序后,主程序从堆栈中弹出出口参数进行相应处理。 2023-

13、4-2汇编语言程序设计教程24通过内存单元传递参数通过内存单元传递参数 通过内存缓冲区传递参数的思想是:主程序中将入口参数送入某些存储单元,然后调用子程序,子程序从存储单元中取出入口参数进行处理。 子程序处理完数据后,将执行结果作为出口参数存入存储单元中,返回后由主程序进行处理。 用存储器传递参数的最简单方法是定义位置、格式确定的缓冲存储区,凡是需要子程序处理的参数,无论原来存放在什么地方,必须按格式要求先传入缓冲区。 子程序从缓冲区取得数据进行规定的处理,产生的结果按格式要求存入这个或另外的缓冲存储区,调用程序再从缓冲区取走结果。 2023-4-2汇编语言程序设计教程256.3 子程序的嵌套

14、与递归子程序的嵌套与递归6.3.1 子程序的嵌套调用6.3.2 子程序的递归调用2023-4-2汇编语言程序设计教程26子程序的嵌套调用子程序的嵌套调用 子程序内包含有子程序的调用就是子程序的嵌套。嵌套深度(即嵌套的层次数)逻辑上没有限制,但由于子程序的调用需要在堆栈中保存返回地址以及寄存器等数据,因此实际上受限于开设的堆栈空间。 嵌套子程序的设计并没有什么特殊要求,除子程序的调用和返回应正确使用CALL和RET指令外,还要注意寄存器的保存与恢复,以避免各层子程序之间因寄存器使用冲突而出错。 当调用程序去调用子程序时,将产生中断点,而子程序执行完后返回到调用程序的断点处,使调用程序继续往下执行。 对于嵌套结构,中断点的个数等于嵌套的深度。2023-4-2汇编语言程序设计教程27子程序嵌套示意图子程序嵌套示意图 2023-4-2汇编语言程序设计教程28子程序的递归调用子程序的递归调用 当子程序直接或间接地嵌套调用自身时称为递归调用,含有递归调用的子程序称为递归子程序。 递归子程序的设计必须保证每次调用都不破坏以前调用时所用的参数和中间结果,因此将调用的输入参数、寄存器内容及中间结果都存放在堆栈中。 递归子程序必须采用寄存器或堆栈传递参数,递归深度受堆栈空间的限制。 递归子程序对应于数学上对函数的递归定义,它往往能设计出效率较高的程序,可以完成相当复杂的计算。 返回

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 数据结构与算法

copyright@ 2008-2023 yzwku网站版权所有

经营许可证编号:宁ICP备2022001189号-2

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!