I need help with the following MIPS machine assembly code question (translate fr
ID: 3585667 • Letter: I
Question
I need help with the following MIPS machine assembly code question (translate from C to MIPS machine assembly code):
Implement the following C code in MIPS assembly.
int verify (int n) {
if (n <= 2) {
return n;
else
return n –verify(n-1)*verify(n-2);
}
#SIMILAR PROBLEM BELOW:
Implement the following C code in MIPS assembly.
int square (int n) {
if (n <= 2) {
return n*n;
else
return n*n + square (n – 1)+square(n – 2);
}
fib: addi $sp, $sp, -12 # make room on stack
sw $ra, 8($sp) # push $ra
sw $s0, 4($sp) # push $s0
sw $a0, 0($sp) # push $a0 (N)
bgt $a0, $0, cont # if n>0, test if n=1
add $v0, $0, $0 # else fib(0) = 0
j rtn #
cont: addi $t0, $0, 1 #
bne $t0, $a0, cal # if n>1, gen
add $v0, $0, $t0 # else fib(1) = 1
j rtn
cal: subi $a0, $a0,1 # n-1
jal fib # call fib(n-1)
add $s0, $v0, $0 # copy fib(n-1)
sub $a0, $a0,1 # n-2
jal fib # call fib(n-2)
add $v0, $v0, $s0 # fib(n-1)+fib(n-2)
rtn: lw $a0, 0($sp) # pop $a0
lw $s0, 4($sp) # pop $s0
lw $ra, 8($sp) # pop $ra
addi $sp, $sp, 12 # restore sp
jr $ra
Explanation / Answer
verify: addi $sp, $sp, -12 # Adjust sp
addi $t0, $a0, -1 # Compute n-1
addi $t1, $a0, -2 # Compute n-2
sw $t0, 0($sp) # Save n-1 to stack
sw $t1, 4($sp) # Save n-2 to stack
sw $ra, 8($sp) # Save return address
slt $r1, 2, $a0 # check if 2 < n if true $r1 = 1 else $r1 = 0
beq $r1, 1, ELSE # branch ( 2 < n )
li $v0, $a0 # Set return value to n
addi $sp, $sp, 12 # Adjust sp
jr $ra # Return
ELSE: move $a0, $t0 # update n to n-1
jal verify # call verify with n-1
sw $v0, 0($sp) # save the result of verify(n-1) to stack
lw $t0, 4($sp) # Restore n - 2 from stack
move $a0, $t0 # update n to n-2
jal verify # call verify with n-2
lw $t1, 0($sp) # Restore result of verify(n-1) from stack
mult $v0, $t1 # Multiple result of verify(n-1) with verify(n-2)
mflo $t2 # Put result in t2
lw $t0, 4($sp) # Restore n - 2 from stack
addi $t0, $t0, 2 # add 2 to n-2 to get n
sub $v0, $t0, $t2 # subtract result t2 from n
lw $ra, 8($sp) # restore return address from stack
addi $sp, $sp, 12 # Adjust sp
jr $ra # Return