1 #----------------------------------------------------------------------
2 # extern void print_int(int i);
3 # extern void pritn_string(char x[]);
4 #
5 # int x;
6 #
7 # void bar( int b )
8 # {
9 # print_string(">>> ");
10 # print_int( b );
11 # print_string("\n");
12 # }
13 #
14 # void foo( char f )
15 # {
16 # int a[3];
17 # a[0] = 90;
18 # bar( f + a[0] );
19 # }
20 #
21 # void main( void )
22 # {
23 # x = 4;
24 # foo( x + 5 * 'a' - 2 + -1 );
25 # }
26 #----------------------------------------------------------------------
27
28 .data
29 _x: .space 4
30 __s1: .asciiz "\n"
31 __s0: .asciiz ">>> "
32
33 .text
34
35 __fbar:
36
37 # enter
38 sw $fp, -4($sp)
39 sw $ra, -8($sp)
40 la $fp, 0($sp)
41 la $sp, -20($sp)
42
43 # constant
44 la $t1, __s0
45 sw $t1, -12($fp)
46
47 # push param
48 lw $t1, -12($fp)
49 sw $t1, -4($sp)
50 la $sp, -4($sp)
51
52 # call
53 jal __fprint_string
54 la $sp, 4($sp)
55
56 # push param
57 lw $t1, 0($fp)
58 sw $t1, -4($sp)
59 la $sp, -4($sp)
60
61 # call
62 jal __fprint_int
63 la $sp, 4($sp)
64
65 # constant
66 la $t1, __s1
67 sw $t1, -12($fp)
68
69 # push param
70 lw $t1, -12($fp)
71 sw $t1, -4($sp)
72 la $sp, -4($sp)
73
74 # call
75 jal __fprint_string
76 la $sp, 4($sp)
77
78 # leave
79 la $sp, 0($fp)
80 lw $ra, -8($sp)
81 lw $fp, -4($sp)
82 jr $ra
83
84
85 __ffoo:
86
87 # enter
88 sw $fp, -4($sp)
89 sw $ra, -8($sp)
90 la $fp, 0($sp)
91 la $sp, -44($sp)
92
93 # constant
94 li $t1, 0
95 sw $t1, -24($fp)
96
97 # constant
98 li $t1, 90
99 sw $t1, -28($fp)
100
101 # array element store
102 lw $t1, -28($fp)
103 lw $t2, -24($fp)
104 la $t3, -12($fp)
105 sll $t2, $t2, 2
106 sub $t3, $t3, $t2
107 sw $t1, 0($t3)
108
109 # constant
110 li $t1, 0
111 sw $t1, -32($fp)
112
113 # array element access
114 lw $t1, -32($fp)
115 la $t2, -12($fp)
116 sll $t1, $t1, 2
117 sub $t2, $t2, $t1
118 lw $t3, 0($t2)
119 sw $t3, -36($fp)
120
121 # variable
122 lb $t1, 0($fp)
123 lw $t2, -36($fp)
124 add $t3, $t1, $t2
125 sw $t3, -40($fp)
126
127 # push param
128 lw $t1, -40($fp)
129 sw $t1, -4($sp)
130 la $sp, -4($sp)
131
132 # call
133 jal __fbar
134 la $sp, 4($sp)
135
136 # leave
137 la $sp, 0($fp)
138 lw $ra, -8($sp)
139 lw $fp, -4($sp)
140 jr $ra
141
142
143 main:
144
145 # enter
146 sw $fp, -4($sp)
147 sw $ra, -8($sp)
148 la $fp, 0($sp)
149 la $sp, -56($sp)
150
151 # constant
152 li $t1, 4
153 sw $t1, -12($fp)
154
155 # assignment
156 lw $t1, -12($fp)
157 sw $t1, _x
158
159 # constant
160 li $t1, 5
161 sw $t1, -16($fp)
162
163 # constant
164 li $t1, 97
165 sb $t1, -20($fp)
166
167 # multiplication
168 lw $t1, -16($fp)
169 lb $t2, -20($fp)
170 mul $t3, $t1, $t2
171 sw $t3, -24($fp)
172
173 # addition
174 lw $t1, _x
175 lw $t2, -24($fp)
176 add $t3, $t1, $t2
177 sw $t3, -28($fp)
178
179 # constant
180 li $t1, 2
181 sw $t1, -32($fp)
182
183 # subtraction
184 lw $t1, -28($fp)
185 lw $t2, -32($fp)
186 sub $t3, $t1, $t2
187 sw $t3, -36($fp)
188
189 # unary minus
190 li $t1, -1
191 sw $t1, -40($fp)
192
193 # constant
194 li $t1, 1
195 sw $t1, -44($fp)
196
197 # unary minus
198 lw $t1, -40($fp)
199 lw $t2, -44($fp)
200 mul $t3, $t1, $t2
201 sw $t3, -48($fp)
202
203 # addition
204 lw $t1, -36($fp)
205 lw $t2, -48($fp)
206 add $t3, $t1, $t2
207 sw $t3, -52($fp)
208
209 # push param
210 lw $t1, -52($fp)
211 sb $t1, -4($sp)
212 la $sp, -4($sp)
213
214 # call
215 jal __ffoo
216 la $sp, 4($sp)
217
218 # leave
219 la $sp, 0($fp)
220 lw $ra, -8($sp)
221 lw $fp, -4($sp)
222 jr $ra
223
224
225 __fprint_int:
226
227 li $v0, 1
228 lw $a0, 0($sp)
229 syscall
230 jr $ra
231
232
233 __fprint_string:
234
235 li $v0, 4
236 lw $a0, 0($sp)
237 syscall
238 jr $ra
239