CS61C Homework 3 - C To MIPS Practice Problems: Problem 1 - Useful Snippets
CS61C Homework 3 - C To MIPS Practice Problems: Problem 1 - Useful Snippets
Spring 2015
This homework is an ungraded assignment designed to familiarize you with translating C code to MIPS.
We will release solutions on Sunday, Feb 22nd, so that you may use them to study for the exam.
Solution:
stringprint :
# p r o l o g u e , backup ra , backup s 0
addiu $sp , $sp , −8
sw $ra , 0 ( $sp )
sw $s0 , 4 ( $sp )
Loop :
beq $a0 , $0 , Ret # break out o f l o o p i f l o a d e d c h a r a c t e r i s n u l l t e r m i n a t o r
j a l p r i n t # c a l l p r i n t ( t h i s i s why we l o a d e d t o a0 )
1
addiu $s0 , $s0 , 1 # i n c r e m e n t p o i n t e r
l b u $a0 , 0 ( $ s 0 ) # l o a d next c h a r a c t e r
j Loop
Ret :
# e p i l o g u e , r e s t o r e ra , r e s t o r e s 0
lw $s0 , 4 ( $sp )
lw $ra , 0 ( $sp )
addiu $sp , $sp , 8
j r $ra
B) Translate into MIPS, while preserving the for loop structure (your function is given the string length):
Solution:
stringprint :
# p r o l o g u e , backup ra , backup s0 , s1 , s 2
addiu $sp , $sp , −16
sw $ra , 0 ( $sp )
sw $s0 , 4 ( $sp )
sw $s1 , 8 ( $sp )
sw $s2 , 1 2 ( $sp )
Loop :
beq $s2 , $s1 , Ret # break out o f l o o p i f i == s l e n
addu $a0 , $s2 , $ s 0
l b u $a0 , 0 ( $a0 ) # g e t f i r s t c h a r
j a l p r i n t # c a l l p r i n t ( t h i s i s why we l o a d e d t o a0 )
addiu $s2 , $s2 , 1 # i n c r e m e n t l o o p var
j Loop
Ret :
2
# e p i l o g u e , r e s t o r e ra , r e s t o r e s0 , s1 , s 2
lw $s2 , 1 2 ( $sp )
lw $s1 , 8 ( $sp )
lw $s0 , 4 ( $sp )
lw $ra , 0 ( $sp )
addiu $sp , $sp , 16
j r $ra
Solution:
stringprint :
# p r o l o g u e , backup ra , backup s 0
addiu $sp , $sp , −8
sw $ra , 0 ( $sp )
sw $s0 , 4 ( $sp )
Loop :
j a l p r i n t # c a l l p r i n t ( t h i s i s why we l o a d e d t o a0 )
addiu $s0 , $s0 , 1 # i n c r e m e n t p o i n t e r
l b u $a0 , 0 ( $ s 0 ) # l o a d next c h a r a c t e r
bne $a0 , $0 , Loop # c o n t i n u e l o o p i f l o a d e d c h a r a c t e r i s not n u l l t e r m i n a t o r
Ret :
# e p i l o g u e , r e s t o r e ra , r e s t o r e s 0
lw $s0 , 4 ( $sp )
lw $ra , 0 ( $sp )
addiu $sp , $sp , 8
3
j r $ra
int fib(int n) {
if (n == 0) {
return 0;
} else if (n == 1) {
return 1;
}
return fib(n-1) + fib(n-2);
}
Solution:
# n o t e : t h i s s o l u t i o n i s i n s t r u c t i o n a l and not n e c e s s a r i l y o p t i m i z e d
fib :
addiu $sp , $sp , −12
sw $ra , 0 ( $sp ) #backup r a f o r r e c u r s i v e c a l l s
sw $a0 , 4 ( $sp ) #backup a0 f o r r e c u r s i v e c a l l s
sw $s0 , 8 ( $sp ) #backup s 0 s i n c e we u s e i t
lw $s0 , 8 ( $sp )
lw $ra , 0 ( $sp )
addiu $sp , $sp , 12
4
j r $ra
ReturnZero :
# e p i l o g u e j u s t t o make our r e t u r n s c o n s i s t e n t
lw $s0 , 8 ( $sp )
lw $ra , 0 ( $sp )
addiu $sp , $sp , 12
l i $v0 , 0
j r $ra
ReturnOne :
# e p i l o g u e j u s t t o make our r e t u r n s c o n s i s t e n t
lw $s0 , 8 ( $sp )
lw $ra , 0 ( $sp )
addiu $sp , $sp , 12
l i $v0 , 1
j r $ra
Solution:
# n o t e : t h i s s o l u t i o n i s i n s t r u c t i o n a l and not n e c e s s a r i l y o p t i m i z e d
fib :
5
addiu $sp , $sp , −12
sw $ra , 0 ( $sp ) #backup r a f o r r e c u r s i v e c a l l s
sw $a0 , 4 ( $sp ) #backup a0 f o r r e c u r s i v e c a l l s
sw $s0 , 8 ( $sp ) #backup s 0 s i n c e we u s e i t
# s t o r e copy i n t h e memoize t a b l e
lw $a0 , 4 ( $sp ) # f i r s t , r e s t o r e a0
s l l $t0 , $a0 , 2 # c o n v e r t n t o o f f s e t ( i n t s a r e 4 b y t e s )
addiu $t0 , $t0 , $a1 # add o f f s e t t o b a s e p o i n t e r ( $a1 )
sw $v0 , 0 ( $ t 0 )
# epilogue
lw $s0 , 8 ( $sp )
lw $ra , 0 ( $sp )
addiu $sp , $sp , 12
j r $ra
ReturnZero :
# e p i l o g u e j u s t t o make our r e t u r n s c o n s i s t e n t
lw $s0 , 8 ( $sp )
lw $ra , 0 ( $sp )
6
addiu $sp , $sp , 12
l i $v0 , 0
j r $ra
ReturnOne :
# e p i l o g u e j u s t t o make our r e t u r n s c o n s i s t e n t
lw $s0 , 8 ( $sp )
lw $ra , 0 ( $sp )
addiu $sp , $sp , 12
l i $v0 , 1
j r $ra
RetMemo : # r e t u r n s v a l u e a l r e a d y i n v0
# epilogue
lw $s0 , 8 ( $sp )
lw $ra , 0 ( $ s 0 )
addiu $sp , $sp , 12
j r $ra
short nextshort() {
static short a = 0;
return a++;
}
Tips/Hints:
• You can assume that the short type is 16 bits wide. shorts represent signed numbers.
• You can assume that your MIPS code is allowed to modify any part of memory.
Solution:
nextshort :
addiu $v0 , $0 , 0
l a $t0 , n e x t s h o r t
lw $t1 , 0 ( $ t 0 )
addiu $t3 , $0 , 0xFFFF
7
and $t2 , $t1 , $ t 3
beq $t2 , $t3 , H a n d l e S p e c i a l
addiu $t1 , $t1 , 1
sw $t1 , 0 ( $ t 0 ) # s t o r e i n c r e m e n t e d i n s t r u c t i o n
j r $ r a # r e t v a l u e i s a l r e a d y i n v0
H a n d l e S p e c i a l : # here , h a n d l e t h e o v e r f l o w c a s e
l a $t6 , b a c k u p i n s t
lw $t1 , 0 ( $ t 6 )
sw $t1 , 0 ( $ t 0 )
j r $ r a # r e t v a l u e i s a l r e a d y i n v0
backupinst :
addiu $v0 , $0 , 0