Search for question
Question

5. (20 pts) The following code is used to derive Fibonacci algorithm with this sequence: (0, 1, 1, 2, 3, 5, 8, 13, 21, ...) where each number is "add" of

two previous ones. int fib (int n) { if (n==0) return 0; else if (n == 1) return 1; else return fib (n-1) + fib (n-2); } Explain why the following RISC-V assembly code works, you need to explain all the details using the comments as hints?/n} Explain why the following RISC-V assembly code works, you need to explain all the details using the comments as hints? 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. # IMPORTANT! Stack pointer must remain a multiple of 16!!!! addi x10, x10,8 #fib (8), you can change it fib: # If n==0, return 0 # If n==1, return 1 # Allocate 2 words of stack space beq x10, x0, done. addi x5, x0, 1 beq x10, x5, done addi x2, x2, -16 sd x1, 0 (x2) sd x10, 8 (x2) addi x10, x10, -1 jal xl, fib 1d x5, 8 (x2) sd x10, 8 (x2) addi x10, x5, -2 jal xl, fib 1d x5, 8(x2) add x10, x10, x5 return fib (n-1) + fib (n-2); # Clean up: ld xl, 0 (x2) addi x2, x2, 16 done: jalr x0, 0(x1) #Save the return address. #Save the current n # x10 n-1 # fib (n-1) #Load old n from the stack #Push fib (n-1) onto the stack # x10 = n-2 #Call fib (n-2) #x5 fib (n-1) #x10 fib (n-1) +fib (n-2) #Load saved return address # Pop two words from the stack

Fig: 1

Fig: 2