-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathackermann.s
172 lines (132 loc) · 2.15 KB
/
ackermann.s
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
########################################################################
# .DATA
# Here are some handy strings for use in your code.
.data
prompt_m_str: .asciiz "Enter m: "
prompt_n_str: .asciiz "Enter n: "
result_str_1: .asciiz "Ackermann("
result_str_2: .asciiz ", "
result_str_3: .asciiz ") = "
########################################################################
# .TEXT <main>
.text
main:
# Args: void
# Returns: int
#
# Frame: [...]
# Uses: [...]
# Clobbers: [...]
#
# Locals:
# - ...
#
# Structure:
# - main
# -> [prologue]
# -> [body]
# -> [epilogue]
main__prologue:
begin
push $ra
push $s0
push $s1
push $s2
main__body:
la $a0, prompt_m_str
li $v0, 4
syscall
li $v0, 5
syscall
move $s0, $v0
la $a0, prompt_n_str
li $v0, 4
syscall
li $v0, 5
syscall
move $s1, $v0
move $a0, $s0
move $a1, $s1
jal ackermann
move $s2, $v0
la $a0, result_str_1
li $v0, 4
syscall
move $a0, $s0
li $v0, 1
syscall
la $a0, result_str_2
li $v0, 4
syscall
move $a0, $s1
li $v0, 1
syscall
la $a0, result_str_3
li $v0, 4
syscall
move $a0, $s2
li $v0, 1
syscall
li $a0, '\n'
li $v0, 11
syscall
main__epilogue:
pop $s2
pop $s1
pop $s0
pop $ra
end
# TODO: clean up your stack frame
li $v0, 0
jr $ra # return 0;
########################################################################
# .TEXT <ackermann>
.text
ackermann:
# Args:
# - $a0: int m
# - $a1: int n
# Returns: int
#
# Frame: []
# Uses: []
# Clobbers: []
#
# Locals:
# - .
#
# Structure:
# - ackermann
# -> [prologue]
# -> [body]
# -> [epilogue]
ackermann__prologue:
# TODO: set up your stack frame
begin
push $ra
push $a0
push $a1
ackermann__body:
beq $a0, 0, ackermann__m_equals
beq $a1, 0, ackermann__n_equals
addi $a1, $a1, -1
jal ackermann
move $a1, $v0
addi $a0, $a0, -1
jal ackermann
b ackermann__epilogue
ackermann__m_equals:
add $v0, $a1, 1
b ackermann__epilogue
ackermann__n_equals:
addi $a0, $a0, -1
li $a1, 1
jal ackermann
b ackermann__epilogue
ackermann__epilogue:
# TODO: clean up your stack frame
pop $a1
pop $a0
pop $ra
end
jr $ra