+1 (315) 557-6473 

Recursive function programming in MIPS assembly assignment help

The program deals with generating a sequence of numbers using the Fibonacci sequence algorithm. The program uses a recursive function in MIPS assembly following the MIPS calling convention and activation records in the stack to save the current program state between each call. Take a look at the following sample for an in-depth demonstration of our MIPS assembly assignment help.
Table Of Contents
  • Using Recursive Functions to Implement Fibonacci Sequence Algorithm

Using Recursive Functions to Implement Fibonacci Sequence Algorithm

Recursive function programming in MIPS assembly assignment help

.data RECORDS: .space 1024 S: .text main: la $s7, S # load address of end of records in s7 li $s0, 1 # first number to calculate loop: move $a0, $s0 # pass number to subroutine jalzib # zib(i) # print number move $a0, $v0 # move return value to a0 to print it li $v0, 1 # syscall number to print integer syscall # print space li $a0, 32 # load ascii space value li $v0, 11 # syscall number to print character syscall addi $s0, $s0, 1 # increment number to calculate ble $s0, 20, loop # repeat while number is below or equal to 20 # exit program li $v0,10 # syscall number to exit program syscall #------------------------------------------------------------------------------- # zib recursive subroutine, requires the number in a0, returns the result in v0 #------------------------------------------------------------------------------- zib: # create new record in s7 addi $s7, $s7, -12 # allocate space to save 3 registers sw $ra, 0($s7) # save ra in record sw $s0, 4($s7) # save s0 in record sw $s1, 8($s7) # save s1 in record bne $a0, $zero, else1 # if (n == 0) li $v0, 1 # return 1; j return else1: bne $a0, 1, else2 # else if (n == 1) li $v0, 1 # return 1; j return else2: bne $a0, 2, else3 # else if (n == 2) li $v0, 2 # return 2; j return else3: andi $t0, $a0, 1 # else if (n%2 == 1 && n >= 3) // odd beq $t0, $zero, else4 # return zib((n-1)/2) + zib((n-1)/2-1) + 1; addi $a0, $a0, -1 # n-1 srl $a0, $a0, 1 # (n-1)/2 move $s0, $a0 jalzib # zib((n-1)/2) move $s1, $v0 # save result in s1 addi $a0, $s0, -1 # (n-1)/2 -1 jalzib # zib((n-1)/2-1) add $v0, $v0, $s1 # zib((n-1)/2) + zib((n-1)/2-1) addi $v0, $v0, 1 # zib((n-1)/2) + zib((n-1)/2-1) + 1 j return else4: # else if (n%2 == 0 && n >= 4) // even # return zib(n/2) + zib(n/2+1) + 1; srl $a0, $a0, 1 # n/2 move $s0, $a0 jalzib #zib(n/2) move $s1, $v0 # save result in s1 addi $a0, $s0, 1 # n/2 +1 jalzib # zib(n/2+1) add $v0, $v0, $s1 # zib(n/2) + zib(n/2+1) addi $v0, $v0, 1 # zib(n/2) + zib(n/2+1) + 1 return: # load old values from record and remove it lw$ra, 0($s7) # load ra from record lw $s0, 4($s7) # load s0 from record lw $s1, 8($s7) # load s1 from record addi $s7, $s7, 12 # remove space allocated for the record jr $ra # return to caller