fork download
  1. #define Z IP
  2. #define I FP
  3. #define J LR
  4.  
  5. #define INPUT_VALUE 30
  6.  
  7. ; in C
  8. ; int factorial(int n) {
  9. ; if (n <= 1) {
  10. ; return 1;
  11. ; } else {
  12. ; return n * factorial(n-1);
  13. ; }
  14. ;}
  15.  
  16. ; in DCPU
  17. :factorial
  18. @ Store link register on stack
  19. SUB SP, 2
  20. SET [SP], LR
  21.  
  22. @ Store frame pointer on stack
  23. SUB SP, 2
  24. SET [SP], FP
  25.  
  26. @ Set frame pointer to start of frame
  27. SET FP, SP
  28.  
  29. @ Allocate n on the stack
  30. SUB SP, 2
  31. SET [SP], A
  32.  
  33. @ Load n
  34. SET C, FP
  35. SUB C, 2
  36. SET C, [C]
  37.  
  38. @ compare n and 1
  39. IFG C, 1
  40.  
  41. @ Handle the else branch
  42. SET PC, factorial_recurse
  43.  
  44. @ Handle the if branch
  45. @ Return 1
  46. SET A, 1
  47. SET PC, factorial_end
  48.  
  49. :factorial_recurse
  50. @ Call factorial with n-1
  51. SET A, FP
  52. SUB A, 2
  53. SET A, [A]
  54. SUB A, 1
  55. MOV PC, factorial
  56. @ Multiply returned value by n and return
  57. SET C, FP
  58. SUB C, 2
  59. SET C, [C]
  60. MUL A, C
  61. SET PC, factorial_end
  62.  
  63. :factorial_end
  64. @ Unwind stack and return
  65. SET SP, FP
  66. SET FP, [SP]
  67. ADD SP, 2
  68. SET LR, [SP]
  69. SET PC, LR
  70.  
  71. :main
  72. @ Push LR to stack
  73. SUB SP, 2
  74. SET [SP], LR
  75.  
  76. @ Call factorial with parameter INPUT_VALUE
  77. SET A, INPUT_VALUE
  78. SET PC, factorial
  79.  
  80. @ Return the value returned by factorial
  81. ADD SP, 2
  82. SET PC, LR
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty