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