Advertisement
Guest User

Untitled

a guest
Feb 26th, 2015
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.82 KB | None | 0 0
  1. ; Name: Paras Jain
  2.  
  3.  
  4. ; Main
  5. ; Do not edit this function!
  6.  
  7. .orig x3000
  8.  
  9. LD R6, STACK ; Initialize the stack
  10.  
  11. AND R0, R0, 0 ; r0 = 3
  12. ADD R0, R0, 8
  13.  
  14. ADD R6, R6, -1 ; push n \ R0 = eval(n)
  15. STR R0, R6, 0 ; |
  16. LD R0, EVALPTR ; ld ptr |
  17. JSRR R0 ; run eval |
  18. LDR R0, R6, 0 ; pop result |
  19. ADD R6, R6, 2 ; move stack* /
  20.  
  21. ST R0, ANS
  22. HALT
  23.  
  24. STACK .fill xf000
  25. ANS .fill -1
  26. EVALPTR .fill EVAL
  27. .blkw 200
  28.  
  29. EVAL
  30.  
  31. ; int recurse(int n)
  32. ; print n
  33. ; n <- n - 1
  34. ; recurse(n)
  35.  
  36. ; save return_value, ret*, callee_fp*
  37. ADD R6, R6, -3 ; allocate space for return value, return addr (r7) and old frame pointer (r5)
  38. STR R7, R6, 1 ; save return pointer r7
  39. STR R5, R6, 0 ; save old callee fp r5
  40.  
  41. ; create local frame pointer
  42. ADD R6, R6, -1 ; init local vars
  43. ADD R5, R6, 0 ; copy stack* to fp*
  44. ;
  45.  
  46. ; save old r0
  47. STR R0, R6, 0 ; push r0 into first local var slot
  48.  
  49.  
  50. BODY ; load n
  51. LDR R0, R5, 4 ; grab arg 1, n (fp* + 4)
  52. BRnz DONE
  53. TRAP x21 ; write n to console
  54. ADD R0, R0, -1 ; n <- n - 1
  55.  
  56. ADD R6, R6, -1 ; push n \ R0 = eval(n)
  57. STR R0, R6, 0 ; |
  58. LD R0, EVALPTR ; ld ptr |
  59. JSRR R0 ; run eval |
  60. ; LDR R0, R6, 0 ; pop result |
  61. ADD R6, R6, 2 ; move stack* /
  62.  
  63.  
  64. DONE ; write return value
  65. ; n/a
  66.  
  67. ; restore registers
  68. LDR R0, R6, 0 ; load r0
  69.  
  70. ; free locals space
  71. ADD R6, R5, 0 ; st* = fp*
  72.  
  73. ; restore caller frame pointer
  74. LDR R5, R6, 1 ; fp* = mem[st*], where st* = stack[callee_fr]*
  75.  
  76. ; restore return addr
  77. LDR R7, R6, 2 ; ret* = mem[st*], where st* = stack[ret*]*
  78.  
  79. ; free fp, raddr, return_value
  80. ADD R6, R6, 3 ; stack* += 3
  81.  
  82. RET ; return
  83.  
  84.  
  85. ZERO .fill '0'
  86.  
  87. .end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement