第六章子程序设计

上传人:功*** 文档编号:250979870 上传时间:2024-11-05 格式:PPT 页数:28 大小:220.50KB
返回 下载 相关 举报
第六章子程序设计_第1页
第1页 / 共28页
第六章子程序设计_第2页
第2页 / 共28页
第六章子程序设计_第3页
第3页 / 共28页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,汇编语言程序设计教程,*,2024/11/5,汇编语言程序设计教程,1,第,6,章 子程序设计,6.1,子程序的定义与调用,6.2,子程序的参数传递方法,6.3,子程序的嵌套与递归,2024/11/5,汇编语言程序设计教程,2,子程序,在程序设计过程中,经常会遇到一些功能结构相同,仅是某些值不同的程序段在程序中多次出现,这样的重复编写既繁琐又费时。,为此,在设计程序时,将可以多次调用、能完成特定操作功能的程序段编写成独立的程序模块称为子程序。,调用这些子程序的程序称为主程序。,一个子程序应具备重复性、通用性、可浮动性、可递归性和可重入性。,主程序调用子程序通过调用指令,CALL,来实现。子程序返回主程序的功能由返回指令,RET,实现。子程序调用时要注意保护现场,子程序返回时要及时恢复现场。,2024/11/5,汇编语言程序设计教程,3,6.1,子程序的定义与调用,6.1.1,子程序的定义,6.1.2,子程序的调用,2024/11/5,汇编语言程序设计教程,4,子程序定义与调用的结构,2024/11/5,汇编语言程序设计教程,5,子程序的适应范围,多次重复使用的程序段;,具有通用性的程序段;,模块化程序结构中的子模块;,具有特殊功能的程序段;,中断服务程序。,2024/11/5,汇编语言程序设计教程,6,采用子程序结构的优点,简化了程序设计过程,使程序设计时间大量节省。,缩短了程序的长度,节省了计算机汇编源程序的时间和程序的存储空间。,增加了程序的可读性,便于对程序的修改和调试。,方便了程序的模块化、结构化和自顶向下的程序设计。,2024/11/5,汇编语言程序设计教程,7,子程序的定义,子程序是用过程定义伪指令,PROC,和,ENDP,来定义的,还应指出过程的类型属性,因此,子程序也可称为过程。,在,PROC,和,ENDP,之间是为完成某一特定功能的一连串指令,其最后一条指令是返回指令,RET,。,2024/11/5,汇编语言程序设计教程,8,子程序定义格式,过程名,PROC NEAR,或,FAR,过程体语句,RET,过程名,ENDP,其中,,“,过程名,”,是子程序入口的符号地址,,NEAR,或,FAR,是过程的类型属性,它指出对该过程的调用是段内的调用还是段间调用。,NEAR,用于段内调用,而,FAR,用于段间调用。,2024/11/5,汇编语言程序设计教程,9,过程属性的确定原则,调用程序和过程若在同一代码段中,则使用,NEAR,属性。,调用程序和过程若不在同一代码段中,则使用,FAR,属性。,主程序应定义为,FAR,属性。因为程序的主过程被看作是,DOS,调用的一个子程序,而,DOS,对主过程的调用和返回都是,FAR,属性。,2024/11/5,汇编语言程序设计教程,10,子程序的调用格式,子程序的调用和返回是由,CALL,和,RET,指令完成。,子程序的正确调用和正确返回是执行子程序的基本保证。,CALL,指令的格式为:,CALL,过程名,为了使子程序正确地执行,除了正确选择过程的属性外,正确使用堆栈也是非常重要的。,2024/11/5,汇编语言程序设计教程,11,例:段内直接调用,显示,P,CODE SEGMENT,ASSUME CS:CODE,START:CALL DISP,MOV AH,4CH,INT 21H,DISP:MOV DL,P,MOV AH,2,INT 21H,RET,CODE ENDS,END START,DISP PROC,MOV DL,P,MOV AH,2,INT 21H,RET,DISP ENDP,2024/11/5,汇编语言程序设计教程,12,例:段内间接调用,显示,P,CODE SEGMENT,ASSUME CS:CODE,START:MOV OFFSET DISP,CALL BX,MOV AH,4CH,INT 21H,DISP:MOV DL,P,MOV AH,2,INT 21H,RET,CODE ENDS,END START,2024/11/5,汇编语言程序设计教程,13,例:段间直接调用,显示,P,CODE1 SEGMENT,ASSUME CS:CODE1,START:CALL FAR PTR DISP,MOV AH,4CH,INT 21H,DODE1 ENDS,CODE2 SEGMENT,ASSUME CS:CODE2,DISP PROC FAR,MOV DL,P,MOV AH,2,INT 21H,RET,DISP ENDP,CODE2 ENDS,END START,2024/11/5,汇编语言程序设计教程,14,例:段间间接调用,DATA SEGMENT,NUM DW 1,CAADDR DW OFFSET SUBRT0,DW SEG SUBRT0,DW OFFSET SUBRT1,DW SEG SUBRT1,DW OFFSET SUBRT2,DW SEG SUBRT02,DATA ENDS,CODE SEGMENT,ASSUME CS:CODE,START:,MOV BX,NUM,ADD BX,BX,ADD BX,BX,MOV SI,OFFSET CAADDR,CALL FAR TR SI+BX,SUBRT0 .,2024/11/5,汇编语言程序设计教程,15,子程序的返回,1,)段内返回,RET,IP (SP),SP+2SP,段间返回,RET,IP (SP),SP+2SP,CS (SP),SP+2SP,2024/11/5,汇编语言程序设计教程,16,子程序的返回,3,)段内修改栈指针的返回指令,RET nn,(立即数),IP (SP),SP+2SP,SP+nn SP,4,)段间修改栈指针的返回指令,RET nn,(立即数),IP (SP),SP+2SP,CS (SP),SP+2SP,SP+nn SP,2024/11/5,汇编语言程序设计教程,17,子程序的调用方法说明,子程序名:供调用子程序时使用。,子程序功能:供选择子程序时参考。,占用寄存器:说明子程序执行时,要使用哪些寄存器;自程序执行完后,哪些寄存器的内容被改变,哪些寄存器的内容保持不变。,入口参数:说明子程序执行应具备的条件。,出口参数:说明子程序执行后的结果存放在何处。,子程序调用示例:说明子程序的调用格式。,2024/11/5,汇编语言程序设计教程,18,现场的保护与恢复,如果调用程序在调用子程序之前的某些寄存器或存储单元的内容,在从子程序返回到调用程序后还要使用,而子程序又恰好使用了这些寄存器或存储单元,则这些寄存器或存储单元的原有内容遭到了破坏,那就会使程序运行出错。,为防止这种错误的发生,在执行子程序之前应该把子程序所使用的寄存器或存储单元的内容保存在堆栈中,而退出子程序之前再恢复原有的内容。,2024/11/5,汇编语言程序设计教程,19,寄存器的保护方法,(,1,)在每次调用子程序时,将需要保护的寄存器的内容,在调用程序中压入堆栈;从子程序返回后,在调用程序中将栈中相应内容弹出。这种方法可能会使调用程序不易理解。,(,2,)进入子程序后,首先把需要保护的寄存器的内容压入堆栈,而在返回调用程序前再恢复这些寄存器的内容。这种方法的好处是:在调用程序中的任何地方都可调用子程序,而不会破坏任何寄存器的原有内容;这种方法只需要写一次入栈和出栈指令即可。,2024/11/5,汇编语言程序设计教程,20,6.2,子程序的参数传递方法,6.2.1,通过寄存器传递参数,6.2.2,通过堆栈传递参数,6.2.3,通过存储单元传递参数,2024/11/5,汇编语言程序设计教程,21,参数传递,主程序在调用子程序时,往往要向子程序传递一些参数。同样,子程序运行后也经常要把一些结果传回给主程序。主程序和子程序的这种信息传递称为参数传递。,一般将子程序需要从主程序获取的参数称为入口参数,而将子程序返回给主程序的参数称为出口参数。,常用的有寄存器传递法、存储器传递法和堆栈传递法。,2024/11/5,汇编语言程序设计教程,22,通过寄存器传递参数,通过寄存器传递参数的思想是:主程序把入口参数送入某些寄存器,然后调用子程序,子程序中直接使用存放入口参数的寄存器进行处理。,子程序处理完数据后,将执行结果作为出口参数存入寄存器中。,返回主程序后,主程序对存放在寄存器中的出口参数进行相应的处理。,用寄存器传递参数方便、直观,是经常使用的方法。但能传递的参数有限,适于参数较少的情况。,2024/11/5,汇编语言程序设计教程,23,通过堆栈传递参数,通过堆栈传递参数的思想是:主程序把入口参数入栈保存,然后调用子程序,子程序从堆栈中弹出入口参数进行处理。,子程序处理完数据后将执行结果作为出口参数入栈保存,返回主程序后,主程序从堆栈中弹出出口参数进行相应处理。,2024/11/5,汇编语言程序设计教程,24,通过内存单元传递参数,通过内存缓冲区传递参数的思想是:主程序中将入口参数送入某些存储单元,然后调用子程序,子程序从存储单元中取出入口参数进行处理。,子程序处理完数据后,将执行结果作为出口参数存入存储单元中,返回后由主程序进行处理。,用存储器传递参数的最简单方法是定义位置、格式确定的缓冲存储区,凡是需要子程序处理的参数,无论原来存放在什么地方,必须按格式要求先传入缓冲区。,子程序从缓冲区取得数据进行规定的处理,产生的结果按格式要求存入这个或另外的缓冲存储区,调用程序再从缓冲区取走结果。,2024/11/5,汇编语言程序设计教程,25,6.3,子程序的嵌套与递归,6.3.1,子程序的嵌套调用,6.3.2,子程序的递归调用,2024/11/5,汇编语言程序设计教程,26,子程序的嵌套调用,子程序内包含有子程序的调用就是子程序的嵌套。嵌套深度(即嵌套的层次数)逻辑上没有限制,但由于子程序的调用需要在堆栈中保存返回地址以及寄存器等数据,因此实际上受限于开设的堆栈空间。,嵌套子程序的设计并没有什么特殊要求,除子程序的调用和返回应正确使用,CALL,和,RET,指令外,还要注意寄存器的保存与恢复,以避免各层子程序之间因寄存器使用冲突而出错。,当调用程序去调用子程序时,将产生中断点,而子程序执行完后返回到调用程序的断点处,使调用程序继续往下执行。,对于嵌套结构,中断点的个数等于嵌套的深度。,2024/11/5,汇编语言程序设计教程,27,子程序嵌套示意图,2024/11/5,汇编语言程序设计教程,28,子程序的递归调用,当子程序直接或间接地嵌套调用自身时称为递归调用,含有递归调用的子程序称为递归子程序。,递归子程序的设计必须保证每次调用都不破坏以前调用时所用的参数和中间结果,因此将调用的输入参数、寄存器内容及中间结果都存放在堆栈中。,递归子程序必须采用寄存器或堆栈传递参数,递归深度受堆栈空间的限制。,递归子程序对应于数学上对函数的递归定义,它往往能设计出效率较高的程序,可以完成相当复杂的计算。,返回,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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