diff --git a/lib.c b/lib.c
index ba27d2ac76bbd6e72b2056a157b2748aabce45e2..997d1010ce21b9614e771150258d46ef1167b231 100644
--- a/lib.c
+++ b/lib.c
@@ -397,71 +397,70 @@ int indice_temp(struct symtable* t, struct symbol* s){
     return i;
 }
 
-void code_mips_dump(struct symtable * t, struct code * c){
-    fprintf(stdout,".data\n");
+void code_mips_dump(struct symtable * t, struct code * c, FILE* fout){
+    fprintf(fout,".data\n");
+    fprintf(fout,"\tlf: .asciiz \"\\n\"\n");
 
     if(t==NULL){fprintf(stderr,"Code mips dump: symtable null\n"); exit(1);}
     
     unsigned int i =0;
     for(i=i; i<t->size; i++){ 
         if(t->symbols[i].kind == CONSTANT_INT){ //INTEGER CONSTANT 
-            fprintf(stdout,"\ttemp%d: .word %ld\n",i,t->symbols[i].u.value_int);
+            fprintf(fout,"\ttemp%d: .word %ld\n",i,t->symbols[i].u.value_int);
         }
         else if(t->symbols[i].kind == CONSTANT_FLOAT){ //FLOAT CONSTANT
-            fprintf(stdout,"\ttemp%d: .word %0.2f\n",i,t->symbols[i].u.value_float);
+            fprintf(fout,"\ttemp%d: .word %0.2f\n",i,t->symbols[i].u.value_float);
+        }
+        else if(t->symbols[i].kind == CHAIN){ //CHAIN
+            fprintf(fout,"\ttemp%d: .asciiz %s\n",i,t->symbols[i].u.chaine);
+        }
+        else if(t->symbols[i].kind == NAME_LOC){
+            fprintf(fout,"\t%s: .word 0\n",t->symbols[i].u.name);
         }
         else{ //NAME
-            fprintf(stdout,"\ttemp%d: .word 0\n",i);
+            fprintf(fout,"\ttemp%d: .word 0\n",i);
         }
     }
 
-    fprintf(stdout,"\n\n.text\n  main:\n");
+    //Macro for new line print
+    fprintf(fout,".macro LF\n");
+    fprintf(fout,"\tli $v0, 4\n");
+    fprintf(fout,"\tla $a0, lf\n");
+    fprintf(fout,"\tsyscall\n");
+    fprintf(fout,".end_macro\n");
+    fprintf(fout,"\n\n.text\n  main:\n");
+
+
 
     for(i = 0; i<c->nextquad; i++){
         switch (c->quads[i].kind)
         {
-            case BOP_PLUS:
-                fprintf(stdout,"\tlw $t0, temp%d\n",indice_temp(t,c->quads[i].sym2));
-                fprintf(stdout,"\tlw $t1, temp%d\n",indice_temp(t,c->quads[i].sym3));
-                fprintf(stdout,"\tadd $t0, $t0, $t1\n");
-                fprintf(stdout,"\tsw $t0, temp%d\n",indice_temp(t,c->quads[i].sym1));
-                break;
-            case BOP_MINUS:
-                fprintf(stdout,"\tlw $t0, temp%d\n",indice_temp(t,c->quads[i].sym2));
-                fprintf(stdout,"\tlw $t1, temp%d\n",indice_temp(t,c->quads[i].sym3));
-                fprintf(stdout,"\tsub $t0, $t0, $t1\n");
-                fprintf(stdout,"\tsw $t0, temp%d\n",indice_temp(t,c->quads[i].sym1));
-                break;
-            case BOP_MULT:
-                fprintf(stdout,"\tlw $t0, temp%d\n",indice_temp(t,c->quads[i].sym2));
-                fprintf(stdout,"\tlw $t1, temp%d\n",indice_temp(t,c->quads[i].sym3));
-                fprintf(stdout,"\tmul $t0, $t0, $t1\n");
-                fprintf(stdout,"\tsw $t0, temp%d\n",indice_temp(t,c->quads[i].sym1));
-                break;
-            case UOP_MINUS:
-                fprintf(stdout,"\tli $t0, 0\n");
-                fprintf(stdout,"\tlw $t1, temp%d\n",indice_temp(t,c->quads[i].sym2));
-                fprintf(stdout,"\tsub $t0, $t0, $t1\n");
-                fprintf(stdout,"\tsw $t0, temp%d\n",indice_temp(t,c->quads[i].sym1));
-                break;
             case CALL_PRINT:
-                fprintf(stdout,"\tli $v0, 1\n");
-                fprintf(stdout,"\tlw $a0, temp%d\n",indice_temp(t,c->quads[i].sym1));
-                fprintf(stdout,"\tsyscall\n");
+                fprintf(fout,"\tlw $t0, %s\n",c->quads[i].sym1->u.name);
+                fprintf(fout,"\tmove $a0, $t0\n");
+                fprintf(fout,"\tli $v0, 1\n");
+                fprintf(fout,"\tsyscall\n");
+                //Return to line
+                fprintf(fout,"\tLF\n");
+                break;
+            case CALL_PRINTSTR:
+                fprintf(fout,"\tli $v0, 4\n");
+                fprintf(fout,"\tla $a0, temp%d\n",indice_temp(t,c->quads[i].sym1));
+                fprintf(fout,"\tsyscall\n");
                 break;
             case COPY:
-                fprintf(stdout,"\tlw $t0, temp%d\n",indice_temp(t,c->quads[i].sym2));
-                fprintf(stdout,"\tsw $t0, temp%d\n",indice_temp(t,c->quads[i].sym1));
+                fprintf(fout,"\tlw $t0, temp%d\n",indice_temp(t,c->quads[i].sym2));
+                fprintf(fout,"\tsw $t0, %s\n",c->quads[i].sym1->u.name);
                 break;
             default:
-                fprintf(stderr,"BUG\n");
+                fprintf(stderr,"#BUG %d\n",c->quads[i].kind);
                 break;
         }
     }
 
-    fprintf(stdout,"\t# exit\n");
-    fprintf(stdout,"\tli $v0,10\n");
-    fprintf(stdout,"\tsyscall\n");
+    fprintf(fout,"\t# exit\n");
+    fprintf(fout,"\tli $v0,10\n");
+    fprintf(fout,"\tsyscall\n");
 }
 
 void code_free(struct code * c)
diff --git a/lib.h b/lib.h
index 79bc6924fc1b0d49baf00cba06d6d121b900f2fb..d8c32da2eeb48851e97a16d824344c0a9826f87c 100644
--- a/lib.h
+++ b/lib.h
@@ -114,7 +114,7 @@ struct symbol *newtemp(struct symtable * t);
 // Display in the 'fout' output file the intermediate code (in commentary)
 void code_dump(struct code * c, FILE* fout);
 // Display in the 'fout' output file the mips code
-void code_mips_dump(struct symtable * t, struct code * c);
+void code_mips_dump(struct symtable * t, struct code * c, FILE* fout);
 
 // Free memory of the code struct
 void code_free(struct code * c);
diff --git a/main.c b/main.c
index 272306c94b23ea260f80908629fc417c6207de02..5ec6af13469af6b2ca97860ac616c4cecc39e27e 100644
--- a/main.c
+++ b/main.c
@@ -48,6 +48,8 @@ int main(int argc, char *argv[])
     // Generate intermediate code
     code_dump(CODE,fname);
 
+    code_mips_dump(SYMTAB,CODE,fname);
+
     // Free memory
     symtable_free(SYMTAB);
     code_free(CODE);