CSSE 232 Computer Architecture I
Procedures I
1 / 29
CSSE 232 Computer Architecture I Procedures I 1 / 29 Class Status - - PowerPoint PPT Presentation
CSSE 232 Computer Architecture I Procedures I 1 / 29 Class Status Reading for today 2.8 B.6 2 / 29 Outline Big immediates and $at Procedure steps Instructions Register review Spilling registers Stack and frames
1 / 29
Reading for today
2 / 29
3 / 29
lw $t1, A($t1)
and store result in register $t1.
values.
4 / 29
lw $t1, A($t1)
and store result in register $t1.
values.
4 / 29
lw $t1, A($t1)
and store result in register $t1.
values.
4 / 29
5 / 29
5 / 29
i n t main ( ) { i n t a = 1; i n t b = 2; i n t c = add (a , b ) ; r e t u r n 2 ∗ c ; } i n t add ( i n t x , i n t y ) { r e t u r n x + y ; }
1 Place parameters in registers 2 Transfer control to procedure 3 Acquire storage for procedure 4 Perform procedure’s operations 5 Place result in register for caller 6 Return to place of call
6 / 29
jal ProcedureLabel
jr $ra
7 / 29
8 / 29
8 / 29
8 / 29
Special register which holds the address of the next instruction The jal instruction saves PC + 4 in $ra
9 / 29
Register # Register Name Description zero Hardwired to zero 1 at Reserved for assembler 2 v0 3 v1 Return values from procedure calls 4 a0 5 a1 6 a2 7 a3 Arguments passed to procedure calls
10 / 29
Register # Register Name Description 8 t0 9 t1 10 t2 11 t3 12 t4 13 t5 14 t6 15 t7 Temporary values, caller saves
11 / 29
Register # Register Name Description 16 s0 17 s1 18 s2 19 s3 20 s4 21 s5 22 s6 23 s7 Saved values, callee saves
12 / 29
Register # Register Name Description 24 t8 25 t9 Temporary values caller saves 26 k0 27 k1 Reserved for OS kernel 28 gp Pointer to global area 29 sp Stack pointer 30 fp Frame pointer 31 ra Return address
13 / 29
14 / 29
14 / 29
14 / 29
14 / 29
14 / 29
15 / 29
Stack Dynamic data Static data Text Reserved $sp 7 f f f f f f c he x $gp 1000 8000he x 1000 0000he x pc 0040 0000he x
16 / 29
local variables
procedure
bounds of the stack frame
17 / 29
This is a simplified convention, actual MIPS programs use a more complex convention.
18 / 29
High address Low address a. b. c. Saved argument registers (if any) $sp $sp $sp $ f p $ f p $ f p Saved return address Saved saved registers (if any) Local arrays and structures (if any)
Before During After
19 / 29
20 / 29
21 / 29
22 / 29
i n t main ( ) { i n t w , x , y ; . . . // put v a l u e s i n w and x y = leaf_example (w , x ) ; y = w + y ; . . . }
Assume w, x are stored in $t0,$t1 and y is stored in $s0.
23 / 29
i n t main ( ) { i n t w , x , y ; . . . // put v a l u e s i n w and x y = leaf_example (w , x ) ; y = w + y ; . . . }
Assume w, x are stored in $t0,$t1 and y is stored in $s0.
main : . . . #put a v a l u e i n x addi $a0 , $t0 , #put w i n arg reg addi $a1 , $t1 , #put x i n arg reg j a l leaf_example #make procedure c a l l addi $s0 , $v0 , #put r e t u r n v a l u e i n y add $s0 , $t1 , $s0 #compute new y . . . j r $ra
24 / 29
i n t main ( ) { i n t w , x , y ; . . . // put v a l u e s i n w and x y = leaf_example (w , x ) ; y = w + y ; . . . }
Assume w, x are stored in $t0,$t1 and y is stored in $s0.
main : . . . #put a v a l u e i n x addi $a0 , $t0 , #put w i n arg reg addi $a1 , $t1 , #put x i n arg reg j a l leaf_example #make procedure c a l l addi $s0 , $v0 , #put r e t u r n v a l u e i n y add $s0 , $t1 , $s0 #compute new y . . . j r $ra
First try... still need to save $t1...
24 / 29
i n t main ( ) { i n t w , x , y ; . . . // put v a l u e s i n w and x y = leaf_example (w , x ) ; y = w + y ; . . . }
Assume w, x are stored in $t0,$t1 and y is stored in $s0.
main : . . . #put a v a l u e i n x addi $sp , $sp , −4 #a d j u s t stac k to save a v a l u e sw $t0 , 4( $sp ) #save t0 f o r l a t e r addi $a0 , $t0 , #put w i n arg reg addi $a1 , $t1 , #put x i n arg reg j a l leaf_example #make procedure c a l l lw $t0 , 4( $sp ) #r e s t o r e t0 addi $s0 , $v0 , #put r e t u r n v a l u e i n y add $s0 , $t1 , $s0 #compute new y . . . addi $sp , $sp , 4 #r e s t o r e stack p o i n t e r j r $ra
25 / 29
i n t main ( ) { i n t w , x , y ; . . . // put v a l u e s i n w and x y = leaf_example (w , x ) ; y = w + y ; . . . }
Assume w, x are stored in $t0,$t1 and y is stored in $s0.
main : . . . #put a v a l u e i n x addi $sp , $sp , −4 #a d j u s t stac k to save a v a l u e sw $t0 , 4( $sp ) #save t0 f o r l a t e r addi $a0 , $t0 , #put w i n arg reg addi $a1 , $t1 , #put x i n arg reg j a l leaf_example #make procedure c a l l lw $t0 , 4( $sp ) #r e s t o r e t0 addi $s0 , $v0 , #put r e t u r n v a l u e i n y add $s0 , $t1 , $s0 #compute new y . . . addi $sp , $sp , 4 #r e s t o r e stack p o i n t e r j r $ra
Now, add the $s0 save/restore...
25 / 29
i n t main ( ) { i n t w , x , y ; . . . // put v a l u e s i n w and x y = leaf_example (w , x ) ; y = w + y ; . . . }
Assume w, x are stored in $t0,$t1 and y is stored in $s0.
main : . . . #put a v a l u e i n x addi $sp , $sp , −8 #a d j u s t stac k to save 2 v a l u e s sw $s0 , 0( $sp ) #save s0 b e f o r e u s in g sw $t0 , 4( $sp ) #save t0 f o r l a t e r addi $a0 , $t0 , #put w i n arg reg addi $a1 , $t1 , #put x i n arg reg j a l leaf_example #make procedure c a l l lw $t0 , 4( $sp ) #r e s t o r e t0 addi $s0 , $v0 , #put r e t u r n v a l u e i n y add $s0 , $t1 , $s0 #compute new y . . . lw $s0 , 0( $sp ) #r e s t o r e s0 addi $sp , $sp , 8 #r e s t o r e stack p o i n t e r j r $ra
26 / 29
i n t main ( ) { i n t w , x , y ; . . . // put v a l u e s i n w and x y = leaf_example (w , x ) ; y = w + y ; . . . }
Assume w, x are stored in $t0,$t1 and y is stored in $s0.
main : . . . #put a v a l u e i n x addi $sp , $sp , −8 #a d j u s t stac k to save 2 v a l u e s sw $s0 , 0( $sp ) #save s0 b e f o r e u s in g sw $t0 , 4( $sp ) #save t0 f o r l a t e r addi $a0 , $t0 , #put w i n arg reg addi $a1 , $t1 , #put x i n arg reg j a l leaf_example #make procedure c a l l lw $t0 , 4( $sp ) #r e s t o r e t0 addi $s0 , $v0 , #put r e t u r n v a l u e i n y add $s0 , $t1 , $s0 #compute new y . . . lw $s0 , 0( $sp ) #r e s t o r e s0 addi $sp , $sp , 8 #r e s t o r e stack p o i n t e r j r $ra
Finally, let’s add in the $ra save...
26 / 29
i n t main ( ) { i n t w , x , y ; . . . // put v a l u e s i n w and x y = leaf_example (w , x ) ; y = w + y ; . . . }
Assume w, x are stored in $t0,$t1 and y is stored in $s0.
main : . . . #put a v a l u e i n x addi $sp , $sp , −12 #a d j u s t sta ck to save 3 v a l u e s sw $s0 , 0( $sp ) #save s0 b e f o r e u s in g sw $t0 , 4( $sp ) #save t0 f o r l a t e r sw $ra , 8( $sp ) #save ra b e f o r e jump addi $a0 , $t0 , #put w i n arg reg addi $a1 , $t1 , #put x i n arg reg j a l leaf_example #make procedure c a l l lw $t0 , 4( $sp ) #r e s t o r e t0 addi $s0 , $v0 , #put r e t u r n v a l u e i n y add $s0 , $t1 , $s0 #compute new y . . . lw $s0 , 0( $sp ) #r e s t o r e s0 lw $ra , 8( $sp ) #r e s t o r e ra addi $sp , $sp , 12 #r e s t o r e stac k p o i n t e r j r $ra
27 / 29
i n t leaf_example ( i n t a , i n t b ) { i n t c , d ; c = 5; d = a + b +c ; . . . r e t u r n d ; }
Where are a and b stored? Assume c must be stored in $s0 and d is stored in $t0.
28 / 29
i n t leaf_example ( i n t a , i n t b ) { i n t c , d ; c = 5; d = a + b +c ; . . . r e t u r n d ; }
Where are a and b stored? Assume c must be stored in $s0 and d is stored in $t0.
Leaf_example : addi $sp , $sp , −4 #a d j u s t stack f o r 1 v a l u e sw $s0 , 0( $sp ) #p l a c e s0 c o n t e n t s
stack addi $s0 , $zero , 5 #s0 g e t s 5 add $t0 , $a0 , $a1 #add arguments a + b , s t o r e i n temp add $t0 , $t0 , $s0 #add temp + c , s t o r e i n s0 . . . addi $v0 , $t0 , #move r e t u r n to t0 lw $s0 , 0( $sp ) #r e s t o r e s0 addi $sp , $sp , 4 #r e s t o r e st ack p i o n t e r j r $ra #r e t u r n to l i n e a f t e r c a l l
28 / 29
29 / 29