Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Name: Paras Jain
- ; Main
- ; Do not edit this function!
- .orig x3000
- LD R6, STACK ; Initialize the stack
- AND R0, R0, 0 ; r0 = 3
- ADD R0, R0, 8
- ADD R6, R6, -1 ; push n \ R0 = eval(n)
- STR R0, R6, 0 ; |
- LD R0, EVALPTR ; ld ptr |
- JSRR R0 ; run eval |
- LDR R0, R6, 0 ; pop result |
- ADD R6, R6, 2 ; move stack* /
- ST R0, ANS
- HALT
- STACK .fill xf000
- ANS .fill -1
- EVALPTR .fill EVAL
- .blkw 200
- EVAL
- ; int recurse(int n)
- ; print n
- ; n <- n - 1
- ; recurse(n)
- ; save return_value, ret*, callee_fp*
- ADD R6, R6, -3 ; allocate space for return value, return addr (r7) and old frame pointer (r5)
- STR R7, R6, 1 ; save return pointer r7
- STR R5, R6, 0 ; save old callee fp r5
- ; create local frame pointer
- ADD R6, R6, -1 ; init local vars
- ADD R5, R6, 0 ; copy stack* to fp*
- ;
- ; save old r0
- STR R0, R6, 0 ; push r0 into first local var slot
- BODY ; load n
- LDR R0, R5, 4 ; grab arg 1, n (fp* + 4)
- BRnz DONE
- TRAP x21 ; write n to console
- ADD R0, R0, -1 ; n <- n - 1
- ADD R6, R6, -1 ; push n \ R0 = eval(n)
- STR R0, R6, 0 ; |
- LD R0, EVALPTR ; ld ptr |
- JSRR R0 ; run eval |
- ; LDR R0, R6, 0 ; pop result |
- ADD R6, R6, 2 ; move stack* /
- DONE ; write return value
- ; n/a
- ; restore registers
- LDR R0, R6, 0 ; load r0
- ; free locals space
- ADD R6, R5, 0 ; st* = fp*
- ; restore caller frame pointer
- LDR R5, R6, 1 ; fp* = mem[st*], where st* = stack[callee_fr]*
- ; restore return addr
- LDR R7, R6, 2 ; ret* = mem[st*], where st* = stack[ret*]*
- ; free fp, raddr, return_value
- ADD R6, R6, 3 ; stack* += 3
- RET ; return
- ZERO .fill '0'
- .end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement