-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFibonaciOnIndex.vm
136 lines (99 loc) · 1.61 KB
/
FibonaciOnIndex.vm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
PUSH IN 1
; Init LOCAL offset
PUSH CONSTANT 0
POP REGISTER 0
; -----------------
CALL FIBONACCI
JUMP UN END
; Fibonacci
LABEL FIBONACCI
; LOCAL[0] = arg
PUSH CONSTANT 0
PUSH REGISTER 0
ADD
POP LOCAL INDEX
; --------------
; arg - 1 on stack
PUSH CONSTANT 1
PUSH CONSTANT 0
PUSH REGISTER 0
ADD
PUSH LOCAL INDEX
SUB
; --------------
; If arg == 0 or arg == 1
JUMP LEQ FIBONACCI_BASE
; arg - 1 on stack
PUSH CONSTANT 1
PUSH CONSTANT 0
PUSH REGISTER 0
ADD
PUSH LOCAL INDEX
SUB
; --------------
; Call preporation - increment offset
PUSH CONSTANT 3
PUSH REGISTER 0
ADD
POP REGISTER 0
; --------------
; Call
CALL FIBONACCI
; After call - decrement offset
PUSH CONSTANT 3
PUSH REGISTER 0
SUB
POP REGISTER 0
; --------------
; LOCAL[1] = fib(arg - 1)
PUSH CONSTANT 1
PUSH REGISTER 0
ADD
POP LOCAL INDEX
; --------------
; arg - 2 on stack
PUSH CONSTANT 2
PUSH CONSTANT 0
PUSH REGISTER 0
ADD
PUSH LOCAL INDEX
SUB
; --------------
; Call preporation - increment offset
PUSH CONSTANT 3
PUSH REGISTER 0
ADD
POP REGISTER 0
; --------------
; Call
CALL FIBONACCI
; After call - decrement offset
PUSH CONSTANT 3
PUSH REGISTER 0
SUB
POP REGISTER 0
; --------------
; --------------
PUSH CONSTANT 2
PUSH REGISTER 0
ADD
POP LOCAL INDEX
; LOCAL[2] = fib(arg - 2)
; LOCAL[1] + LOCAL[2] on stack
PUSH CONSTANT 1
PUSH REGISTER 0
ADD
PUSH LOCAL INDEX
PUSH CONSTANT 2
PUSH REGISTER 0
ADD
PUSH LOCAL INDEX
ADD
; --------------
RETURN
LABEL FIBONACCI_BASE
PUSH CONSTANT 1
RETURN
; Fibonnaci end
LABEL END
POP OUT 1