第六章子程序设计.ppt

上传人:李司机 文档编号:4103315 上传时间:2023-04-04 格式: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》由会员分享,可在线阅读,更多相关《第六章子程序设计.ppt(28页珍藏版)》请在三一办公上搜索。

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

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

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

4、R用于段间调用。,2023/4/4,汇编语言程序设计教程,9,过程属性的确定原则,调用程序和过程若在同一代码段中,则使用NEAR属性。调用程序和过程若不在同一代码段中,则使用FAR属性。主程序应定义为FAR属性。因为程序的主过程被看作是DOS调用的一个子程序,而DOS对主过程的调用和返回都是FAR属性。,2023/4/4,汇编语言程序设计教程,10,子程序的调用格式,子程序的调用和返回是由CALL和RET指令完成。子程序的正确调用和正确返回是执行子程序的基本保证。CALL指令的格式为:CALL 过程名 为了使子程序正确地执行,除了正确选择过程的属性外,正确使用堆栈也是非常重要的。,2023/4

5、/4,汇编语言程序设计教程,11,例:段内直接调用,显示P,CODE SEGMENT ASSUME CS:CODESTART:CALL DISP MOV AH,4CH INT 21HDISP:MOV DL,P MOV AH,2 INT 21H RETCODE ENDS END START,DISP PROC MOV DL,P MOV AH,2 INT 21H RETDISP ENDP,2023/4/4,汇编语言程序设计教程,12,例:段内间接调用,显示P,CODE SEGMENT ASSUME CS:CODESTART:MOV OFFSET DISP CALL BX MOV AH,4CH IN

6、T 21HDISP:MOV DL,P MOV AH,2 INT 21H RETCODE ENDS END START,2023/4/4,汇编语言程序设计教程,13,例:段间直接调用,显示P,CODE1 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 RETDISP ENDPCODE2 ENDS END START,2023/4/4,汇编语言程序设计教程,14

7、,例:段间间接调用,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.,2023/4/4,汇编语言程序设计教程,15,子程序的返回,1)段内返回 RET IP(SP),SP

8、+2SP段间返回 RET IP(SP),SP+2SP CS(SP),SP+2SP,2023/4/4,汇编语言程序设计教程,16,子程序的返回,3)段内修改栈指针的返回指令RET nn(立即数)IP(SP),SP+2SP SP+nn SP4)段间修改栈指针的返回指令RET nn(立即数)IP(SP),SP+2SP CS(SP),SP+2SP SP+nn SP,2023/4/4,汇编语言程序设计教程,17,子程序的调用方法说明,子程序名:供调用子程序时使用。子程序功能:供选择子程序时参考。占用寄存器:说明子程序执行时,要使用哪些寄存器;自程序执行完后,哪些寄存器的内容被改变,哪些寄存器的内容保持不

9、变。入口参数:说明子程序执行应具备的条件。出口参数:说明子程序执行后的结果存放在何处。子程序调用示例:说明子程序的调用格式。,2023/4/4,汇编语言程序设计教程,18,现场的保护与恢复,如果调用程序在调用子程序之前的某些寄存器或存储单元的内容,在从子程序返回到调用程序后还要使用,而子程序又恰好使用了这些寄存器或存储单元,则这些寄存器或存储单元的原有内容遭到了破坏,那就会使程序运行出错。为防止这种错误的发生,在执行子程序之前应该把子程序所使用的寄存器或存储单元的内容保存在堆栈中,而退出子程序之前再恢复原有的内容。,2023/4/4,汇编语言程序设计教程,19,寄存器的保护方法,(1)在每次调

10、用子程序时,将需要保护的寄存器的内容,在调用程序中压入堆栈;从子程序返回后,在调用程序中将栈中相应内容弹出。这种方法可能会使调用程序不易理解。(2)进入子程序后,首先把需要保护的寄存器的内容压入堆栈,而在返回调用程序前再恢复这些寄存器的内容。这种方法的好处是:在调用程序中的任何地方都可调用子程序,而不会破坏任何寄存器的原有内容;这种方法只需要写一次入栈和出栈指令即可。,2023/4/4,汇编语言程序设计教程,20,6.2 子程序的参数传递方法,6.2.1 通过寄存器传递参数6.2.2 通过堆栈传递参数6.2.3 通过存储单元传递参数,2023/4/4,汇编语言程序设计教程,21,参数传递,主程

11、序在调用子程序时,往往要向子程序传递一些参数。同样,子程序运行后也经常要把一些结果传回给主程序。主程序和子程序的这种信息传递称为参数传递。一般将子程序需要从主程序获取的参数称为入口参数,而将子程序返回给主程序的参数称为出口参数。常用的有寄存器传递法、存储器传递法和堆栈传递法。,2023/4/4,汇编语言程序设计教程,22,通过寄存器传递参数,通过寄存器传递参数的思想是:主程序把入口参数送入某些寄存器,然后调用子程序,子程序中直接使用存放入口参数的寄存器进行处理。子程序处理完数据后,将执行结果作为出口参数存入寄存器中。返回主程序后,主程序对存放在寄存器中的出口参数进行相应的处理。用寄存器传递参数

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

13、后由主程序进行处理。用存储器传递参数的最简单方法是定义位置、格式确定的缓冲存储区,凡是需要子程序处理的参数,无论原来存放在什么地方,必须按格式要求先传入缓冲区。子程序从缓冲区取得数据进行规定的处理,产生的结果按格式要求存入这个或另外的缓冲存储区,调用程序再从缓冲区取走结果。,2023/4/4,汇编语言程序设计教程,25,6.3 子程序的嵌套与递归,6.3.1 子程序的嵌套调用6.3.2 子程序的递归调用,2023/4/4,汇编语言程序设计教程,26,子程序的嵌套调用,子程序内包含有子程序的调用就是子程序的嵌套。嵌套深度(即嵌套的层次数)逻辑上没有限制,但由于子程序的调用需要在堆栈中保存返回地址

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

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号