Session 13
Stack
DR. SIMING LIU
SPRING 2016
COMPUTER SCIENCE AND ENGINEERING
UNIVERSITY OF NEVADA, RENO
Aside: Spilling Registers
What if the callee needs to use more registers than allocated to
argument and return values?
Callee uses a stack – a last-in-first-out queue
One of the general registers,
High address
$sp
0xffffffff
Top of stack
$sp($29), is used to address the
stack (which “grows” from high
address to low address)
Add data onto the stack – push
$sp = $sp – 4
#put data on stack at new $sp
0x00000000
Low address
Remove data from the stack – pop
$sp = $sp + 4
#get data from stack at $sp
Stacking of Subroutine Environments
Procedures are nested, there are multiple calls and returns
C is a “leaf” procedure, but B is a nested (non-leaf) procedure
The stack grows downward at each new call, shrinks upward at each return
A
A:
CALL B
A
B
B:
CALL C
C:
RET
RET
A
B
C
A
A
B
Aside: Allocating Space on the Stack
The segment of the stack
High address
(0xffffffff)
Saved argument
regs (if any)
$fp
Saved return addr
Saved local regs
(if any)
Local arrays &
structures (if any)
Low address
(0x00000000)
containing a procedure’s saved
registers and local variables is its
procedure frame (aka activation
record)
$sp
The frame pointer ($fp) points to the
first word of the frame of a procedure
– providing a stable “base” register for
the procedure
$fp is initialized using $sp on a call
and $sp is restored using $fp on a
return
Local Data on the Stack
Local data allocated by callee
e.g., C automatic variables
Procedure frame (activation record)
Used by some compilers to manage stack storage
Memory Layout
Text: program code
Static data: global variables
e.g.,
static variables in C, constant
arrays and strings
$gp
initialized to address allowing
±offsets into this segment
Dynamic data: heap
E.g., malloc in C, new in Java
Stack: automatic storage
Chapter 2 — Instructions: Language
of the Computer — 6
Using Registers to Implement Procedures
Caller
Save caller-saved registers $a0-$a3, $t0-$t9
Load arguments in $a0-$a3, rest on stack above $fp
Execute jal instruction
Callee Setup
Allocate memory in frame ($sp = $sp - frame)
Save callee-saved registers $s0-$s7, $fp, $ra
Create frame ($fp = $sp + frame size)
Callee Return
Place return value in $v0 and $v1
Restore any callee-saved registers ($fp, $ra, $s0-$s7, …)
Pop stack ($sp = $sp + frame size)
Return by jr $ra
Calling Convention: Steps
fp
sp
First four arguments
passed in registers
Callee
setup: step 1
fp
sp
Adjust $sp
Callee
setup: step 2
fp
sp
Before call:
Callee
setup: step 3
fp
sp
ra
old fp
$s0-$s7
Save registers as needed
ra
old fp
$s0-$s7
Adjust $fp
Byte-encoded character sets
ASCII: 128 characters
95 graphic, 33 control
Latin-1: 256 characters
ASCII, +96 more graphic characters
Unicode: 32-bit character set
Used in Java, C++ wide characters, …
Most of the world’s alphabets, plus symbols
UTF-8, UTF-16: variable-length encodings
Chapter 2 — Instructions: Language
of the Computer — 9
§2.9 Communicating with People
Character Data
Byte/Halfword Operations
Could use bitwise operations
MIPS byte/halfword load/store
String processing is a common case
lb rt, offset(rs)
Sign extend to 32 bits in rt
lbu rt, offset(rs)
lhu rt, offset(rs)
Zero extend to 32 bits in rt
sb rt, offset(rs)
lh rt, offset(rs)
sh rt, offset(rs)
Store just rightmost byte/halfword
Chapter 2 — Instructions: Language
of the Computer — 10
String Copy Example
C code (naive):
Null-terminated string
void strcpy (char x[], char y[])
{
int i;
i = 0;
while ((x[i]=y[i])!='\0')
i += 1;
}
Addresses of x, y in $a0, $a1
i in $s0
Chapter 2 — Instructions: Language
of the Computer — 11
String Copy Example
MIPS code:
strcpy:
addi
sw
add
L1: add
lbu
add
sb
beq
addi
j
L2: lw
addi
jr
$sp,
$s0,
$s0,
$t1,
$t2,
$t3,
$t2,
$t2,
$s0,
L1
$s0,
$sp,
$ra
$sp, -4
0($sp)
$zero, $zero
$s0, $a1
0($t1)
$s0, $a0
0($t3)
$zero, L2
$s0, 1
0($sp)
$sp, 4
#
#
#
#
#
#
#
#
#
#
#
#
#
adjust stack for 1 item
save $s0
i = 0
addr of y[i] in $t1
$t2 = y[i]
addr of x[i] in $t3
x[i] = y[i]
exit loop if y[i] == 0
i = i + 1
next iteration of loop
restore saved $s0
pop 1 item from stack
and return
Chapter 2 — Instructions: Language
of the Computer — 12