⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listfile_c.cpp

📁 单片机宏汇编器的源程序。给一些爱好者作为学习编译原理和 C 程序设计的例子.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
     } // end switch
   } // endif
  else
   { PRLineLOC(OutputFile,Cursor,CurAsmLn->lc); } // end else

  return true;
} // end GenALeftLine
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// 次要控制指令执行子程序。
//---------------------------------------------------------------------------
void LISTFile::MinorCtrlAct(AsmLine* line)
{ register Tokenfield* p;
  for( p = line->head->next;
           p && p->Token == Dog_Ctrl;
               p = p->next )
   { switch(p->Token2)
     { case LI_Tn    : { setn.List = true;  break; } // end case
       case NOLI_Tn  : { setn.List = false; break; } // end case
       case GEN_Tn   : { setn.Gen  = true;  break; } // end case
       case NOGEN_Tn : { setn.Gen  = false; break; } // end case
       case SAV_Tn   : { pool_16 pz;
                         pz.lowbyte = setn.Gen; pz.highbyte = setn.List;
                         SaRs_Stk.push(pz.pot16);
                         break;
                       } // end case
       case RSTO_Tn  : { if(SaRs_Stk.empty())
                          { masm.OutWarning(SaRsStkRstorWarn);
                            fprintf(OutputFile,"\n*** WARNING(%s, LINE %u): %s",
                             (const char*)masm.AsmFn->FileName, line->LineNo,
                               ErrWarnMsg::warnmsg[SaRsStkRstorWarn]);
                          } // endif
                         else // 栈不空
                          { pool_16 pz;
                            pz.pot16 = SaRs_Stk.pop();
                            setn.Gen = pz.lowbyte; setn.List = pz.highbyte;
                          } // end else
                         break;
                       } // end case
       case EJECT_Tn : fprintf(OutputFile,"\n"); GenPageHeader(); break;
       case Dog_Skip : break;

       default: { EThrows(printf("\n ??? $ here. ???"); Debugkey;); } // end default
     } // end switch
   } // end for
} // end MinorCtrlAct
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 当遇到EJECT命令时做。
//---------------------------------------------------------------------------
void LISTFile::GenPageHeader()
{ ++PageCount;
  fprintf(OutputFile,"\nLOC   OBJ         LINE  SOURCE                    Page %u",PageCount);
} // end GenPageHeader
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void LISTFile::GenOBJList()
{ fprintf(OutputFile,"\n%s List begin %s%s",hebk,hebk,hebk);
  GenPageHeader();

  CurTextLn = 1;
  CurAsmLn = masm.AsmFn->FirstLine();

  Tokenfield* ErrWarnPt = masm.AsmFn->FirstErrWarnPt();

  for( ; CurAsmLn; )
   { if(CurAsmLn->hideln) { CurAsmLn = CurAsmLn->next; continue; } // endif

     if(setn.List)
      { if(CurAsmLn->NestNo > 0 && !setn.Gen)  {} // endif
        else
         { Cursor = 1; putc('\n', OutputFile); } // end else
      } // endif
     if(CurAsmLn->LineNo <= CurTextLn)
      { if( setn.List && GenALeftLine() ) { GenSrcText(); } // endif

        if(ErrWarnPt && ErrWarnPt->loc[1] == CurAsmLn->LineNo) // 打印错误信息
         { PrintTheErrWarn(ErrWarnPt); } // endif

        if(CurAsmLn->HeadToken()== MacroCTRLn)
         { MinorCtrlAct(CurAsmLn); } // endif

        CurAsmLn = CurAsmLn->next;
      } // endif
     else
      { if(setn.List)
         { IFinMacro(); GenSrcText(); } // endif
        // if(CurAsmLn->HeadToken()== MacroCTRLn)
        //  { MinorCtrlAct(CurAsmLn); } // endif
      } // end else
   } // end for
  fprintf(OutputFile,"\n%s List  end  %s%s\n\n",hebk,hebk,hebk);
} // end GenAPageList
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void LISTFile::PrintTheErrWarn(Tokenfield* &pt)
{ int16u Lno = pt->loc[1];
  do
  { switch(pt->Token)
    { case WarningKn:
       { fprintf(OutputFile,"\n*** WARNING(%s, LINE %u): %s",
                    (const char*)masm.AsmFn->FileName, pt->loc[1],
                          ErrWarnMsg::warnmsg[pt->loc[0]]);
         break;
       } // end case
      case NormalERR:
       { fprintf(OutputFile,"\n*** ERROR(%s, LINE %u): %s",
                    (const char*)masm.AsmFn->FileName, pt->loc[1],
                          ErrWarnMsg::errmsg[pt->loc[0]]);
         break;
       } // end case
      default  : EThrows(printf("\nPrintTheErrWarn out of run!"); Waitkey;);
    } // end switch
    pt = pt->next;
  } while(pt && pt->loc[1] == Lno);
} // end PrintTheErrWarn
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 为指定的文件产生一个寄存器组使用情况表。
//---------------------------------------------------------------------------
void LISTFile::GenRegBankUsed()
{ fprintf(OutputFile,"\nRegister Bank(s) used:");
  for( int8u i = 0, ch = masm.JModulePt->GetRegBankUsedInfo();
           i < 4;
               ++i, ch >>= 1 )
   { if(ch & 0x01) { fprintf(OutputFile," %d",i); } // endif
   } // end for
} // end GenRegBankUsed
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void LISTFile::GenListHeader()
{ fprintf(OutputFile,"MACRO ASSEMBLER A51 宏汇编器 V%s 周立功单片机发展有限公司 2002.\n", MyVersion);
  fprintf(OutputFile,"\n%s << %s >> %s\n",Debk,(const char*)Title,Debk);
  fprintf(OutputFile,"%04u/%02u/%02u", jdate.year, jdate.month, jdate.day);
  struct time ta; gettime(&ta);
  fprintf(OutputFile," %02u:%02u:%02u",ta.ti_hour,ta.ti_min,ta.ti_sec);
} // end GenListHeader
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void LISTFile::PrintSymbolTable()
{ static char TypConv[] = "CXDIBN  ?";
  static const char* TypText[] =
     { "ADDR","ADDR","ADDR","ADDR","ADDR","NUMB","SEG ","REG ","??" };
  static const char* RelText[] =
     { "ABS","UNIT","BITABLE","INPAGE","INBLOCK","PAGE","??" };
  static const char* REGtxt[] =
     { "R0  ","R1  ","R2  ","R3  ","R4  ","R5  ","R6  ","R7  ",
       "A   ","DPTR","PC  ","AB  ","C   ","??? " };
  //.....................................................................
  if(!setn.symbols) { return; } // endif
  fprintf(OutputFile,"\n%s << Symbol Table Listing >> %s",Debk,Debk);
  fprintf(OutputFile,"\nName                                    Type    Value attribute");
  fprintf(OutputFile,"\n%s%s%s%s",hebk,hebk,hebk,hebk);

  JLabelNode* lb = masm.LabMger->head->next;   //SearchLinkList("CY",pt);

  for(  ; lb; lb = lb->next )
   { if( lb->LnPt == NULL && !lb->evenUse ) { continue; } // endif
     DebugKit(lb->Show(); Debugkey;);
     char buf[40]= ".......................................";
     register const char* str = (const char*)lb->LName;
     register int16u k = lb->LName.getLen();
     if( k < 39) { memcpy(buf, str, k ); } // endif
     else        { memcpy(buf, str, 39); } // end else
     fprintf(OutputFile, "\n%s ", buf);

     int8u Ltyp = lb->vv.LBLTyp;
     if(Ltyp != LB_SEG)
      { fprintf(OutputFile, "%c %s",TypConv[Ltyp], TypText[Ltyp]); } // endif
     else
      { fprintf(OutputFile, "%c %s",TypConv[lb->RefSeg->GetSegType()], TypText[Ltyp]); } // end else

     if(lb->Attrb == 'R')
      { if(lb->vv.LBLTyp == LB_SEG)
         { fprintf(OutputFile,"  %4.4XH  ",(int16u)lb->Value); } // endif
        else
         { fprintf(OutputFile, "  %4.4XH  ", lb->LnPt->lc); } // end else
      }   // endif
     else
      { if(Ltyp == LB_REG)
         { register int16u n = (int16u)(lb->Value) - _R0;
           if(n > 13) { n = 13; } // endif      // 下标不能越界!
           fprintf( OutputFile, "  %s   ", REGtxt[n] );
         } // endif
        else { fprintf(OutputFile,"  %4.4XH  ",(int16u)lb->Value); } // end else
      } // end else

     putc(lb->Attrb,OutputFile);        // 'A', 'R', 'E'
     switch(lb->Attrb)
     { //case 'A': { break; } // end case
       case 'R': { if(Ltyp == LB_SEG)
                    { fprintf(OutputFile,"  rel=%s",(lb->RefSeg) ?
                        RelText[lb->RefSeg->GetSegType()]:"NULL");
                    } // endif
                   else
                    { fprintf(OutputFile,"  rel=%s",(lb->RefSeg) ?
                       ((const char*)lb->RefSeg->Name):"NULL");
                    } // end else
                   break;
                 } // end case
       case 'E': { fprintf(OutputFile,"  EXT[%4.4d]",lb->ExtID); break; } // end case
       default : { fprintf(OutputFile,"          "); } // end default
     } // end switch
     if(lb->LnPt != NULL) // 创建该标号的行号。
      { fprintf(OutputFile," #[%d]",lb->LnPt->LineNo); } // endif

     if(!lb->evenUse)
      { fprintf(OutputFile,"(never used)"); } // endif
   } // endfor
  fprintf(OutputFile,"\n%s%s%s%s",hebk,hebk,hebk,hebk);
} // end PrintSymbolTable
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
const char* LISTFile::hebk = "------------------";
const char* LISTFile::Debk = "==================";
//---------------------------------------------------------------------------
// end ListFile_C.cpp
//---------------------------------------------------------------------------
//               Written by JamesyFront.    ZLGmcu Dev.Co.Ltd.  2002.
//---------------------------------------------------------------------------




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -