资源预览内容
第1页 / 共26页
第2页 / 共26页
第3页 / 共26页
第4页 / 共26页
第5页 / 共26页
第6页 / 共26页
第7页 / 共26页
第8页 / 共26页
第9页 / 共26页
第10页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第五章 子程序n子程序又称为过程,它相当于高级语言中的函数。当某些 程序段的功能和结构形式都相同,只是某些变量的赋值不 同的时候,这样的程序段可写成子程序形式,在需要时去 调用它。这样的程序结构,不仅避免了程序段的重复书写 和内存空间的浪费,而且程序结构简洁清晰,是模块化程 序设计的基础。n本章主要介绍了子程序的定义和现场保护,子程序的调用 和返回,以及子程序参数传递的方法,并结合具体实例, 讨论了子程序设计的基本技术和技巧。n本章重点:子程序结构及其设计方法n本章难点:程序设计技巧(多编程)第一节 子程序的结构一、子程序定义伪指令 格式:子程序名 PROC 属性 ;子程序的开始子程序名 ENDP ;子程序的结束。 功能:定义子程序的开始和结束,将子程序的功能部分包含起 来。子程序名是由用户定义的、子程序入口的符号地址,是调 用子程序时的调用名。结束的名字必须和开始的名字相同。子程序开始时定义的属性决定了子程序的调用和返回的属性 ,必须在定义时考虑好。如果子程序与调用程序在同一个段 中,即段内调用,则属性选NEAR;如果子程序与调用程序不 在同一个段中,即段间调用,则属性选FAR。对段内调用可 以省写属性NEAR。二、子程序的调用和返回 (一)子程序调用指令 指令格式有四种:CALL 子程序名 功能:段内直接调用。(IP)堆栈;子程序的首偏移地址(IP),即转去执行子程序。 CALL WORD PTR OPD 功能:段内间接调用。CALL FAR PTR 子程序名 功能:段间直接调用。CALL DWORD PTR OPD 功能:段间间接调用。(CS)堆栈、(IP)堆栈;(OPD+2)(CS)、(OPD)(IP),转去执行子程序 。注:“堆栈”表示压栈操作。 例如:调用段内的子程序ABC可以用如下指令:CALL ABC 例如:调用段间的子程序ABC可以用如下指令:CALL FAR PTR ABC(二)子程序返回指令 指令格式有两种: RET 功能:段内返回时,堆栈(IP),即返回调用程序;段间返回时,堆栈(IP)、堆栈(CS),即返回调用程序 。 RET exp 功能:段内返回时,堆栈(IP),(SP)+exp(SP),即返回调 用程序; 段间返回时,堆栈(IP)、堆栈(CS),(SP)+exp(SP),即 返回调用程序。 其中exp总是偶数。当主程序用堆栈传递参数给子程序,子程 序返回时必带exp,以便修改(SP)使其指向参数入栈以前的 值,因为此时参数已不再有用。exp=2*参数个数。 注:“堆栈”表示出栈操作。 三、现场保护与恢复寄存器少,但使用方便。为破坏调用程序的数据,在子程序中进行保 存与恢复,即现场的保护与恢复。子程序开始时用一串压栈指令进行保护,结束时用一串出栈指令进行 恢复。这样,多次调用时可以不需重复保护与恢复。 例:ABC PROC NEAR ;定义子程序开始PUSH AX ;现场的保护PUSH BXPUSH CXPUSH SI ;子程序的工作部分POP SI ;现场的恢复POP CXPOP BXPOP AXRET ;子程序返回ABC ENDP ;子程序结束上述压栈和出栈的顺序可见堆栈的特点是“先进后出”。子程序的正确调用及返回由正确选择子程序开始的属性和堆 栈平衡来保证。所谓堆栈平衡,就是在一个程序中有多少条 压栈指令,则应有相同多条出栈指令,这样才能使RET弹出正 确的返回地址。SICXBXAXAXIP保护现场后的堆栈 状态恢复现场后的堆栈 状态SPIPSP程序执行时堆栈的状态调用程序 的IP例:若在上面例题的恢复例:若在上面例题的恢复 现场时少了一条现场时少了一条“POP POP AX”AX”的指令,则程序就不的指令,则程序就不 能返回调用程序中的正确能返回调用程序中的正确 地址。程序执行时堆栈的地址。程序执行时堆栈的 状态如右图。由图可见,状态如右图。由图可见, 恢复现场后的恢复现场后的“RET”RET”指令指令 会将会将(SP)(IP)=(AX)(SP)(IP)=(AX),则,则 使子程序不能正确地返回使子程序不能正确地返回 调用程序。调用程序。 注意:子程序中使用到的寄存器是应该保存 与恢复,但是其中用来向子程序传递参数的 寄存器,可不需保护与恢复,特别是向调用 程序回送结果的寄存器,就千万不要保护与 恢复,否则,子程序的回送结果就会被恢复 而破坏。第二节 子程序的参数传递由于某些变量的赋值不同,子程序就可以对不同的数据进 行相同的处理。所以,在调用子程序以前主程序应将这 些参数(入口参数)传递给子程序,而子程序在返回主 程序时也应将结果(出口参数)回送给主程序,这就是 子程序的参数传递。 子程序参数传递的方法一般有三种: 1.寄存器传递法:适用于参数少时。 2.变量传递法:适用于同一源文件(程序模块)中。 3.堆栈传递法:只适用于传递入口参数。 上述三种方法各有特点,选用时可根据具体情况而定,只 是要注意主程序和子程序之间一定要配合好,以便取到 正确的参数。下面将举例说明三种参数传递的方法。用寄存器传递参数就是将要传递的参数约定在寄存器中。主程序 将入口参数存入约定的寄存器,而子程序则从约定的寄存器取 出这些参数进行操作;子程序处理的结果也存入约定的寄存器 ,而主程序则从约定的寄存器取出这些出口参数进行进一步的 处理。 例5-1:编程将变量S开平方,平方根和余数分别存入SUM和SUM+2中 。开平方的算法:N的平方等于N个自然奇数之和。即 12=122=1+3 32=1+3+5N2=1+3+5+(2N1) ;N个奇数之和从S中依次减去奇数1、3、5、,至被开方数小于下一个奇数为 止,累计减去奇数的个数就是S的整数平方根。减完剩下的值 就是余数。一、用寄存器传递参数源程序如下: DATA SEGMENT S DW 101H SUM DW 2 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AX,SCALL SQUR ;调开平方子程 序MOV SUM,CXMOV SUM+2,AX MOV AX,4C00H INT 21HSQUR PROC NEARPUSH DX ;现场的保护MOV CX,0;平方根MOV DX,1;自然奇数的首项 REP1: CMP AX,DX JB EXITSUB AX,DXINC CXADD DX,2JMP REP1 EXIT: POP DX ;现场的恢复RET ;子程序返回 SQUR ENDP CODE ENDSEND START在该程序中,主程序将被开平方值存入在该程序中,主程序将被开平方值存入AXAX寄存器寄存器,子程序,子程序 则从则从AXAX寄存器取出该值来开平方。子程序将寄存器取出该值来开平方。子程序将平方根存入平方根存入CXCX寄存寄存 器,余数存入器,余数存入AXAX寄存器寄存器,主程序则从,主程序则从CXCX寄存器取出平方根存入寄存器取出平方根存入 SUMSUM中,从中,从AXAX寄存器取出余数存入寄存器取出余数存入SUM+2SUM+2中。中。由于,由于,AXAX和和CXCX寄存器都是用来传递参数的,所以,子程序寄存器都是用来传递参数的,所以,子程序 中只对中只对DXDX进行保护与恢复。试想在该程序中如果对进行保护与恢复。试想在该程序中如果对AXAX和和CXCX寄存寄存 器进行保护与恢复将会出现什么情况?器进行保护与恢复将会出现什么情况? 程序开始时,对程序开始时,对AXAX和和CXCX寄存器进行保护,即将寄存器进行保护,即将AXAX寄存器中的寄存器中的 被开平方值和主程序中的被开平方值和主程序中的CXCX寄存器中值压入堆栈进行保护;程寄存器中值压入堆栈进行保护;程 序结束前,对序结束前,对AXAX和和CXCX寄存器进行恢复,即将堆栈中的被开平方寄存器进行恢复,即将堆栈中的被开平方 值和原来主程序中的值和原来主程序中的CXCX寄存器中值弹出至寄存器中值弹出至AXAX和和CXCX寄存器,则子寄存器,则子 程序中求出的存在程序中求出的存在CXCX寄存器中的平方根和存在寄存器中的平方根和存在AXAX寄存器中的余寄存器中的余 数将会丢失。所以,子程序中不能对用来传递参数的寄存器进数将会丢失。所以,子程序中不能对用来传递参数的寄存器进 行保护与恢复。行保护与恢复。用寄存器传递参数方法简单,执行的速度也很快,但是由用寄存器传递参数方法简单,执行的速度也很快,但是由 于于寄存器很有限,寄存器很有限,不能用于传递很多的参数。不能用于传递很多的参数。 二、用变量传递参数二、用变量传递参数 用变量传递参数就是将要传递的参数约定在变量中。主程序将入口参用变量传递参数就是将要传递的参数约定在变量中。主程序将入口参 数存入约定的变量,而子程序则从约定的变量中取出这些参数进行操作;数存入约定的变量,而子程序则从约定的变量中取出这些参数进行操作; 子程序处理的结果也存入约定的变量,而主程序则从约定的变量中取出这子程序处理的结果也存入约定的变量,而主程序则从约定的变量中取出这 些出口参数进行进一步的处理。些出口参数进行进一步的处理。 例例5-15-1源程序:源程序:DATA SEGMENT DATA SEGMENT S DW ? S DW ? SUM DW ?,? SUM DW ?,? DATA ENDS DATA ENDS CODE SEGMENT CODE SEGMENT ASSUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATA START START:MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX MOV S,256 MOV S,256CALL SQUR CALL SQUR ;调;调“开平方开平方”子程序子程序 MOV BX,SUMMOV BX,SUM ;可进行显示等处理;可进行显示等处理 MOV AX,4C00H MOV AX,4C00H INT 21H INT 21HSQUR PROC NEARPUS
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号