This is important since SPIM will expect to have the Control Stack growing from the top of memory.
--------------- | space | | for | | vars | --------------- | old level ? | control Activation record for a procedure | return addr | info ---------------
Figure 7.14 Maintaining the display will be useful for our discussion. This shows using d[1], d[2], d[3] ... for the display.
The size of the activation record is known at compile time, so we can setut the appropriate pushes/pops of the Control Stack.
In lecture I will use s0 for globals, s1 for level 1, s2 for level 2, s3 for level 3 and top_sp for top of stack [TOS]
main proc A is proc B is proc C is ... A; ... end C; ... C; ... -- B calls C end B; ... B; ... -- A calls B end A; end; -- main
Assume:
Main calls A calls B calls C calls A (A') calls B (B') calls C (C')
The Display:
--------------------------------------------- | calls A B C A' B' C' | |-------------------------------------------- | d[3] ? ? C C C C' | --------------------------------------------- | d[2] ? B B B B' B' | --------------------------------------------- | d[1] A A A A' A' A' | --------------------------------------------- | saved: ? ? ? A B C | ---------------------------------------------
$top_sp -> ----------------- |local vars (C) | | : old d[3]|-----------------------------------* |AR(C): return | | $s3 -> ----------------- | |local vars (B) | | | : old d[2]|--------------------------------* | |AR(B): return | | | $s2 -> ----------------- | | |local vars (A) | | | | : old d[1]|-----------------------------* | | |AR(A): return | | | | $s1 -> ----------------- | | | |local vars (C) | | | | | : old d[3]|----> (old $s3 never set) | | | |AR(C): return | | | | ----------------- <---------------------------|--|--* |local vars (B) | | | | : old d[2]|----> (old $s2 never set) | | |AR(B): return | | | ----------------- <---------------------------|--* |local vars (A) | | | : old d[1]|----> (old $s1 never set) | |AR(A): return | | ----------------- <---------------------------* | | | global vars | $s0 -> ----------------- | code A,B,C | | | | code main | -----------------