.NH 2 Parameters and local variables. .PP In the EM calling sequence, the calling procedure pushes its parameters on the stack before doing the CAL. The called routine first saves some status information on the stack and then allocates space for its own locals (also on the stack). Usually, one special purpose register, the Local Base (LB) register, is used to access both the locals and the parameters. If memory is highly segmented, the stack frames of the caller and the callee may be allocated in different fragments; an extra Argument Base (AB) register is used in this case to access the actual parameters. See 4.2 of .[ keizer architecture .] for further details. .PP If a procedure call is expanded in line, there are two problems: .IP 1. 3 No stack frame will be allocated for the called procedure; we must find another place to put its locals. .IP 2. The LB register cannot be used to access the actual parameters; as the CAL instruction is deleted, the LB will still point to the local base of the \fIcalling\fR procedure. .LP The local variables of the called procedure will be put in the stack frame of the calling procedure, just after its own locals. The size of the stack frame of the calling procedure will be increased during its entire lifetime. Therefore our model will allow a limit to be set on the number of bytes for locals that the called procedure may have (see next section). .PP There are several alternatives to access the parameters. An actual parameter may be any auxiliary expression, which we will refer to as the \fIactual parameter expression\fR. The value of this expression is stored in a location on the stack (see above), the \fIparameter location\fR. .sp 0 The alternatives for accessing parameters are: .IP - save the value of the stackpointer at the point of the CAL in a temporary variable X; this variable can be used to simulate the AB register, i.e. parameter locations are accessed via an offset to the value of X. .IP - create a new temporary local variable T for the parameter (in the stack frame of the caller); every access to the parameter location must be changed into an access to T. .IP - do not evaluate the actual parameter expression before the call; instead, substitute this expression for every use of the parameter location. .LP The first method may be expensive if X is not put in a register. We will not use this method. The time required to evaluate and access the parameters when the second method is used will not differ much from the normal calling sequence (i.e. not in line call). It is not expensive, but there are no extra savings either. The third method is essentially the 'by name' parameter mechanism of Algol60. If the actual parameter is just a numeric constant, it is advantageous to use it. Yet, there are several circumstances under which it cannot or should not be used. We will deal with this in the next section. .sp 0 In general we will use the third method, if it is possible and desirable. Such parameters will be called \fIin line parameters\fR. In all other cases we will use the second method.