Help you learn how to use the runtime stack in SPARC assembly language programs
Paul, Chapter 5
Study many small C programs and corresponding hand-written assembly language programs
After studying each program, refer to summary sheets to reinforce and generalize the new material that the program illustrates
Describe stack structure using SPARC Architecture Stack Structure diagram
Stack consists of stack frames
Each stack frame holds the local data for one function
%sp (alias %o6) contains address of top of stack frame
%fp (alias %i6) contains address of bottom of stack frame
Stack grows toward low memory
Register window
(See lecture notes -- described briefly later)
Assembly language programmer must allocate space for it (16 words = 64 bytes)
Structure pointer
(Described briefly later)
Assembly language programmer must allocate space for it (1 word = 4 bytes)
Actual parameters 1 - 6
(Described briefly later)
Assembly language programmer must allocate space for it (6 words = 24 bytes)
Actual parameters 7, ... and saved floating-point registers
(Described briefly later)
Assembly language programmer must allocate space for them
Local variables
Assembly language programmer must allocate space for them
Assembly language programmer must determine where each local variable resides in the stack
Locations are expressed as offsets from %fp
To determine size of stack frame:
Must be at least 64 + 4 + 24 = 92 bytes
Must be a multiple of 8 => must be at least 96 bytes
Must contain extra space (beyond 92 bytes) for actual parameters and local variables
Illustrates using the stack
See sumstack.c, sumstack.S
What it does
Same as previous "sum..." programs
How it works
Uses stack to store local variables
Unnecessary (could use registers instead), but illustrative
The code: sumstack.c
Defines local variables within main function
Those variables will be stored in stack
The code: sumstack.S
(Not optimized -- for clarity and to illustrate stack manipulation)
#define FIRST_OFFSET 4 #define SECOND_OFFSET 8 #define SUM_OFFSET 12 #define I_OFFSET 16Give symbolic names to stack offsets
#define MAIN_LOCAL_SIZE 16Specifies number of bytes required to store local variables
save %sp, (-92 - MAIN_LOCAL_SIZE) & -8, %sp(-92 - MAIN_LOCAL_SIZE) & -8 (-92 - 16) & -8 -108 & -8 -112When x is a negative number, x & -8 yields the largest multiple of 8 that is less than x
Trick for computing stack frame size
Takes current value of %sp, adds -112
Sets %fp to old value of %sp
Stores computed value (old value of %sp - 112) in %sp
Thus pushes a new stack frame onto the stack
[%fp - FIRST_OFFSET] [%fp - SECOND_OFFSET] [%fp - I_OFFSET] [%fp - SUM_OFFSET]Expressions in address specifications in ld and st instructions to access local variables on stack
restoreSynthetic instruction for restore %g0, %g0, %g0
Restores %sp and %fp to their values prior to the save
Thus pops a stack frame from the stack
Copyright © 2002 by Robert M. Dondero, Jr.