aboutsummaryrefslogtreecommitdiff
path: root/fibs.s
blob: c32f42486d37ce3cef7d880ae637155c99503017 (plain)
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

.include "include/uskel.s"

.include "include/listops.s"
.include "include/intops.s"
.include "include/io.s"
.include "include/main_exit.s"

# | lag1 | lag2 | -> cont
.thunkcode fibs
	# next value
	pushq 030(%rbp)
	pushq 020(%rbp)
	pushq $2
	pushq $plus
	mov %rsp, %r11

	# fib call with the next value
	push %r11
	pushq 030(%rbp)
	pushq $2
	pushq $fibs
	mov %rsp, %r12

	# cons list with lag1
	push %r12
	push 020(%rbp)
	pushq $1
	pushq $LIST_code
	mov %rsp, %r13

	# replace self with IND
	mov %r13, 010(%rbp)
	movq $IND_code, 0(%rbp)

	mov %rsi, %rbp
	mov %r13, %rsi
	enter_rbp

# || -> cont
.thunkcode fibs0
	pushq $1
	pushq $INT_code
	mov %rsp, %r12
	pushq $0
	pushq $INT_code
	mov %rsp, %r11
	
	push %r12
	push %r11
	pushq $2
	pushq $fibs

	enter %rsp

.thunkcode main
	pushq $0
	pushq $fibs0
	mov %rsp, %r12

	pushq $20
	pushq $INT_code
	mov %rsp, %r11

	push %r12
	push %r11
	pushq $2
	pushq $list_int_index
	mov %rsp, %r11

	push %r11
	pushq $1
	pushq $print
	mov %rsp, %r11

	push %rsi
	pushq $1
	pushq $main_exit

	mov %rsp, %rsi
	enter %r11