首页 理论教育 子程序及其参数的传递过程

子程序及其参数的传递过程

时间:2022-02-28 理论教育 版权反馈
【摘要】:PROC与ENDP相当于一对括号,将子程序的处理过程括在括号内。这样才能保证子程序的运行不破坏主程序的工作现场。子程序对其入口参数进行一系列处理之后得到处理结果,该结果必须送给调用它的主程序,即提供出口参数以便主程序使用。上面介绍的是指主、子程序之间有参数要传递的情况。有时,一个子程序没有入口出口参数,只是按规定完成某种操作功能,此时,自然不考虑参数的传递问题。

4.5.2 子程序及其参数的传递过程

1.子程序的定义格式

子程序是按过程形式定义的,其格式有两种:

子程序名 PROC NEAR

子程序名ENDP

子程序名 PROC FAR

子程序名ENDP

其中子程序名由用户定义,如子程序SUB可定义如下:

SUB1 PROC NEAR

SUB1ENDP

子程序定义的最后一行必须是与子程序第一行具有相同名字的ENDP语句,否则认为是过程打开的语法错。PROC与ENDP相当于一对括号,将子程序的处理过程括在括号内。

段内调用的子程序一般为NEAR类型,段间调用的子程序一般为FAR类型。当为NEAR类型时可以省写“NEAR”。例如,B为段内调用的子程序,可定义如下:

B PROC

B ENDP或B PROC FAR…B ENDP

2.现场的保护与恢复

如果在子程序中要用到某些寄存器(或存储单元),就会破坏这些寄存器(或存储单元)在转子前原有的内容。当执行完子程序返回断点继续执行主程序时,只能以被破坏的现场为背景进行工作,这显然不能达到预定的目的。因此,现场的保护与恢复是必须考虑的。

保护与恢复现场的工作可以在主程序中完成,也可以在子程序中完成。一般情况下是在子程序的开始安排一串保护现场的语句,在子程序的返回指令之前再恢复现场。这样处理,主程序在转子前后均不必考虑保护、恢复现场的工作。其处理流程显得清晰。尤其是当多处调用同一子程序时,每处都省去了转子前后保存与恢复现场的语句串。将这些工作集中在子程序中去做,使整个代码简短而紧凑。

例如,若子程序A中改变了寄存器AX、BX、CX、DI、SI五个寄存器的内容,则在子程序的开始处将这些寄存器的内容入栈保护,在子程序的返回指令之前用出栈指令逐次恢复。实现方法如下:

img89

RET;返回断点处

A ENDP

注意,由于是在栈中保存各寄存器的内容,所以要依后进先出的原则,从栈中弹出信息送入相应的寄存器。上例中入栈保护的顺序是AX、BX、CX、DI、SI,出栈恢复的顺序则相反,即SI、DI、CX、BX、AX。这样才能保证子程序的运行不破坏主程序的工作现场。

另一点要格外小心的是,出口参数往往是子程序处理后要交给主程序的结果,千万不要将其与需要保护的现场混为一体,而入口参数是否要保护,依实际情况事先约定。

3.主程序与子程序之间传递参数的方式

主程序在调用子程序之前,必须把需要子程序处理的原始数据传递给子程序,即为子程序准备入口参数。子程序对其入口参数进行一系列处理之后得到处理结果,该结果必须送给调用它的主程序,即提供出口参数以便主程序使用。这种主程序为了程序准备入口参数、子程序为主程序提供出口结果的过程称为参数传递。

主程序与子程序之间传递参数的方式是事先约定好的。每一个子程序设计之前,必须确定其入口参数到哪里去取,处理后的结果送往何处。一旦子程序按此约定设计出来,无论在何处对它进行调用都必须满足子程序的要求,否则子程序将无法正常运行,或者得不到正确的结果。

常用的参数传递方式有寄存器法、约定单元法和堆栈法三种。

(1)寄存器法,就是子程序的入口参数和出口参数都在约定的寄存器之中。此法的优点是信息传递快,编程也较方便,且节省内存单元。但由于寄存器的个数有限,而且在处理过程中要经常使用寄存器,如果要传递的参数很多,将导致无空闲寄存器供编写程序使用,所以,寄存器法只适用于要传递的参数较少的情况。

(2)约定单元法,是把入口参数和出口参数都放到事先约定好的存储单元之中。此法的优点是每个子程序要处理的数据或送出的结果都有独立的存储单元,编写程序时不易出错。缺点是要占用一定数量的存储单元。

(3)堆栈法,通过堆栈来传递参数。此法的优点是参数不占用寄存器,也无需另开辟存储单元,而是存放在公用的堆栈区,处理完之后堆栈恢复原状,仍可供其他程序段使用。缺点是由于参数和子程序的返回地址混杂在一起,存取参数时必须小心计算它在栈中的位置。如果操作不慎,在执行“RET”指令时,栈顶存放的可能不是返回地址,从而导致运行的混乱。显然,对于堆栈法,编制程序比较麻烦。

到底采用哪种方式传递参数,要根据具体情况而定。有时是几种方式混合使用。不论采用什么方式,主程序与子程序的配合要默契,参数的存放位置是主、子程序之间的联络点。主程序在调用子程序之前,一定要将需要子程序处理的数据送往约定的入口联络点(入口参数存放处);子程序对入口联络点存放的入口参数进行预定的处理之后,将处理结果送往约定的出口联络点。当从子程序返回后,主程序若要使用子程序的处理结果,则必须到约定的出口联络点去取出口参数。当参数按一定规律存放时,主、子程序都要按照约定的规律去传递参数。

上面介绍的是指主、子程序之间有参数要传递的情况。有时,一个子程序没有入口出口参数,只是按规定完成某种操作功能,此时,自然不考虑参数的传递问题。

【例4-14】 子程序CRLF,其功能是输出回车换行,属无参数子程序,其程序如下:

CRLF PROC

img90

img91

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈