diff --git a/MEPA b/MEPA
index a8c5494d15982a373895918ab41677a0c247bc79..474ac52a6e55412add7b8b8b8faf7f146071cf23 100644
--- a/MEPA
+++ b/MEPA
@@ -2,22 +2,52 @@
      AMEM 1
      DSVS R00
 R01: ENPR 1 
-     AMEM 1
+     AMEM 2
      DSVS R02
 R02: NADA 
-     CRVI 1,-5
-     ARMZ 1,0
+     CRVL 1,-5
+     CRCT 2
+     CMME
+     DSVF R03
+     CRVL 1,-5
+     ARMZ 1,-6
+     CRCT 0
+     ARMI 1,-4
+     DSVS R04
+R03: NADA 
+     AMEM 1
+     CRVL 1,-5
      CRCT 1
-     ARMI 1,-5
-     DMEM 1
-     RTPR 1,2
-R00: NADA 
-     CRCT 8
-     ARMZ 0,0
-     CREN 0,0
+     SUBT
+     CREN 1,0
+     CHPR R01,1
+     AMEM 1
+     CRVL 1,-5
      CRCT 2
-     CRCT 3
+     SUBT
+     CREN 1,1
+     CHPR R01,1
      SOMA
-     CHPR R01,0
+     ARMZ 1,-6
+     CRVL 1,0
+     CRVL 1,1
+     SOMA
+     CRCT 1
+     SOMA
+     ARMI 1,-4
+R04: NADA 
+     CRVL 1,-5
+     IMPR
+     CRVI 1,-4
+     IMPR
+     DMEM 2
+R00: NADA 
+     AMEM 1
+     CRCT 3
+     CREN 0,0
+     CHPR R01,-1
+     IMPR
+     CRVL 0,0
+     IMPR
      DMEM 1
      PARA
diff --git a/compilador b/compilador
index 4dbcf1715206b3c6730c7da8132228ccd1f1e9f4..9ab823f80184abcdeaecd79c98b052f8d40dbdf9 100755
Binary files a/compilador and b/compilador differ
diff --git a/compilador.tab.c b/compilador.tab.c
index 3499d0d553d3dc396b86ba2a573be6b674f4a85a..807234964a8d8ddadd512cdcd9a592e0d8b82ecc 100644
--- a/compilador.tab.c
+++ b/compilador.tab.c
@@ -567,11 +567,11 @@ static const yytype_int16 yyrline[] =
      234,   238,   210,   246,   247,   245,   255,   258,   259,   263,
      262,   272,   272,   280,   281,   284,   294,   297,   298,   299,
      302,   303,   306,   307,   308,   309,   310,   311,   314,   314,
-     318,   319,   322,   322,   353,   353,   396,   399,   403,   402,
-     415,   415,   429,   432,   433,   436,   445,   448,   451,   456,
-     459,   462,   465,   468,   471,   474,   477,   483,   489,   492,
-     495,   498,   501,   501,   543,   554,   556,   563,   556,   589,
-     596,   598,   601,   601
+     318,   319,   322,   322,   353,   353,   395,   398,   402,   401,
+     414,   414,   428,   431,   432,   435,   444,   447,   450,   455,
+     458,   461,   464,   467,   470,   473,   476,   482,   488,   491,
+     494,   497,   500,   500,   542,   553,   555,   562,   555,   588,
+     595,   597,   600,   600
 };
 #endif
 
@@ -1811,38 +1811,37 @@ yyreduce:
             {
                if (l_elem == NULL){
                   yyerror("Procedimento não declarado");
-               } else if (l_elem->categ == PR || l_elem->categ == FUN) {
+               } else{
                   // Gera código para chamar o procedimento
                   empilha(l_elem->ident, proc);
                }
                if (l_elem->categ == FUN)
                   geraCodigo(NULL, "AMEM 1");
-               num_param = 0; // Reinicia a contagem de parâmetros reais   
+               if (l_elem->categ == PR || l_elem->categ == FUN)
+                  num_param = 0; // Reinicia a contagem de parâmetros reais   
             }
-#line 1823 "compilador.tab.c"
+#line 1824 "compilador.tab.c"
     break;
 
   case 65:
-#line 367 "compilador.y"
+#line 368 "compilador.y"
             { 
-               if (l_elem->categ == PR || l_elem->categ ==FUN) {
-                  char buffer[50];
-                  mostra_ts(ts);
-                  desempilha(buffer, proc);
-                  l_elem = busca(buffer, ts);
+               char buffer[50];
+               mostra_ts(ts);
+               desempilha(buffer, proc);
+               l_elem = busca(buffer, ts);
 
+               if (l_elem->categ == PR || l_elem->categ ==FUN) {
                   // Verifica se o número de parâmetros reais bate com os formais
-                  if (num_param != l_elem->info.pr.quant) {
-                     char error_msg[100];
-                     if(l_elem->categ == PR){
-                        sprintf(error_msg, "Erro: número de parâmetros incorreto. Esperado: %d, recebido: %d.",
-                                 l_elem->info.pr.quant, num_param);
-                        yyerror(error_msg);
-                     } else if(l_elem->categ == FUN){
-                        sprintf(error_msg, "Erro: número de parâmetros incorreto. Esperado: %d, recebido: %d.",
-                                 l_elem->info.fun.quant, num_param);
-                        yyerror(error_msg);
-                     }
+                  char error_msg[100];
+                  if (l_elem->categ == PR && num_param != l_elem->info.pr.quant) {
+                     sprintf(error_msg, "Erro: número de parâmetros incorreto. Esperado: %d, recebido: %d.",
+                              l_elem->info.pr.quant, num_param);
+                     yyerror(error_msg);
+                  } else if(l_elem->categ == FUN && num_param != l_elem->info.fun.quant){
+                     sprintf(error_msg, "Erro: número de parâmetros incorreto. Esperado: %d, recebido: %d.",
+                              l_elem->info.fun.quant, num_param);
+                     yyerror(error_msg);
                   }
 
                   // Gera o código de chamada do procedimento
@@ -1851,11 +1850,11 @@ yyreduce:
                   geraCodigo(NULL, buffer);
                }
             }
-#line 1855 "compilador.tab.c"
+#line 1854 "compilador.tab.c"
     break;
 
   case 68:
-#line 403 "compilador.y"
+#line 402 "compilador.y"
                {
                   char buffer[50];
                   desempilha(buffer,proc);
@@ -1863,20 +1862,20 @@ yyreduce:
                   val_ou_ref = l_elem->info.pr.param[num_param][1];
                   empilha(buffer,proc);
                }
-#line 1867 "compilador.tab.c"
+#line 1866 "compilador.tab.c"
     break;
 
   case 69:
-#line 411 "compilador.y"
+#line 410 "compilador.y"
                {
                   num_param++; // Incrementa para cada parâmetro real
                   val_ou_ref = VLR;
                }
-#line 1876 "compilador.tab.c"
+#line 1875 "compilador.tab.c"
     break;
 
   case 70:
-#line 415 "compilador.y"
+#line 414 "compilador.y"
                  {
                   char buffer[50];
                   desempilha(buffer,proc);
@@ -1884,20 +1883,20 @@ yyreduce:
                   val_ou_ref = l_elem->info.pr.param[num_param][1];
                   empilha(buffer,proc);
                }
-#line 1888 "compilador.tab.c"
+#line 1887 "compilador.tab.c"
     break;
 
   case 71:
-#line 423 "compilador.y"
+#line 422 "compilador.y"
                {
                   num_param++; // Conta o primeiro parâmetro real
                   val_ou_ref = VLR;
                }
-#line 1897 "compilador.tab.c"
+#line 1896 "compilador.tab.c"
     break;
 
   case 75:
-#line 436 "compilador.y"
+#line 435 "compilador.y"
                     {
                geraCodigo(NULL, "LEIT");
                l_elem = busca(token,ts);
@@ -1905,123 +1904,123 @@ yyreduce:
                sprintf(buffer,"ARMZ %d,%d",l_elem->nivel,l_elem->info.vs.desloc);
                geraCodigo(NULL,buffer);
             }
-#line 1909 "compilador.tab.c"
+#line 1908 "compilador.tab.c"
     break;
 
   case 77:
-#line 448 "compilador.y"
+#line 447 "compilador.y"
                                                          {
                geraCodigo(NULL,"IMPR");
             }
-#line 1917 "compilador.tab.c"
+#line 1916 "compilador.tab.c"
     break;
 
   case 78:
-#line 451 "compilador.y"
+#line 450 "compilador.y"
                                 {
                geraCodigo(NULL,"IMPR");
             }
-#line 1925 "compilador.tab.c"
+#line 1924 "compilador.tab.c"
     break;
 
   case 79:
-#line 456 "compilador.y"
+#line 455 "compilador.y"
                                              {
             geraCodigo(NULL, "CMIG"); // Adiciona operação de cmig
          }
-#line 1933 "compilador.tab.c"
+#line 1932 "compilador.tab.c"
     break;
 
   case 80:
-#line 459 "compilador.y"
+#line 458 "compilador.y"
                                                 {
             geraCodigo(NULL, "CMDG"); // Adiciona operação de cmdg
          }
-#line 1941 "compilador.tab.c"
+#line 1940 "compilador.tab.c"
     break;
 
   case 81:
-#line 462 "compilador.y"
+#line 461 "compilador.y"
                                              {
             geraCodigo(NULL, "CMME"); // Adiciona operação de cmme
          }
-#line 1949 "compilador.tab.c"
+#line 1948 "compilador.tab.c"
     break;
 
   case 82:
-#line 465 "compilador.y"
+#line 464 "compilador.y"
                                                    {
             geraCodigo(NULL, "CMEG"); // Adiciona operação de cmeg
          }
-#line 1957 "compilador.tab.c"
+#line 1956 "compilador.tab.c"
     break;
 
   case 83:
-#line 468 "compilador.y"
+#line 467 "compilador.y"
                                              {
             geraCodigo(NULL, "CMMA"); // Adiciona operação de cmma
          }
-#line 1965 "compilador.tab.c"
+#line 1964 "compilador.tab.c"
     break;
 
   case 84:
-#line 471 "compilador.y"
+#line 470 "compilador.y"
                                                    {
             geraCodigo(NULL, "CMAG"); // Adiciona operação de cmag
          }
-#line 1973 "compilador.tab.c"
+#line 1972 "compilador.tab.c"
     break;
 
   case 86:
-#line 477 "compilador.y"
+#line 476 "compilador.y"
                                                 {
                if (val_ou_ref == REF)
                   yyerror("Erro: tentativa de EXPRESSAO em passagem por REFERENCIA\n");
                else
                   geraCodigo(NULL, "SOMA"); // Adiciona operação de soma
             }
-#line 1984 "compilador.tab.c"
+#line 1983 "compilador.tab.c"
     break;
 
   case 87:
-#line 483 "compilador.y"
+#line 482 "compilador.y"
                                             {
                if (val_ou_ref == REF)
                   yyerror("Erro: tentativa de EXPRESSAO em passagem por REFERENCIA\n");
                else
                   geraCodigo(NULL, "SUBT"); // Adiciona operação de subt
             }
-#line 1995 "compilador.tab.c"
+#line 1994 "compilador.tab.c"
     break;
 
   case 89:
-#line 492 "compilador.y"
+#line 491 "compilador.y"
                              {
                geraCodigo(NULL, "MULT"); // Adiciona operação de mult
             }
-#line 2003 "compilador.tab.c"
+#line 2002 "compilador.tab.c"
     break;
 
   case 90:
-#line 495 "compilador.y"
+#line 494 "compilador.y"
                               {
                geraCodigo(NULL, "DIVI"); // Adiciona operação de divi
             }
-#line 2011 "compilador.tab.c"
+#line 2010 "compilador.tab.c"
     break;
 
   case 92:
-#line 501 "compilador.y"
+#line 500 "compilador.y"
              {
     // Carrega variável
     l_elem = busca(token, ts);
     empilha(token, proc);
    }
-#line 2021 "compilador.tab.c"
+#line 2020 "compilador.tab.c"
     break;
 
   case 93:
-#line 507 "compilador.y"
+#line 506 "compilador.y"
    {
       char buffer[50];
       desempilha(buffer, proc);
@@ -2058,11 +2057,11 @@ yyreduce:
          }
       }
    }
-#line 2062 "compilador.tab.c"
+#line 2061 "compilador.tab.c"
     break;
 
   case 94:
-#line 543 "compilador.y"
+#line 542 "compilador.y"
          {
     // Empilha constante
     char buffer[50];
@@ -2073,11 +2072,11 @@ yyreduce:
     }
     geraCodigo(NULL, buffer);
 }
-#line 2077 "compilador.tab.c"
+#line 2076 "compilador.tab.c"
     break;
 
   case 96:
-#line 556 "compilador.y"
+#line 555 "compilador.y"
                     {
                char r_ini[4];
                sprintf(r_ini, "R%02d", rot_id);
@@ -2085,11 +2084,11 @@ yyreduce:
                rot_id += 1;
                geraCodigo(r_ini,"NADA");
             }
-#line 2089 "compilador.tab.c"
+#line 2088 "compilador.tab.c"
     break;
 
   case 97:
-#line 563 "compilador.y"
+#line 562 "compilador.y"
                                {
                char r_fim[4];
                sprintf(r_fim, "R%02d", rot_id);
@@ -2100,11 +2099,11 @@ yyreduce:
                strcat(buffer,r_fim);
                geraCodigo(NULL,buffer);
             }
-#line 2104 "compilador.tab.c"
+#line 2103 "compilador.tab.c"
     break;
 
   case 98:
-#line 573 "compilador.y"
+#line 572 "compilador.y"
                                {
                char r_ini[4];
                char r_fim[4];
@@ -2119,21 +2118,21 @@ yyreduce:
 
                geraCodigo(r_fim,"NADA");
             }
-#line 2123 "compilador.tab.c"
+#line 2122 "compilador.tab.c"
     break;
 
   case 99:
-#line 589 "compilador.y"
+#line 588 "compilador.y"
                                        {
                char r_fim[4];
                desempilha(r_fim,rot);
                geraCodigo(r_fim,"NADA");
             }
-#line 2133 "compilador.tab.c"
+#line 2132 "compilador.tab.c"
     break;
 
   case 102:
-#line 601 "compilador.y"
+#line 600 "compilador.y"
                       {
                char r_else[4];
                sprintf(r_else,"R%02d",rot_id);
@@ -2149,11 +2148,11 @@ yyreduce:
                empilha(r_fim, rot);
                rot_id += 1;
             }
-#line 2153 "compilador.tab.c"
+#line 2152 "compilador.tab.c"
     break;
 
   case 103:
-#line 616 "compilador.y"
+#line 615 "compilador.y"
                                     {
                char r_fim[4];
                desempilha(r_fim,rot);
@@ -2168,11 +2167,11 @@ yyreduce:
 
                geraCodigo(r_else,"NADA");
             }
-#line 2172 "compilador.tab.c"
+#line 2171 "compilador.tab.c"
     break;
 
 
-#line 2176 "compilador.tab.c"
+#line 2175 "compilador.tab.c"
 
       default: break;
     }
@@ -2404,7 +2403,7 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 633 "compilador.y"
+#line 632 "compilador.y"
 
 
 int main (int argc, char** argv) {
diff --git a/compilador.y b/compilador.y
index 1821ddda7f93263d02a9488db66c65169fe6d21f..805631e52732427b696e0a5e44b9ba90b8f10d7a 100644
--- a/compilador.y
+++ b/compilador.y
@@ -353,36 +353,35 @@ chamada_procedimento:
             {
                if (l_elem == NULL){
                   yyerror("Procedimento não declarado");
-               } else if (l_elem->categ == PR || l_elem->categ == FUN) {
+               } else{
                   // Gera código para chamar o procedimento
                   empilha(l_elem->ident, proc);
                }
                if (l_elem->categ == FUN)
                   geraCodigo(NULL, "AMEM 1");
-               num_param = 0; // Reinicia a contagem de parâmetros reais   
+               if (l_elem->categ == PR || l_elem->categ == FUN)
+                  num_param = 0; // Reinicia a contagem de parâmetros reais   
             }
 
             lista_parametros
             
             { 
-               if (l_elem->categ == PR || l_elem->categ ==FUN) {
-                  char buffer[50];
-                  mostra_ts(ts);
-                  desempilha(buffer, proc);
-                  l_elem = busca(buffer, ts);
+               char buffer[50];
+               mostra_ts(ts);
+               desempilha(buffer, proc);
+               l_elem = busca(buffer, ts);
 
+               if (l_elem->categ == PR || l_elem->categ ==FUN) {
                   // Verifica se o número de parâmetros reais bate com os formais
-                  if (num_param != l_elem->info.pr.quant) {
-                     char error_msg[100];
-                     if(l_elem->categ == PR){
-                        sprintf(error_msg, "Erro: número de parâmetros incorreto. Esperado: %d, recebido: %d.",
-                                 l_elem->info.pr.quant, num_param);
-                        yyerror(error_msg);
-                     } else if(l_elem->categ == FUN){
-                        sprintf(error_msg, "Erro: número de parâmetros incorreto. Esperado: %d, recebido: %d.",
-                                 l_elem->info.fun.quant, num_param);
-                        yyerror(error_msg);
-                     }
+                  char error_msg[100];
+                  if (l_elem->categ == PR && num_param != l_elem->info.pr.quant) {
+                     sprintf(error_msg, "Erro: número de parâmetros incorreto. Esperado: %d, recebido: %d.",
+                              l_elem->info.pr.quant, num_param);
+                     yyerror(error_msg);
+                  } else if(l_elem->categ == FUN && num_param != l_elem->info.fun.quant){
+                     sprintf(error_msg, "Erro: número de parâmetros incorreto. Esperado: %d, recebido: %d.",
+                              l_elem->info.fun.quant, num_param);
+                     yyerror(error_msg);
                   }
 
                   // Gera o código de chamada do procedimento