2.子程序的调用和返回
主程序调用子程序使用指令CALL。根据CALL获得目标地址的方法,有四种调用方式:段内直接调用方式、段内间接调用方式、段间直接调用方式和段间间接调用方式。为了能正确返回,不管哪一种调用方式,都需要把断点(即CALL指令的下一条指令的地址)入栈保护。同时,CALL指令的类型必须与RET指令类型相匹配。
主程序调用程序方式分直接调用和间接调用两种类型,每种类型又分为段内调用和段间调用两种方式。
3.主程序和子程序间的信息交换
子程序中允许改变的数据叫参数。参数有入口参数和出口参数。主程序调用子程序之前必须向子程序提供一些参数,而子程序执行完毕后又要将执行结查提供给主程序使用。参数传递的方式一般有3种,即用寄存器传递参数、用参数表传递参数和用堆栈传递参数。不论采用哪种方式,调用程序和子程序都必须互相呼应。子程序需要在哪里取参数,主程序就应将参数送到哪里,并且要注意参数的先后顺序。
4.递归子程序和子程序嵌套
在子程序调用过程中,子程序调用该子程序本身称为递归调用。递归分直接递归和间接递归两种方式。直接递归子程序的结构为:
SBC PROC
┆
CALL SBC
┆
RET
SBC ENDP
间接递归于程序的格式:
SBC1 PROC
┆
CALL SBC2
┆
RET
SBC2 PROC
┆
CALL SBC1
┆
RET
设计递归子
程序的关键是防止出现死循环,注意脱离递归的出口条件。