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

📄 listfile_c.cpp

📁 单片机宏汇编器的源程序。给一些爱好者作为学习编译原理和 C 程序设计的例子.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------
//-------- ListFile_C.cpp ---------------------------------------------------
//---------------------------------------------------------------------------
#include <dos.h>

#include "ListFile_H.h"
#include "Dat4ary_H.h"
#include "MAsmber_H.h"
//---------------------------------------------------------------------------
//
//                     列表文件生成器
//
//---------------------------------------------------------------------------
#define DebugKit(str)        DebugMsg(str)

//------ 构造器 -------------------------------------------------------------
LISTFile::LISTFile(MacroAsmber& msm, const Jstring &filename)
                  : masm(msm), CurAsmLn(msm.Ln),
                    OutputFile(NULL),
                    CurTextLn(0), TknPt(NULL),Cursor(0),
                    PageLength(132), PageWidth(120),
                    LineCount(0),PageCount(0)
{ setn.symbols = true;
  setn.Xref    = true;
  setn.List    = true;
  setn.Gen     = true;
  setn.LastOK  = true;
  setn.SrcEnd  = false;
  setn.InMacro = false;

  FileName = filename + ".lst";
     Title = filename;
  struct date dea; getdate(&dea);
  jdate.year = dea.da_year; jdate.month = dea.da_mon; jdate.day = dea.da_day;
} // end constructor
//---------------------------------------------------------------------------



//---------------------------------------------------------------------------
// 如果LastOK为真,产生一个右栏上的源文本。
// LastOK不为真,只产生一个换行。
// 操作对象是CurAsmLn。不改变CurAsmLn。
// 用到的变量:LastOK, Cursor(!), CurAsmLn, CurTextLn(!).
//---------------------------------------------------------------------------
void LISTFile::GenSrcText()
{ if(CurAsmLn->NestNo > 0 && !setn.Gen) { return; } // endif
  if(setn.LastOK)   // 新行
   { TABtheSRC(OutputFile, Cursor);  // 宏调用。
     // Move the cursor
     if( CurAsmLn &&
            (CurAsmLn->GetNestNo() > 0 || CurAsmLn->Includ) ) // In Macro...
      { fprintf(OutputFile,"%5d+%-2d %s",CurTextLn-1,
                CurAsmLn->GetNestNo(),(const char*)CurAsmLn->head->Name);
      } // endif
     else
      { if(masm.AsmFn->FileEnd())
         { setn.SrcEnd = true; } // endif
        else
         { fprintf(OutputFile,"%5d    %s",CurTextLn, masm.AsmFn->ReadALine());
           ++CurTextLn;
         } // end else
      } // end else
   } // endif
  // LastOK = false, 换行。
 // putc('\n',OutputFile);
} // end GenSrcText
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
#define InstCodeDo();                                                           \
           PRLineLOC(OutputFile,Cursor,CurAsmLn->lc);                           \
           for(register int8u i = 0; i < CurAsmLn->len; ++i)                    \
            { fprintf(OutputFile,"%2.2X",TknPt->D4ary->dat[i]);                 \
              Cursor += 2;                                                      \
            }                                                                   \
           if(TknPt->D4ary->Fix) { PRFixChar(OutputFile,Cursor); }
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
#define EQUValueShow();                                                         \
       if(TknPt->LabPt->getTyp() != LB_REG)                                     \
        { fprintf(OutputFile," (%4.4X)", (int16u)TknPt->LabPt->Value);          \
          Cursor += 7;                                                          \
          for( ; Cursor < 10; ++Cursor) { putc(' ',OutputFile); }               \
          fprintf(OutputFile, TknPt->LabPt->LabelTypeStr() ); Cursor += 6;      \
        }                                                                       \
       else                                                                     \
        { fprintf(OutputFile, TknPt->LabPt->LabelTypeStr() ); Cursor += 6;      \
          for( ; Cursor < 12; ++Cursor) { putc(' ',OutputFile); }               \
          fprintf(OutputFile,"REG"); Cursor += 3;                               \
        }
//---------------------------------------------------------------------------
#define DBCodeListPrint(tp,pt,cur,Ln);                                          \
    int16u i = 0; bool f = false; bool pr = true;                               \
    for(pt = pt->next; pt; pt = pt->next)                                       \
    { switch(pt->Token)                                                         \
      { case StrDataKn :     case LongCharn :                                   \
           { JdatBlock &bk = *(pt->DatPt);                                      \
             register const int8u* p = (const char*)(bk);                       \
             for(int8u c = 0; c<(bk).GetLen(); c++ )                            \
              { if(i%4==0)                                                      \
                { if(!pr) { cur = 1; putc('\n',tp); }                           \
                  PRLineLOC(tp,cur,(Ln->lc+i)); }                               \
                fprintf(tp,"%2.2X",*p++); cur += 2; i++;                        \
                if(i%4==0)                                                      \
                 { if(f) { PRFixChar(tp,cur); f = false; }                      \
                   if(pr) { GenSrcText(); pr = false; }                         \
                 }                                                              \
              }                                                                 \
             break;                                                             \
           }                                                                    \
        case ObjcodeKn :                                                        \
           { if(i%4==0)                                                         \
              { if(!pr) { cur = 1; putc('\n',tp); }                             \
                PRLineLOC(tp,cur,(Ln->lc+i)); }                                 \
             fprintf(tp,"%2.2X",pt->D4ary->dat[0]); cur += 2; i++;              \
             if(pt->D4ary->Fix) { f = true; }                                   \
             if(i%4==0)                                                         \
              { if(f) { PRFixChar(tp,cur); f = false; }                         \
                if(pr) { GenSrcText(); pr = false; }                            \
              }                                                                 \
             break;                                                             \
           }                                                                    \
        default : { EThrows(printf("\nWrong list!"); Waitkey;); }               \
      }                                                                         \
    }                                                                           \
    if(i<4 && f) { PRFixChar(tp,cur); }                                         \
    if(pr) { GenSrcText(); }                                                    \
//---------------------------------------------------------------------------
// pt->Token == DWObjCode
//---------------------------------------------------------------------------
#define DWobjCodePrint();                                                       \
    fprintf(OutputFile,"%2.2X%2.2X     ",TknPt->D4ary->dat[0],                  \
                                         TknPt->D4ary->dat[1]);                 \
    Cursor += 9;                                                                \
    if(TknPt->D4ary->Fix) { PRFixChar(OutputFile,Cursor); }
//---------------------------------------------------------------------------
#define DWCodeListPrint();                                                      \
    PRLineLOC(OutputFile,Cursor,CurAsmLn->lc);                                  \
    TknPt = TknPt->next;                                                        \
    DWobjCodePrint();                                                           \
    GenSrcText();                                                               \
    TknPt = TknPt->next;                                                        \
    for(int16u i = 2; TknPt; TknPt = TknPt->next)                               \
    { Cursor = 1; putc('\n',OutputFile);                                        \
      fprintf(OutputFile,"%4.4X  ",CurAsmLn->lc +i);                            \
      Cursor += 6; i += 2;                                                      \
      DWobjCodePrint(); }
//---------------------------------------------------------------------------
#define IFinMacro();                                                            \
          if(setn.InMacro) { fprintf(OutputFile,"   |"); Cursor += 4; }
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// 显示一个汇编行的左栏
// 输入:当前汇编行指针CurAsmLn。   LastOK      Cursor    TknPt
// 返回false表示遇到END。否则返回true。
// CurAsmLn不能为空!
//---------------------------------------------------------------------------
bool LISTFile::GenALeftLine()
{ if(masm.AsmFn->runCount < 3) { return true; } // endif
  if(CurAsmLn->NestNo > 0 && !setn.Gen) { return true; } // endif
  if(CurAsmLn->HeadToken()== MacroCTRLn) { return true; } // endif

  if(CurAsmLn->Unsm)     // 如果该行不被汇编的话
   { fprintf(OutputFile,"         ;; "); Cursor +=12; return true; } // endif

  TknPt = CurAsmLn->FirstTkn();
  if(TknPt != NULL)      // 该汇编行不是空行
   { switch(TknPt->Token)
     { case InstCode   : { InstCodeDo(); break; } // end case
       case DBObjCode  : { DBCodeListPrint(OutputFile,TknPt,Cursor,CurAsmLn);
                           return false; } // end case
       case DWObjCode  : { DWCodeListPrint();
                           return false; } // end case
       case EQUsDefken : // 同下。
       case BITsDefken : // 同下。
       case CODEDefKen : // 同下。
       case DATADefKen : // 同下。
       case XDATADefKn : // 同下。
       case SETsDefken : // 同下。
       case IDATADefKn : { EQUValueShow(); break; } // end case

       case    CSEG    : // 同下。
       case    DSEG    : // 同下。
       case    ISEG    : // 同下。
       case    XSEG    : // 同下。
       case    BSEG    : // 同下。
       case    ORG     : { fprintf(OutputFile,"%4.4X  ----", TknPt->Token2);
                           Cursor += 10; break; } // show addr
       case    DS      : // 同下。
       case    DBIT    : { PRLineLOC(OutputFile,Cursor,CurAsmLn->lc);
                           break; } // LOC
       case    RSEG    : { fprintf(OutputFile,"----  ----");
                           Cursor += 10; break; } // end case
       case    END     : { fprintf(OutputFile,"%4.4X", CurAsmLn->lc);
                           Cursor += 4;
                           return true; // It means file is ended.
                         } // end case
       case MacroDefkn : case ReptDefkn: case IRPTkn: case IRPCTkn:
                         { fprintf(OutputFile," --Macro--"); Cursor += 10;
                           setn.InMacro = true;
                           break; } // end case

       case ENDMTkn    : { fprintf(OutputFile," --EndM--"); Cursor += 9;
                           setn.InMacro = false;
                           break; } // end case
       case SEGMTDefkn : { fprintf(OutputFile,"--SegDef--");
                           Cursor += 10; break; } // end case
       case PseudoWord : { break; } // end case

       case MroCalling : { PRLineLOC(OutputFile,Cursor,CurAsmLn->lc);
                           fprintf(OutputFile,"[Macro]"); Cursor += 7;
                           break;
                         } // end case

       case IF_Kn :   case ELSEIF_Kn :
        { fprintf( OutputFile," (%04X) %s/%02u",
                   TknPt->Token2, TknPt->Token2 ? "True ":"False",
                   TknPt->loc[1] );
          Cursor += 16; break;
        } // end case
       case ELSE_Kn:
        { fprintf( OutputFile,"        %s/%02u",
                   TknPt->Token2 ? "False":"True ",
                   TknPt->loc[1] );
          Cursor += 16; break;
        } // end case
       case ENDIF_Kn:
        { fprintf( OutputFile,"        -%%%%- /%02u", TknPt->loc[1] );
          Cursor += 16; break;
        } // end case
       default : { IFinMacro(); } // end default

⌨️ 快捷键说明

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