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);
}