CS536 Homework 9 Solution
Question 1:
Assuming that the parameters are pushed onto the stack before the function is called. Parameter a is at 4($fp) and b at 8($fp).
.text
func:
# Prologue
sw $ra, 0($sp) #PUSH
subu $sp, $sp, 4
sw $fp, 0($sp) #PUSH
subu $sp, $sp, 4
addu $fp, $sp, 8
# FUNCTION BODY
## WHILESTMT
.L0:
lw $t0, 4($fp)
sw $t0, 0($sp) #PUSH
subu $sp, $sp, 4
lw $t0, 8($fp)
sw $t0, 0($sp) #PUSH
subu $sp, $sp, 4
lw $t1, 4($sp) #POP
addu $sp, $sp, 4
lw $t0, 4($sp) #POP
addu $sp, $sp, 4
blt $t0, $t1, .L2
j .L1
.L2:
#ASSIGN
lw $t0, 4($fp)
sw $t0, 0($sp) #PUSH
subu $sp, $sp, 4
li $t0, 2
sw $t0, 0($sp) #PUSH
subu $sp, $sp, 4
lw $t1, 4($sp) #POP
addu $sp, $sp, 4
lw $t0, 4($sp) #POP
addu $sp, $sp, 4
mult $t0, $t1
mflo $t0
sw $t0, 0($sp) #PUSH
subu $sp, $sp, 4
la $t0, 4($fp)
sw $t0, 0($sp) #PUSH
subu $sp, $sp, 4
lw $t1, 4($sp) #POP
addu $sp, $sp, 4
lw $t0, 4($sp) #POP
addu $sp, $sp, 4
sw $t0, 0($t1)
j .L0
.L1: # Loop successor
#RETURN
lw $t0, 4($fp)
sw $t0, 0($sp) #PUSH
subu $sp, $sp, 4
lw $v0, 4($sp) #POP
addu $sp, $sp, 4
j _func_Exit
_func_Exit:
# Epilogue
lw $ra, 0($fp)
move $t0, $fp #save control link
lw $fp, -4($fp) #restore FP
move $sp, $t0 #restore SP
jr $ra
Question 2:
if ((a * b) > (a + b)) {
c = (a * b) / (a + b);
}
else {
c = (a + b) / (a * b);
}