ST10R272L - SYSTEM PROGRAMMING
310/320
Note
It is possible to use CALLS within the same segment, but still two words of the stack
are used to store both the IP and CSP.
18.5.3 Providing local registers for subroutines
For subroutines which require local storage, the following methods are provided:
Alternate Bank of Registers: Upon entry into a subroutine, it is possible to specify a new
set of local registers by executing the SCXT (switch context) instruction. This mechanism
does not provide a method to recursively call a subroutine.
Saving and Restoring of Registers: To provide local registers, the contents of the registers
which are required for use by the subroutine can be pushed onto the stack and the previous
values be popped before returning to the calling routine. This is the most common technique
used today and it does provide a mechanism to support recursive procedures. This method,
however, requires two machine cycles per register stored on the system stack (one cycle to
PUSH the register, and one to POP the register).
Use of the System Stack for Local Registers: It is possible to use the SP and CP to set up
local subroutine register frames. This allows subroutines to dynamically allocate local
variables as needed within two machine cycles. A local frame is allocated by simply
subtracting the number of required local registers from the SP, and then moving the value of
the new SP to the CP.
This operation is supported through the SCXT (switch context) instruction with the
addressing mode ’reg, mem’. Using this instruction saves the old contents of the CP on the
system stack and moves the value of the SP into CP (see example below). Each local
register is then accessed as if it was a normal register. Upon exit from the subroutine, first
the old CP must be restored by popping it from the stack and then the number of used local
registers must be added to the SP to restore the allocated local space back to the system
stack.
Note
The system stack is grows downwards and the register bank grows upwards.
After entering the subroutine:
SUB
SP, #10
;Free 5 words in the current system stack
SCXT
CP, SP
;Set the new register bank pointer
Before exiting the subroutine:
POP
CP
;Restore the old register bank
ADD
SP, #10
;Release the 5 word of the current system stack