Matt Coles 8 年 前
コミット
f745c3345a

+ 0 - 3
tac/README.md

@@ -1,3 +0,0 @@
1
-# mips-c-compiler
2
-
3
-A MIPS compiler for a subset of C that includes closures, for 3rd year compilers coursework

+ 0 - 205
tac/finaltest1.tac

@@ -1,205 +0,0 @@
1
---C COMPILER
2
-int inner_fact(int n, int a) {
3
-  if (n==0) {
4
-    return a;
5
-  }
6
-  return inner_fact(n-1,a*n);
7
-}
8
-
9
-int fact(int n) {
10
-	return inner_fact(n,1);
11
-}
12
-
13
-int main(){
14
-	return fact(6);
15
-}
16
-parse finished
17
-~
18
-  ~
19
-    D
20
-      d
21
-        int
22
-        F
23
-          inner_fact
24
-          ,
25
-            ~
26
-              int
27
-              n
28
-            ~
29
-              int
30
-              a
31
-      ;
32
-        if
33
-          ==
34
-            n
35
-            0
36
-          return
37
-            a
38
-        return
39
-          apply
40
-            inner_fact
41
-            ,
42
-              -
43
-                n
44
-                1
45
-              *
46
-                a
47
-                n
48
-    D
49
-      d
50
-        int
51
-        F
52
-          fact
53
-          ~
54
-            int
55
-            n
56
-      return
57
-        apply
58
-          inner_fact
59
-          ,
60
-            n
61
-            1
62
-  D
63
-    d
64
-      int
65
-      F
66
-        main
67
-    return
68
-      apply
69
-        fact
70
-        6
71
-func inner_fact
72
-param n
73
-param a
74
-if n != 0 then L0
75
-ret a
76
-L0
77
-$t1 := n - 1
78
-$t2 := a * n
79
-arg $t1
80
-arg $t2
81
-call inner_fact, $t0
82
-ret $t0
83
-end inner_fact
84
-
85
-func fact
86
-param n
87
-arg n
88
-arg 1
89
-call inner_fact, $t3
90
-ret $t3
91
-end fact
92
-
93
-func main
94
-arg 6
95
-call fact, $t4
96
-ret $t4
97
-end main
98
-
99
-=====
100
-li $a0, 68
101
-li $v0, 9
102
-syscall
103
-or $fp, $0, $v0
104
-la $t0, main
105
-sw $t0, 0($fp)
106
-sw $0, 4($fp)
107
-jal main
108
-j done
109
-#func inner_fact
110
-inner_fact:
111
-li $a0, 68
112
-li $v0, 9
113
-syscall
114
-sw $fp, 4($v0)
115
-or $fp, $0, $v0
116
-la $t0, inner_fact
117
-sw $t0, 0($fp)
118
-sw $ra, 64($fp)
119
-#param n
120
-or $16, $0, $5
121
-#param a
122
-or $17, $0, $6
123
-#if n != 0 then L0
124
-bne $16, $0, L0
125
-#ret a
126
-or $v1, $0, $17
127
-jr $31
128
-#L0
129
-L0:
130
-#$t1 := n - 1
131
-li $9, 1
132
-sub $8, $16, $9
133
-#$t2 := a * n
134
-mult $17, $16
135
-mflo $10
136
-#arg $t1
137
-or $5, $0, $8
138
-#arg $t2
139
-or $6, $0, $10
140
-#call inner_fact, $t0
141
-jal inner_fact
142
-lw $fp, 4($fp)
143
-lw $ra, 64($fp)
144
-lw $16, 8($fp)
145
-lw $17, 12($fp)
146
-or $11, $0, $v1
147
-#ret $t0
148
-or $v1, $0, $11
149
-jr $31
150
-#end inner_fact
151
-
152
-#func fact
153
-fact:
154
-li $a0, 68
155
-li $v0, 9
156
-syscall
157
-sw $fp, 4($v0)
158
-or $fp, $0, $v0
159
-la $t0, fact
160
-sw $t0, 0($fp)
161
-sw $ra, 64($fp)
162
-#param n
163
-or $16, $0, $5
164
-#arg n
165
-or $5, $0, $16
166
-#arg 1
167
-li $12, 1
168
-or $6, $0, $12
169
-#call inner_fact, $t3
170
-jal inner_fact
171
-lw $fp, 4($fp)
172
-lw $ra, 64($fp)
173
-lw $16, 8($fp)
174
-or $13, $0, $v1
175
-#ret $t3
176
-or $v1, $0, $13
177
-jr $31
178
-#end fact
179
-
180
-#func main
181
-main:
182
-li $a0, 68
183
-li $v0, 9
184
-syscall
185
-sw $fp, 4($v0)
186
-or $fp, $0, $v0
187
-la $t0, main
188
-sw $t0, 0($fp)
189
-sw $ra, 64($fp)
190
-#arg 6
191
-li $14, 6
192
-or $5, $0, $14
193
-#call fact, $t4
194
-jal fact
195
-lw $fp, 4($fp)
196
-lw $ra, 64($fp)
197
-or $15, $0, $v1
198
-#ret $t4
199
-or $v1, $0, $15
200
-jr $31
201
-#end main
202
-
203
-done:
204
-ori $v0, $0, 10
205
-syscall

+ 105 - 19
tac/main.c

@@ -123,7 +123,8 @@ char* stok(TOKEN* tok) {
123 123
 
124 124
 void print_tac_el(TAC_T* elem) {
125 125
     int op = elem->op;
126
-    if (op == '=') printf("%s := %s\n", stok(elem->dst), stok(elem->src));
126
+    if (op == '=' && elem->tgt == NULL) printf("%s := %s\n", stok(elem->dst), stok(elem->src));
127
+    if (op == '=' && elem->tgt != NULL) printf("%s: %s := %s\n", stok(elem->tgt), stok(elem->dst), stok(elem->src));
127 128
     if (op=='+' || op=='-' || op=='*' || op=='/' || op =='%') printf("%s := %s %c %s\n", stok(elem->dst), stok(elem->src), op, stok(elem->tgt));
128 129
     if (op == RETURN) printf("ret %s\n", stok(elem->src));
129 130
     if (op == 'D') printf("func %s\n", stok(elem->dst));
@@ -230,6 +231,18 @@ TOKEN* build_tac(NODE *tree, TACS* tac, TACS* after_tac) {
230 231
   int type = tree->type;
231 232
   if (type == LEAF) {
232 233
     return (TOKEN *) tree->left;
234
+  } else if (type == '~') {
235
+    if (tree->right->type == '=') {
236
+      NODE *vtree = tree->right;
237
+      TOKEN* dst = (TOKEN*) vtree->left->left;
238
+      TOKEN* result = build_tac(vtree->right, tac, after_tac);
239
+      TOKEN* def = lookup_token("def");
240
+      new_tac(tac, dst, result, def, vtree->type);
241
+    } else {
242
+      build_tac(tree->left, tac, after_tac);
243
+      build_tac(tree->right, tac, after_tac);
244
+      return NULL;
245
+    }
233 246
   } else if (type == '=') {
234 247
     TOKEN* dst = (TOKEN*) tree->left->left;
235 248
     TOKEN* result = build_tac(tree->right, tac, after_tac);
@@ -321,11 +334,22 @@ int register_me(TOKEN* name, ENV* env) {
321 334
     if (binding == NULL) {
322 335
       BIND* new_bind;
323 336
       if (name->lexeme[0] != '$') {
324
-        new_bind = create_binding(name, env->counter++, NULL);
325
-        if (env->bindings == NULL) env->bindings = create_list(new_bind, NULL);
326
-        else append_list(env->bindings, new_bind);
327
-        new_bind->is_saved = 1;
328
-        return svd_regs[new_bind->env_offset];
337
+        int levels = 0;
338
+        ENV* env_ptr = env->parent;
339
+        printf("or $k0, $fp, $0\n");
340
+        while (env_ptr != NULL) {
341
+          printf("lw $fp, 68($fp)\n");
342
+          levels++;
343
+          BIND *binding = find_name_in_list(name, env_ptr->bindings);
344
+          if (binding != NULL) {
345
+            printf("lw $%d, %d($fp)\n", tmp_regs[tmp_cntr], binding->env_offset);
346
+            printf("or $fp, $k0, $0\n");
347
+            return tmp_regs[tmp_cntr++];
348
+          }
349
+          env_ptr = env_ptr->parent;
350
+        }
351
+        printf("%s not defined in scope\n", name->lexeme);
352
+        exit(1);
329 353
       } else {
330 354
         new_bind = create_binding(name, tmp_cntr++, NULL);
331 355
         if (env->bindings == NULL) env->bindings = create_list(new_bind, NULL);
@@ -338,15 +362,55 @@ int register_me(TOKEN* name, ENV* env) {
338 362
   }
339 363
 }
340 364
 
365
+int def_register_me(TOKEN* name, ENV* env) {
366
+  BIND* binding = find_name_in_list(name, env->bindings);
367
+  if (binding == NULL) {
368
+    BIND* new_bind;
369
+    new_bind = create_binding(name, env->counter++, NULL);
370
+    if (env->bindings == NULL) env->bindings = create_list(new_bind, NULL);
371
+    else append_list(env->bindings, new_bind);
372
+    new_bind->is_saved = 1;
373
+    return svd_regs[new_bind->env_offset];
374
+  } else {
375
+    printf("Error, %s redefined in scope.\n", name->lexeme);
376
+    exit(1);
377
+  }
378
+}
379
+
380
+void add_closure(TOKEN* name, ENV* env) {
381
+  BIND* binding = find_name_in_list(name, env->bindings);
382
+  if (binding == NULL) {
383
+    BIND* new_bind;
384
+    new_bind =create_binding(name, 0, env);
385
+    if (env->bindings == NULL) env->bindings = create_list(new_bind, NULL);
386
+    else append_list(env->bindings, new_bind);
387
+  } else {
388
+    printf("Error, %s redefined in scope.\n", name->lexeme);
389
+    exit(1);
390
+  }
391
+}
392
+
393
+ENV* find_closure_env(TOKEN* name, ENV* env) {
394
+  BIND* binding = find_name_in_list(name, env->bindings);
395
+  if (binding == NULL) {
396
+    return NULL;
397
+  } else {
398
+    return binding->env;
399
+  }
400
+}
401
+
341 402
 void alloc_function_env() {
342
-  printf("li $a0, 68\n");
403
+  printf("li $a0, 72\n");
343 404
   printf("li $v0, 9\n");
344 405
   printf("syscall\n");
345 406
 }
346 407
 
347 408
 void compile_tac(TLIST* tacs) {
348 409
   ENV* env = create_new_function_env(NULL, NULL);
410
+  ENV* closure_tab = create_new_function_env(NULL, NULL);
349 411
   printf("=====\n");
412
+  printf(".globl __start\n");
413
+  printf("__start:\n");
350 414
   alloc_function_env();
351 415
   printf("or $fp, $0, $v0\n");
352 416
   printf("la $t0, main\n");
@@ -361,24 +425,31 @@ void compile_tac(TLIST* tacs) {
361 425
       print_tac_el(t);
362 426
     }
363 427
     if (t->op == '=') {
428
+      int dst;
429
+      if (t->tgt == NULL) {
430
+        dst = register_me(t->dst, env);
431
+      } else {
432
+        dst = def_register_me(t->dst, env);
433
+      }
364 434
       int src = register_me(t->src, env);
365
-      int dst = register_me(t->dst, env);
366 435
       printf("or $%d, $0, $%d\n", dst, src);
367 436
     }
368 437
     if (t->op == 'D') {
369
-      env = create_new_function_env(NULL, env);
438
+      ENV* closure_env;
439
+      int i = 2;
440
+      int j;
441
+      if ((closure_env = find_closure_env(t->dst, closure_tab)) == NULL) {
442
+        env = create_new_function_env(env, env);
443
+      } else {
444
+        env = create_new_function_env(closure_env, env);
445
+      }
370 446
       printf("%s:\n", t->dst->lexeme);
371 447
       alloc_function_env();
372 448
       printf("sw $fp, 4($v0)\n");
373
-      if (env->previous->bindings != NULL) {
374
-        int i = 2;
375
-        BLIST* ptr = env->previous->bindings;
376
-        while (ptr != NULL) {
377
-          if (ptr->binding->name->lexeme[0] != '$') {
378
-            printf("sw $%d, %d($fp)\n", svd_regs[ptr->binding->env_offset], i*4);
379
-            i++;
380
-          }
381
-          ptr = ptr->next;
449
+      if (t->dst != lookup_token("main")) {
450
+        for (j = 0; j < 8; j++) {
451
+          printf("sw $%d, %d($fp)\n", svd_regs[j], i*4);
452
+          i++;
382 453
         }
383 454
       }
384 455
       printf("or $fp, $0, $v0\n");
@@ -487,14 +558,29 @@ void compile_tac(TLIST* tacs) {
487 558
       printf("or $%d, $0, $%d\n", arg_regs[env->arg_counter], dst_idx);
488 559
       env->arg_counter++;
489 560
     }
561
+    if (t->op == 280) {
562
+      int dst_idx = def_register_me(t->dst, env);
563
+      add_closure(t->dst, closure_tab);
564
+      alloc_function_env();
565
+      printf("or $%d, $v0, $0\n", dst_idx);
566
+      printf("la $v0, %s\n", t->dst->lexeme);
567
+      printf("sw $v0, 0($%d)\n", dst_idx);
568
+      printf("sw $fp, 68($%d)\n", dst_idx);
569
+    }
490 570
     if (t->op == AUTO) {
491
-      int dst_idx = register_me(t->dst, env);
571
+      int dst_idx = def_register_me(t->dst, env);
492 572
       printf("or $%d, $0, $%d\n", dst_idx, arg_regs[env->param_counter]);
493 573
       env->param_counter++;
494 574
     }
495 575
     tacs = tacs->next;
496 576
   }
497 577
   printf("done:\n");
578
+  printf("or $a0, $v1, $0\n");
579
+  printf("ori $v0, $0, 1\n");
580
+  printf("syscall\n");
581
+  printf("ori $a0, $0, 0xA\n");
582
+  printf("ori $v0, $0, 0xB\n");
583
+  printf("syscall\n");
498 584
   printf("ori $v0, $0, 10\n");
499 585
   printf("syscall\n");
500 586
 }

+ 0 - 54
tac/mips.asm

@@ -1,54 +0,0 @@
1
-li $a0, 68
2
-li $v0, 9
3
-syscall
4
-or $fp, $0, $v0
5
-la $t0, main
6
-sw $t0, 0($fp)
7
-sw $0, 4($fp)
8
-la $ra, done
9
-j main
10
-blah:
11
-sw $ra, 64($fp)
12
-or $16, $0, $5
13
-li $8, 3
14
-or $17, $0, $8
15
-add $9, $17, $16
16
-or $v1, $0, $9
17
-jr $31
18
-main:
19
-sw $ra, 64($fp)
20
-li $10, 4
21
-or $16, $0, $10
22
-li $11, 4
23
-or $5, $0, $11
24
-li $a0, 68
25
-li $v0, 9
26
-syscall
27
-sw $fp, 4($v0)
28
-sw $16, 8($fp)
29
-or $fp, $0, $v0
30
-la $t0, blah
31
-sw $t0, 0($fp)
32
-jal blah
33
-lw $fp, 4($fp)
34
-lw $ra, 64($fp)
35
-lw $16, 8($fp)
36
-or $12, $0, $v1
37
-or $17, $0, $12
38
-li $13, 5
39
-ble $17, $13, L0
40
-li $15, 10
41
-add $14, $16, $15
42
-or $16, $0, $14
43
-j L1
44
-L0:
45
-li $25, 5
46
-add $24, $16, $25
47
-or $16, $0, $24
48
-L1:
49
-add $8, $17, $16
50
-or $v1, $0, $8
51
-jr $31
52
-done:
53
-ori $v0, $0, 10
54
-syscall

+ 0 - 155
tac/recurse.asm

@@ -1,155 +0,0 @@
1
-li $a0, 68
2
-li $v0, 9
3
-syscall
4
-or $fp, $0, $v0
5
-la $t0, main
6
-sw $t0, 0($fp)
7
-sw $0, 4($fp)
8
-la $ra, done
9
-j main
10
-#func inner_fact
11
-inner_fact:
12
-sw $ra, 64($fp)
13
-#param n
14
-or $16, $0, $5
15
-#param a
16
-or $17, $0, $6
17
-#if n != 0 then L0
18
-bne $16, $0, L0
19
-#ret a
20
-or $v1, $0, $17
21
-jr $31
22
-#L0
23
-L0:
24
-#$t1 := n - 1
25
-li $9, 1
26
-sub $8, $16, $9
27
-#$t2 := a * n
28
-mult $17, $16
29
-mflo $10
30
-#arg $t1
31
-or $5, $0, $8
32
-#arg $t2
33
-or $6, $0, $10
34
-#call inner_fact, $t0
35
-li $a0, 68
36
-li $v0, 9
37
-syscall
38
-sw $fp, 4($v0)
39
-sw $16, 8($fp)
40
-sw $17, 12($fp)
41
-or $fp, $0, $v0
42
-la $t0, inner_fact
43
-sw $t0, 0($fp)
44
-jal inner_fact
45
-lw $fp, 4($fp)
46
-lw $ra, 64($fp)
47
-lw $16, 8($fp)
48
-lw $17, 12($fp)
49
-or $11, $0, $v1
50
-#ret $t0
51
-or $v1, $0, $11
52
-jr $31
53
-#end inner_fact
54
-
55
-#func fact
56
-fact:
57
-sw $ra, 64($fp)
58
-#param n
59
-or $16, $0, $5
60
-#arg n
61
-or $5, $0, $16
62
-#arg 1
63
-li $12, 1
64
-or $6, $0, $12
65
-#call inner_fact, $t3
66
-li $a0, 68
67
-li $v0, 9
68
-syscall
69
-sw $fp, 4($v0)
70
-sw $16, 8($fp)
71
-or $fp, $0, $v0
72
-la $t0, inner_fact
73
-sw $t0, 0($fp)
74
-jal inner_fact
75
-lw $fp, 4($fp)
76
-lw $ra, 64($fp)
77
-lw $16, 8($fp)
78
-or $13, $0, $v1
79
-#ret $t3
80
-or $v1, $0, $13
81
-jr $31
82
-#end fact
83
-
84
-#func main
85
-main:
86
-sw $ra, 64($fp)
87
-#arg 3
88
-li $14, 3
89
-or $5, $0, $14
90
-#call fact, $t4
91
-li $a0, 68
92
-li $v0, 9
93
-syscall
94
-sw $fp, 4($v0)
95
-or $fp, $0, $v0
96
-la $t0, fact
97
-sw $t0, 0($fp)
98
-jal fact
99
-lw $fp, 4($fp)
100
-lw $ra, 64($fp)
101
-or $15, $0, $v1
102
-#x := $t4
103
-or $16, $0, $15
104
-#arg 5
105
-li $24, 5
106
-or $5, $0, $24
107
-#call fact, $t5
108
-li $a0, 68
109
-li $v0, 9
110
-syscall
111
-sw $fp, 4($v0)
112
-sw $16, 8($fp)
113
-or $fp, $0, $v0
114
-la $t0, fact
115
-sw $t0, 0($fp)
116
-jal fact
117
-lw $fp, 4($fp)
118
-lw $ra, 64($fp)
119
-lw $16, 8($fp)
120
-or $25, $0, $v1
121
-#y := $t5
122
-or $17, $0, $25
123
-#arg 7
124
-li $8, 7
125
-or $5, $0, $8
126
-#call fact, $t6
127
-li $a0, 68
128
-li $v0, 9
129
-syscall
130
-sw $fp, 4($v0)
131
-sw $16, 8($fp)
132
-sw $17, 12($fp)
133
-or $fp, $0, $v0
134
-la $t0, fact
135
-sw $t0, 0($fp)
136
-jal fact
137
-lw $fp, 4($fp)
138
-lw $ra, 64($fp)
139
-lw $16, 8($fp)
140
-lw $17, 12($fp)
141
-or $9, $0, $v1
142
-#z := $t6
143
-or $18, $0, $9
144
-#$t8 := x + y
145
-add $10, $16, $17
146
-#$t7 := $t8 + z
147
-add $11, $10, $18
148
-#ret $t7
149
-or $v1, $0, $11
150
-jr $31
151
-#end main
152
-
153
-done:
154
-ori $v0, $0, 10
155
-syscall

+ 51 - 47
tac/test.asm

@@ -1,3 +1,5 @@
1
+.globl __start
2
+__start:
1 3
 li $a0, 68
2 4
 li $v0, 9
3 5
 syscall
@@ -5,71 +7,84 @@ or $fp, $0, $v0
5 7
 la $t0, main
6 8
 sw $t0, 0($fp)
7 9
 sw $0, 4($fp)
8
-la $ra, done
9
-j main
10
-inner_fact:
11
-sw $ra, 64($fp)
12
-or $16, $0, $5
13
-or $17, $0, $6
14
-bne $16, $0, L0
15
-or $v1, $0, $17
16
-jr $31
17
-L0:
18
-li $9, 1
19
-sub $8, $16, $9
20
-mult $17, $16
21
-mflo $10
22
-or $5, $0, $8
23
-or $6, $0, $10
10
+jal main
11
+j done
12
+fact:
24 13
 li $a0, 68
25 14
 li $v0, 9
26 15
 syscall
27 16
 sw $fp, 4($v0)
28 17
 sw $16, 8($fp)
29 18
 sw $17, 12($fp)
19
+sw $18, 16($fp)
20
+sw $19, 20($fp)
21
+sw $20, 24($fp)
22
+sw $21, 28($fp)
23
+sw $22, 32($fp)
24
+sw $23, 36($fp)
30 25
 or $fp, $0, $v0
31
-la $t0, inner_fact
26
+la $t0, fact
32 27
 sw $t0, 0($fp)
28
+sw $ra, 64($fp)
29
+or $16, $0, $5
30
+or $5, $0, $16
31
+li $8, 1
32
+or $6, $0, $8
33 33
 jal inner_fact
34 34
 lw $fp, 4($fp)
35 35
 lw $ra, 64($fp)
36 36
 lw $16, 8($fp)
37
-lw $17, 12($fp)
38
-or $11, $0, $v1
39
-or $v1, $0, $11
37
+or $9, $0, $v1
38
+or $v1, $0, $9
40 39
 jr $31
41
-fact:
42
-sw $ra, 64($fp)
43
-or $16, $0, $5
44
-or $5, $0, $16
45
-li $12, 1
46
-or $6, $0, $12
40
+inner_fact:
47 41
 li $a0, 68
48 42
 li $v0, 9
49 43
 syscall
50 44
 sw $fp, 4($v0)
51 45
 sw $16, 8($fp)
46
+sw $17, 12($fp)
47
+sw $18, 16($fp)
48
+sw $19, 20($fp)
49
+sw $20, 24($fp)
50
+sw $21, 28($fp)
51
+sw $22, 32($fp)
52
+sw $23, 36($fp)
52 53
 or $fp, $0, $v0
53 54
 la $t0, inner_fact
54 55
 sw $t0, 0($fp)
56
+sw $ra, 64($fp)
57
+or $16, $0, $5
58
+or $17, $0, $6
59
+bne $16, $0, L0
60
+or $v1, $0, $17
61
+jr $31
62
+L0:
63
+li $11, 1
64
+sub $10, $16, $11
65
+mult $17, $16
66
+mflo $12
67
+or $5, $0, $10
68
+or $6, $0, $12
55 69
 jal inner_fact
56 70
 lw $fp, 4($fp)
57 71
 lw $ra, 64($fp)
58 72
 lw $16, 8($fp)
73
+lw $17, 12($fp)
59 74
 or $13, $0, $v1
60 75
 or $v1, $0, $13
61 76
 jr $31
62 77
 main:
63
-sw $ra, 64($fp)
64
-li $14, 3
65
-or $5, $0, $14
66 78
 li $a0, 68
67 79
 li $v0, 9
68 80
 syscall
69 81
 sw $fp, 4($v0)
70 82
 or $fp, $0, $v0
71
-la $t0, fact
83
+la $t0, main
72 84
 sw $t0, 0($fp)
85
+sw $ra, 64($fp)
86
+li $14, 3
87
+or $5, $0, $14
73 88
 jal fact
74 89
 lw $fp, 4($fp)
75 90
 lw $ra, 64($fp)
@@ -77,14 +92,6 @@ or $15, $0, $v1
77 92
 or $16, $0, $15
78 93
 li $24, 5
79 94
 or $5, $0, $24
80
-li $a0, 68
81
-li $v0, 9
82
-syscall
83
-sw $fp, 4($v0)
84
-sw $16, 8($fp)
85
-or $fp, $0, $v0
86
-la $t0, fact
87
-sw $t0, 0($fp)
88 95
 jal fact
89 96
 lw $fp, 4($fp)
90 97
 lw $ra, 64($fp)
@@ -93,15 +100,6 @@ or $25, $0, $v1
93 100
 or $17, $0, $25
94 101
 li $8, 7
95 102
 or $5, $0, $8
96
-li $a0, 68
97
-li $v0, 9
98
-syscall
99
-sw $fp, 4($v0)
100
-sw $16, 8($fp)
101
-sw $17, 12($fp)
102
-or $fp, $0, $v0
103
-la $t0, fact
104
-sw $t0, 0($fp)
105 103
 jal fact
106 104
 lw $fp, 4($fp)
107 105
 lw $ra, 64($fp)
@@ -114,5 +112,11 @@ add $11, $10, $18
114 112
 or $v1, $0, $11
115 113
 jr $31
116 114
 done:
115
+or $a0, $v1, $0
116
+ori $v0, $0, 1
117
+syscall
118
+ori $a0, $0, 0xA
119
+ori $v0, $0, 0xB
120
+syscall
117 121
 ori $v0, $0, 10
118 122
 syscall

+ 4 - 7
tac/recursion.c

@@ -1,12 +1,9 @@
1 1
 /* ##answer: 5166*/
2
-
3
-
4
-int inner_fact(int n, int a) {
5
-  if (n == 0) return a;
6
-  return inner_fact(n-1, a*n);
7
-}
8
-
9 2
 int fact(int n) {
3
+  int inner_fact(int n, int a) {
4
+    if (n == 0) return a;
5
+    return inner_fact(n-1, a*n);
6
+  }
10 7
   return inner_fact(n, 1);
11 8
 }
12 9
 

+ 6 - 7
tac/simple.c

@@ -1,10 +1,9 @@
1
-int blah() {
2
-  int blah2() {
3
-    return 2;
1
+int main() {
2
+  int x = 1;
3
+  int blah(int b) {
4
+    return x + b;
4 5
   }
5
-  return blah2();
6
-}
6
+  x = 2;
7 7
 
8
-int main() {
9
-  return blah();
8
+  return blah(2);
10 9
 }

+ 0 - 156
tac/test10.tac

@@ -1,156 +0,0 @@
1
---C COMPILER
2
-int main() { 
3
-int x = 4;
4
-int y = 5;
5
-int z = 6;
6
-int a = x + y;
7
-int b = y + z;
8
-int c = z * a;
9
-int d = b * c;
10
-int e = x;
11
-
12
-return e * d;
13
-}
14
-parse finished
15
-D
16
-  d
17
-    int
18
-    F
19
-      main
20
-  ;
21
-    ;
22
-      ;
23
-        ;
24
-          ;
25
-            ;
26
-              ;
27
-                ;
28
-                  ~
29
-                    int
30
-                    =
31
-                      x
32
-                      4
33
-                  ~
34
-                    int
35
-                    =
36
-                      y
37
-                      5
38
-                ~
39
-                  int
40
-                  =
41
-                    z
42
-                    6
43
-              ~
44
-                int
45
-                =
46
-                  a
47
-                  +
48
-                    x
49
-                    y
50
-            ~
51
-              int
52
-              =
53
-                b
54
-                +
55
-                  y
56
-                  z
57
-          ~
58
-            int
59
-            =
60
-              c
61
-              *
62
-                z
63
-                a
64
-        ~
65
-          int
66
-          =
67
-            d
68
-            *
69
-              b
70
-              c
71
-      ~
72
-        int
73
-        =
74
-          e
75
-          x
76
-    return
77
-      *
78
-        e
79
-        d
80
-func main
81
-x := 4
82
-y := 5
83
-z := 6
84
-$t0 := x + y
85
-a := $t0
86
-$t1 := y + z
87
-b := $t1
88
-$t2 := z * a
89
-c := $t2
90
-$t3 := b * c
91
-d := $t3
92
-e := x
93
-$t4 := e * d
94
-ret $t4
95
-end main
96
-
97
-=====
98
-li $a0, 68
99
-li $v0, 9
100
-syscall
101
-or $fp, $0, $v0
102
-la $t0, main
103
-sw $t0, 0($fp)
104
-sw $0, 4($fp)
105
-jal main
106
-j done
107
-#func main
108
-main:
109
-li $a0, 68
110
-li $v0, 9
111
-syscall
112
-sw $fp, 4($v0)
113
-or $fp, $0, $v0
114
-la $t0, main
115
-sw $t0, 0($fp)
116
-sw $ra, 64($fp)
117
-#x := 4
118
-li $8, 4
119
-or $16, $0, $8
120
-#y := 5
121
-li $9, 5
122
-or $17, $0, $9
123
-#z := 6
124
-li $10, 6
125
-or $18, $0, $10
126
-#$t0 := x + y
127
-add $11, $16, $17
128
-#a := $t0
129
-or $19, $0, $11
130
-#$t1 := y + z
131
-add $12, $17, $18
132
-#b := $t1
133
-or $20, $0, $12
134
-#$t2 := z * a
135
-mult $18, $19
136
-mflo $13
137
-#c := $t2
138
-or $21, $0, $13
139
-#$t3 := b * c
140
-mult $20, $21
141
-mflo $14
142
-#d := $t3
143
-or $22, $0, $14
144
-#e := x
145
-or $23, $0, $16
146
-#$t4 := e * d
147
-mult $23, $22
148
-mflo $15
149
-#ret $t4
150
-or $v1, $0, $15
151
-jr $31
152
-#end main
153
-
154
-done:
155
-ori $v0, $0, 10
156
-syscall

+ 0 - 133
tac/test15.tac

@@ -1,133 +0,0 @@
1
---C COMPILER
2
-int y = 5;
3
-
4
-int fun1(){
5
-	int x = 11;
6
-	return x;
7
-}
8
-
9
-
10
-int main() { 
11
-	int x = 4;
12
-	return y * x * fun1();
13
-}
14
-parse finished
15
-~
16
-  ~
17
-    ~
18
-      int
19
-      =
20
-        y
21
-        5
22
-    D
23
-      d
24
-        int
25
-        F
26
-          fun1
27
-      ;
28
-        ~
29
-          int
30
-          =
31
-            x
32
-            11
33
-        return
34
-          x
35
-  D
36
-    d
37
-      int
38
-      F
39
-        main
40
-    ;
41
-      ~
42
-        int
43
-        =
44
-          x
45
-          4
46
-      return
47
-        *
48
-          *
49
-            y
50
-            x
51
-          apply
52
-            fun1
53
-y := 5
54
-func fun1
55
-x := 11
56
-ret x
57
-end fun1
58
-
59
-func main
60
-x := 4
61
-$t1 := y * x
62
-call fun1, $t2
63
-$t0 := $t1 * $t2
64
-ret $t0
65
-end main
66
-
67
-=====
68
-li $a0, 68
69
-li $v0, 9
70
-syscall
71
-or $fp, $0, $v0
72
-la $t0, main
73
-sw $t0, 0($fp)
74
-sw $0, 4($fp)
75
-jal main
76
-j done
77
-#y := 5
78
-li $8, 5
79
-or $16, $0, $8
80
-#func fun1
81
-fun1:
82
-li $a0, 68
83
-li $v0, 9
84
-syscall
85
-sw $fp, 4($v0)
86
-sw $16, 8($fp)
87
-or $fp, $0, $v0
88
-la $t0, fun1
89
-sw $t0, 0($fp)
90
-sw $ra, 64($fp)
91
-#x := 11
92
-li $9, 11
93
-or $16, $0, $9
94
-#ret x
95
-or $v1, $0, $16
96
-jr $31
97
-#end fun1
98
-
99
-#func main
100
-main:
101
-li $a0, 68
102
-li $v0, 9
103
-syscall
104
-sw $fp, 4($v0)
105
-sw $16, 8($fp)
106
-or $fp, $0, $v0
107
-la $t0, main
108
-sw $t0, 0($fp)
109
-sw $ra, 64($fp)
110
-#x := 4
111
-li $10, 4
112
-or $16, $0, $10
113
-#$t1 := y * x
114
-mult $17, $16
115
-mflo $11
116
-#call fun1, $t2
117
-jal fun1
118
-lw $fp, 4($fp)
119
-lw $ra, 64($fp)
120
-lw $16, 8($fp)
121
-lw $17, 12($fp)
122
-or $12, $0, $v1
123
-#$t0 := $t1 * $t2
124
-mult $11, $12
125
-mflo $13
126
-#ret $t0
127
-or $v1, $0, $13
128
-jr $31
129
-#end main
130
-
131
-done:
132
-ori $v0, $0, 10
133
-syscall

+ 0 - 321
tac/test26.tac

@@ -1,321 +0,0 @@
1
---C COMPILER
2
-int biggerIsOdd(int x, int y){
3
-	if(x>y){
4
-		return isOdd(x);
5
-	} else {
6
-		return isOdd(y);
7
-	}
8
-}
9
-
10
-int isOdd(int x){
11
-	if(x == 1){
12
-		return 1;
13
-	} else {
14
-		if(isOdd(x-1) == 1){
15
-			return 0;
16
-		} else {
17
-			return 1;
18
-		}
19
-	}
20
-}
21
-
22
-
23
-int main() { 
24
-	int x = 5;
25
-	int y = 7;
26
-
27
-	if(biggerIsOdd(x,y) == 1){
28
-		return 400;
29
-	}
30
-
31
-		return 66;
32
-	
33
-}
34
-parse finished
35
-~
36
-  ~
37
-    D
38
-      d
39
-        int
40
-        F
41
-          biggerIsOdd
42
-          ,
43
-            ~
44
-              int
45
-              x
46
-            ~
47
-              int
48
-              y
49
-      if
50
-        >
51
-          x
52
-          y
53
-        else
54
-          return
55
-            apply
56
-              isOdd
57
-              x
58
-          return
59
-            apply
60
-              isOdd
61
-              y
62
-    D
63
-      d
64
-        int
65
-        F
66
-          isOdd
67
-          ~
68
-            int
69
-            x
70
-      if
71
-        ==
72
-          x
73
-          1
74
-        else
75
-          return
76
-            1
77
-          if
78
-            ==
79
-              apply
80
-                isOdd
81
-                -
82
-                  x
83
-                  1
84
-              1
85
-            else
86
-              return
87
-                0
88
-              return
89
-                1
90
-  D
91
-    d
92
-      int
93
-      F
94
-        main
95
-    ;
96
-      ;
97
-        ~
98
-          int
99
-          =
100
-            x
101
-            5
102
-        ~
103
-          int
104
-          =
105
-            y
106
-            7
107
-      ;
108
-        if
109
-          ==
110
-            apply
111
-              biggerIsOdd
112
-              ,
113
-                x
114
-                y
115
-            1
116
-          return
117
-            400
118
-        return
119
-          66
120
-func biggerIsOdd
121
-param x
122
-param y
123
-if x <= y then L0
124
-arg x
125
-call isOdd, $t0
126
-ret $t0
127
-goto L1
128
-L0
129
-arg y
130
-call isOdd, $t1
131
-ret $t1
132
-L1
133
-end biggerIsOdd
134
-
135
-func isOdd
136
-param x
137
-if x != 1 then L2
138
-ret 1
139
-goto L3
140
-L2
141
-$t3 := x - 1
142
-arg $t3
143
-call isOdd, $t2
144
-if $t2 != 1 then L4
145
-ret 0
146
-goto L5
147
-L4
148
-ret 1
149
-L5
150
-L3
151
-end isOdd
152
-
153
-func main
154
-x := 5
155
-y := 7
156
-arg x
157
-arg y
158
-call biggerIsOdd, $t4
159
-if $t4 != 1 then L6
160
-ret 400
161
-L6
162
-ret 66
163
-end main
164
-
165
-=====
166
-li $a0, 68
167
-li $v0, 9
168
-syscall
169
-or $fp, $0, $v0
170
-la $t0, main
171
-sw $t0, 0($fp)
172
-sw $0, 4($fp)
173
-jal main
174
-j done
175
-#func biggerIsOdd
176
-biggerIsOdd:
177
-li $a0, 68
178
-li $v0, 9
179
-syscall
180
-sw $fp, 4($v0)
181
-or $fp, $0, $v0
182
-la $t0, biggerIsOdd
183
-sw $t0, 0($fp)
184
-sw $ra, 64($fp)
185
-#param x
186
-or $16, $0, $5
187
-#param y
188
-or $17, $0, $6
189
-#if x <= y then L0
190
-ble $16, $17, L0
191
-#arg x
192
-or $5, $0, $16
193
-#call isOdd, $t0
194
-jal isOdd
195
-lw $fp, 4($fp)
196
-lw $ra, 64($fp)
197
-lw $16, 8($fp)
198
-lw $17, 12($fp)
199
-or $8, $0, $v1
200
-#ret $t0
201
-or $v1, $0, $8
202
-jr $31
203
-#goto L1
204
-j L1
205
-#L0
206
-L0:
207
-#arg y
208
-or $5, $0, $17
209
-#call isOdd, $t1
210
-jal isOdd
211
-lw $fp, 4($fp)
212
-lw $ra, 64($fp)
213
-lw $16, 8($fp)
214
-lw $17, 12($fp)
215
-or $9, $0, $v1
216
-#ret $t1
217
-or $v1, $0, $9
218
-jr $31
219
-#L1
220
-L1:
221
-#end biggerIsOdd
222
-
223
-#func isOdd
224
-isOdd:
225
-li $a0, 68
226
-li $v0, 9
227
-syscall
228
-sw $fp, 4($v0)
229
-or $fp, $0, $v0
230
-la $t0, isOdd
231
-sw $t0, 0($fp)
232
-sw $ra, 64($fp)
233
-#param x
234
-or $16, $0, $5
235
-#if x != 1 then L2
236
-li $10, 1
237
-bne $16, $10, L2
238
-#ret 1
239
-li $11, 1
240
-or $v1, $0, $11
241
-jr $31
242
-#goto L3
243
-j L3
244
-#L2
245
-L2:
246
-#$t3 := x - 1
247
-li $13, 1
248
-sub $12, $16, $13
249
-#arg $t3
250
-or $5, $0, $12
251
-#call isOdd, $t2
252
-jal isOdd
253
-lw $fp, 4($fp)
254
-lw $ra, 64($fp)
255
-lw $16, 8($fp)
256
-or $14, $0, $v1
257
-#if $t2 != 1 then L4
258
-li $15, 1
259
-bne $14, $15, L4
260
-#ret 0
261
-or $v1, $0, $0
262
-jr $31
263
-#goto L5
264
-j L5
265
-#L4
266
-L4:
267
-#ret 1
268
-li $24, 1
269
-or $v1, $0, $24
270
-jr $31
271
-#L5
272
-L5:
273
-#L3
274
-L3:
275
-#end isOdd
276
-
277
-#func main
278
-main:
279
-li $a0, 68
280
-li $v0, 9
281
-syscall
282
-sw $fp, 4($v0)
283
-or $fp, $0, $v0
284
-la $t0, main
285
-sw $t0, 0($fp)
286
-sw $ra, 64($fp)
287
-#x := 5
288
-li $25, 5
289
-or $16, $0, $25
290
-#y := 7
291
-li $8, 7
292
-or $17, $0, $8
293
-#arg x
294
-or $5, $0, $16
295
-#arg y
296
-or $6, $0, $17
297
-#call biggerIsOdd, $t4
298
-jal biggerIsOdd
299
-lw $fp, 4($fp)
300
-lw $ra, 64($fp)
301
-lw $16, 8($fp)
302
-lw $17, 12($fp)
303
-or $9, $0, $v1
304
-#if $t4 != 1 then L6
305
-li $10, 1
306
-bne $9, $10, L6
307
-#ret 400
308
-li $11, 400
309
-or $v1, $0, $11
310
-jr $31
311
-#L6
312
-L6:
313
-#ret 66
314
-li $12, 66
315
-or $v1, $0, $12
316
-jr $31
317
-#end main
318
-
319
-done:
320
-ori $v0, $0, 10
321
-syscall

+ 9 - 0
tac/tests/Makefile

@@ -0,0 +1,9 @@
1
+OUT:=$(patsubst %.c, %.asm, $(wildcard *.c))
2
+
3
+all: $(OUT)
4
+
5
+%.asm: %.c
6
+	../mycc < $< | sed -n '/^=\{5\}$$/ { s///; :a; n; p; ba; }' > $@
7
+
8
+clean:
9
+	rm -rf *.asm

+ 13 - 0
tac/tests/all_scopes.c

@@ -0,0 +1,13 @@
1
+/* ##answer: 220 */
2
+int y = 5;
3
+
4
+int fun1(){
5
+	int x = 11;
6
+	return x;
7
+}
8
+
9
+
10
+int main() { 
11
+	int x = 4;
12
+	return y * x * fun1();
13
+}

+ 17 - 0
tac/tests/cplus.c

@@ -0,0 +1,17 @@
1
+/* ##answer: 29 */
2
+function cplus(int a) {
3
+  int cplusa(int b) {
4
+    return a + b;
5
+  }
6
+
7
+  return cplusa;
8
+}
9
+
10
+int main() {
11
+  int x = cplus(5);
12
+  int y = x;
13
+  int f = cplus(2);
14
+  int z = y;
15
+
16
+  return x(2) + f(2) + y(5) + z(3);
17
+}

+ 14 - 0
tac/tests/deep_closure.c

@@ -0,0 +1,14 @@
1
+/* ##answer: 18 */
2
+function cplus(int a) {
3
+  int cplusa(int b) {
4
+    int cplusab(int c) {
5
+      return a + b + c;
6
+    }
7
+    return cplusab;
8
+  }
9
+  return cplusa;
10
+}
11
+
12
+int main() {
13
+  return cplus(5)(6)(7);
14
+}

+ 9 - 0
tac/tests/func_args.c

@@ -0,0 +1,9 @@
1
+/* ##answer: 14 */
2
+int aplusb(int a, int b) {
3
+  return a + b;
4
+}
5
+
6
+int main() {
7
+  int y = aplusb(aplusb(2, 3), aplusb(4, 5));
8
+  return y;
9
+}

+ 11 - 0
tac/tests/func_call.c

@@ -0,0 +1,11 @@
1
+/* ##answer: 8*/
2
+
3
+int foo() {
4
+  return 5;
5
+}
6
+
7
+int main() {
8
+  int x = foo() + 3;
9
+
10
+  return x % 17;
11
+}

+ 11 - 0
tac/tests/immed_call.c

@@ -0,0 +1,11 @@
1
+/* ##answer: 11 */
2
+function cplus(int a) {
3
+  int cplusa(int b) {
4
+    return a + b;
5
+  }
6
+  return cplusa;
7
+}
8
+
9
+int main() {
10
+  return cplus(5)(6);
11
+}

+ 4 - 0
tac/tests/modulo.c

@@ -0,0 +1,4 @@
1
+/* ##answer: 1*/
2
+int main() {
3
+  return 5 % 2; 
4
+}

+ 31 - 0
tac/tests/odd_recursion.c

@@ -0,0 +1,31 @@
1
+/* ##answer: 400 */
2
+int biggerIsOdd(int x, int y){
3
+  if(x>y){
4
+    return isOdd(x);
5
+  } else {
6
+    return isOdd(y);
7
+  }
8
+}
9
+
10
+int isOdd(int x){
11
+  if(x == 1){
12
+    return 1;
13
+  } else {
14
+    if(isOdd(x-1) == 1){
15
+      return 0;
16
+    } else {
17
+      return 1;
18
+    }
19
+  }
20
+}
21
+
22
+
23
+int main() { 
24
+  int x = 5;
25
+  int y = 7;
26
+
27
+  if(biggerIsOdd(x,y) == 1){
28
+    return 400;
29
+  }
30
+  return 66;
31
+}

+ 20 - 0
tac/tests/really_deep_closure.c

@@ -0,0 +1,20 @@
1
+/* ##answer: 15 */
2
+function cplus(int a) {
3
+  int cplusa(int b) {
4
+    int cplusab(int c) {
5
+      int cplusabc(int d) {
6
+        int cplusabcd(int e) {
7
+          return a+b+c+d+e;
8
+        }
9
+        return cplusabcd;
10
+      }
11
+      return cplusabc;
12
+    }
13
+    return cplusab;
14
+  }
15
+  return cplusa;
16
+}
17
+
18
+int main() {
19
+  return cplus(1)(2)(3)(4)(5);
20
+}

+ 16 - 0
tac/tests/recursion.c

@@ -0,0 +1,16 @@
1
+/* ##answer: 5166*/
2
+int fact(int n) {
3
+  int inner_fact(int n, int a) {
4
+    if (n == 0) return a;
5
+    return inner_fact(n-1, a*n);
6
+  }
7
+  return inner_fact(n, 1);
8
+}
9
+
10
+int main() {
11
+  int x = fact(3);
12
+  int y = fact(5);
13
+  int z = fact(7);
14
+
15
+  return x+y+z;
16
+}

+ 4 - 0
tac/tests/return_only.c

@@ -0,0 +1,4 @@
1
+/* ##answer: 3*/
2
+int main() {
3
+  return 1 + 2;
4
+}

+ 4 - 0
tac/tests/sub.c

@@ -0,0 +1,4 @@
1
+/* ##answer: 5 */
2
+int main() {
3
+  return 10 - 5;
4
+}

+ 44 - 0
tac/tests/test.sh

@@ -0,0 +1,44 @@
1
+#!/bin/bash
2
+uname=`uname`
3
+if [ "$uname" = "Darwin" ]; then
4
+  date="gdate"
5
+  readlink="greadlink"
6
+  wc="gwc"
7
+  sed="gsed"
8
+  awk="gawk"
9
+else
10
+  date="date"
11
+  readlink="readlink"
12
+  wc="wc"
13
+  sed="sed"
14
+  awk="awk"
15
+fi
16
+start=$($date +%s.%N)
17
+absdir=$($readlink -f $(dirname $0))
18
+pass="\033[32mPASSED\033[0m"
19
+fail="\033[31mFAILED\033[0m"
20
+tests=0
21
+passes=0
22
+num=`find * -name '*.c' | $wc -L`
23
+num=$((num-2))
24
+fmt=`echo "%-$num""s"`
25
+make > /dev/null
26
+for i in $(find * -name '*.c' | sort); do
27
+  asm=${i/.c/.asm}
28
+  answer=`spim -noexception load $absdir/$asm 2> /dev/null | tail -n 1`
29
+  exp_ans=`grep "##answer" $absdir/$i | $sed 's/\/\* ##answer:\s\+\([^\*]\+\)\b\s*\*\//\1/g'`
30
+  printf $fmt "${i%.*}"
31
+  echo -n " ... "
32
+  if [ "$answer" == "$exp_ans" ]; then
33
+    echo -e "$pass"
34
+    passes=$((passes+1))
35
+  else
36
+    echo -e "$fail expected $exp_ans got $answer"
37
+  fi
38
+  tests=$((tests+1))
39
+done
40
+end=$($date +%s.%N)    
41
+runtime=$(echo "$end $start" | $awk '{printf "%.2f", $1 - $2}')
42
+echo -e "\n$passes/$tests passed in $runtime""s"
43
+make clean > /dev/null
44
+exit $((tests-passes))

+ 16 - 0
tac/tests/twice.c

@@ -0,0 +1,16 @@
1
+/* ##answer: 12*/
2
+int whammy(int a) {
3
+  return a + 5;
4
+}
5
+
6
+function twice(function f) {
7
+  int g(int x) { return f(f(x)); }
8
+  return g;
9
+}
10
+
11
+int main() {
12
+  doublewhammy = twice(whammy);
13
+
14
+  return doublewhammy(2);
15
+}
16
+

+ 9 - 0
tac/tests/var_maths.c

@@ -0,0 +1,9 @@
1
+/* ##answer: 30*/
2
+int main() {
3
+  int x = 5;
4
+  int y = x - 4;
5
+  int z = 10 - x;
6
+  int w = x % z;
7
+
8
+  return x*x + z / (w + y);
9
+}

+ 0 - 44
tac/wew.asm

@@ -1,44 +0,0 @@
1
-li $a0, 68
2
-li $v0, 9
3
-syscall
4
-or $fp, $0, $v0
5
-la $t0, main
6
-sw $t0, 0($fp)
7
-sw $0, 4($fp)
8
-jal main
9
-j done
10
-return_five:
11
-li $a0, 68
12
-li $v0, 9
13
-syscall
14
-sw $fp, 4($v0)
15
-or $fp, $0, $v0
16
-la $t0, return_five
17
-sw $t0, 0($fp)
18
-sw $ra, 64($fp)
19
-li $8, 5
20
-or $v1, $0, $8
21
-jr $31
22
-main:
23
-li $a0, 68
24
-li $v0, 9
25
-syscall
26
-sw $fp, 4($v0)
27
-or $fp, $0, $v0
28
-la $t0, main
29
-sw $t0, 0($fp)
30
-sw $ra, 64($fp)
31
-jal return_five
32
-lw $fp, 4($fp)
33
-lw $ra, 64($fp)
34
-or $9, $0, $v1
35
-jal return_five
36
-lw $fp, 4($fp)
37
-lw $ra, 64($fp)
38
-or $10, $0, $v1
39
-add $11, $9, $10
40
-or $v1, $0, $11
41
-jr $31
42
-done:
43
-ori $v0, $0, 10
44
-syscall