Exercise 5.5. Hand-simulate the factorial and Fibonacci machines, using some nontrivial input (requiring execution of at least one recursive call). Show the contents of the stack at each significant point in the execution. ———————————————————————————————————————————————————————————————————————— The Fibonacci machine: 0. (controller 1. (assign continue (label fib-done)) 2. fib-loop 3. (test (op <) (reg n) (const 2)) 4. (branch (label immediate-answer)) 5. ;; set up to compute Fib(n - 1) 6. (save continue) 7. (assign continue (label afterfib-n-1)) 8. (save n) ; save old value of n 9. (assign n (op -) (reg n) (const 1)); clobber n to n - 1 10. (goto (label fib-loop)) ; perform recursive call 11. afterfib-n-1 ; upon return, val contains Fib(n - 1) 12. (restore n) 13. (restore continue) 14. ;; set up to compute Fib(n - 2) 15. (assign n (op -) (reg n) (const 2)) 16. (save continue) 17. (assign continue (label afterfib-n-2)) 18. (save val) ; save Fib(n - 1) 19. (goto (label fib-loop)) 20. afterfib-n-2 ; upon return, val contains Fib(n - 2) 21. (assign n (reg val)) ; n now contains Fib(n - 2) 22. (restore val) ; val now contains Fib(n - 1) 23. (restore continue) 24. (assign val ; Fib(n - 1) + Fib(n - 2) 25. (op +) (reg val) (reg n)) 26. (goto (reg continue)) ; return to caller, answer is in val 27. immediate-answer 28. (assign val (reg n)) ; base case: Fib(n) = n 29. (goto (reg continue)) 30. fib-done) We begin with the value 2 in register n. n=2 on line 0, and the stack is empty: 0 () 1 cont=fib-done 6 (fib-done) 7 cont=afterfib-n-1 8 (fib-done 2) 9 n=1 3 n<2 is true 28 val=1 29 goto afterfib-n-1 12 n=2 12 (fib-done) 13 cont=fib-done 13 () 15 n=0 16 (fib-done) 17 cont=afterfib-n-2 18 (fib-done 1) 19 goto 3, test is true, goto 27 28 val=0 29 goto afterfib-n-2 21 n=0 22 val=1 22 (fib-done) 23 cont=fib-done 23 () 24 val=1 26 goto fib-done So we are left with 1 in val, which is indeed the second Fibonacci number. Factorial example would be very similar, skipping.