通常进行主程序和子程序间参数传递的方法有三种:用寄存器传递、用堆栈传递和用存储器传递。上述三种传递参数的方法有时还可以用几种方法的组合向子程序传递输入参数,或再用另外的方法向主程序传递输出参数。特别是在传递参数比较多的情况下,可以通过传递输入输出参数在内存的首地址来实现逐一参数的传递。下面我们将分别介绍三种参数传递方法的具体实现。
1.用寄存器传递参数
这种方法是将子程序的输入参数由主程序放入规定的寄存器带入子程序中。执行子程序后的结果也放入规定的寄存器带回主程序,采用该方法设计子程序时,主、子程序必须按约定在指定的寄存器中取出或存入指定参数。通常某个寄存器可以用作存放输入参数的寄存器,又同时可以用作存放输出参数的寄存器。
2.用堆栈传递参数
利用堆栈不仅可用来保存返回地址,而且还可以用来存放主程序和子程序之间传递的参数,这些参数既可以是数据,也可以是地址。用堆栈传递参数的方法是在调用子程序之前,用PUSH指令将输入参数压入堆栈,在子程序中通过出栈方式依次获得这些参数。经过子程序操作处理后再将输出参数压入堆栈,返回主程序后再通过出栈获得结果。使用这种方式传递参数时,特别要注意堆栈中断点的保存与恢复。
3.用存储单元传递参数
还有一种传递较多参数的方法是在内存中使用一个存储区来保存和传递主、子程序间的参数。主程序在调用前将所有输入参数按约定好的次序存入该存储区,进入子程序后按约定从存储区中取出输入参数进行处理,输出参数也按约定大次序存入指定的次序存入指定存储区。返回主程序后就可取得结果。通常我们还可以通过用寄存器存放存储区首址,来实现多参数情况下的传递。现在我们通过下面的例子来进行讨论。