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

📄 masmber_h.h

📁 MCS51单片机的宏汇编器源程序。有需要的朋友请下载!
💻 H
字号:
//---------------------------------------------------------------------------
//-------- MAsmber_H.h ------------------------------------------------------
//---------------------------------------------------------------------------
#ifndef	MAsmber_H.h  // 防止被重复引用
#define MAsmber_H.h
//---------------------------------------------------------------------------
#include "JsGlobal_H.h"
#include "AsmF_H.h"
#include "LabelManiger_H.h"
#include "InstSystem_H.h"
#include "TokenOper_H.h"
#include "MacroManager_H.h"
#include "ErrPrintFile_H.h"
#include "OBJfile_H.h"
#include "ListFile_H.h"
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
const int8 MaxIncFnNest  = 62; // INCLUDE文件最大嵌套层数。
const int8 MaxIfElseNest = 62; // IFELSE最大嵌套层数。
const int8 MaxMroIfNest  = 62; // $IF,$ELSE最大嵌套层数。
//---------------------------------------------------------------------------
//
//
//                             宏汇编器
//
//
//---------------------------------------------------------------------------
class MacroAsmber : public JObject
{ private:
        int  Margc;         // 外部参变数个数
      char** Margv;         // 外部参数字串数组

    union
    { struct
      { int8 MacroDefNest;   // 宏定义嵌套, 在最外层的宏之外的汇编行, 为0。
        int8 IncFnNest;      // INCLUDE文件嵌套计数。为防溢出而设(0)。
        int8 IfElseNest;     // IF、ELSE等的嵌套计数。在最外层的IF, 为0。
        int8 MroIfNest;      // $IF、$ELSE等的嵌套计数。在最外层的$IF, 为0。
      }; // end struct
      int32u NestGroup;      // 计数器组。
    }; // end union

    union
    { struct
      { bool Pass      :1;   // (true) 扫描标记
        bool ObjFile   :1;   // (true)
        bool LstFile   :1;   // (true)
        bool SFR51     :1;   // (true)
        bool ErrPrint  :1;   // (false)
        bool noCond    :1;   // (false)
        bool Dismacro  :1;   // (false)
        bool PureText  :1;   // (false) 汇编行中控制词法,控制范围在一行之内。
      }; // end struct
      int8u FlagGroup;       // 标志群
    }; // end union

    union
    { struct
      { bool da_bn :1;   bool db_bn :1;   bool ep_bn :1;   bool oj_bn :1;
        bool pl_bn :1;   bool pw_bn :1;   bool pr_bn :1;   bool sb_bn :1;
        bool xr_bn :1;   bool tt_bn :1;   bool mo_bn :1;   bool co_bn :1;
        bool ma_bn :1;   bool rb_bn :1;
      } xBn;
      int16u  ConflictBn;    // 冲突开关组(0)
    }; // end union

    class  InstSystem* Instm;     // 指令系统管理器
    class LabelManager* LabMger;   // 标号管理器
    class MacrosManager* MacroMger; // 宏管理器
    class MacroVarList* MvList;      // 条件控制标号管理器

    class  AsmFile* AsmFn;     // 当前汇编文件指针
    class  OBJfile* objFilePt; // 当前目标文件指针
    class LISTFile* LstFilePt; // 当前列表文件指针

    class   AsmLine* Ln;        // 当前汇编行指针
    class  OBJmodule* JModulePt; // 当前模块指针
    class ASM_Segment* SegPt;     // 当前段指针


     ErrPrintFile EpFile;        // 打印错误信息的文件
          Jstring Pname;         // 不带后缀名的文件名
         IFeStack IfStack;       //  IF 栈。
         IFeStack MroIfStack;    // $IF 栈。

   // -------- private functions -------------

     // ----------- Lexer ---------------

        // 把一行源文本经词法分析转化成汇编行对象。
        ERR StrLexToAsmline(char* text, AsmLine* &Ln, bool &CommEn);

        // 把一行源文本经词法分析转化成Token流。
        ERR StrToToken(char* s, bool &CommentEnable);

        // 对特别的Token作特殊处理。(左归器)
       void ActToken(int16u tokn, const Jstring& word, int32u val);

        // 从源文本中取得一个符号或符号串,返回它的Token码。
     int16u GetSymWord(char* p, Jstring &word, char* &behind);

        // 把一个word转化成Token。
        ERR NumWordToToken(Jstring &word);


     // ----------- Parser -----------------

        // 保留字语法分析器。
        ERR ResvInstParse(Tokenfield* pt);

        // 伪代码语法分析器。
        ERR PsdoWordParse(Tokenfield* pt);

        // 机器指令Token转化机。
        ERR OPsetInstDo(Tokenfield* pt);

     // --------- Macro Parser -------------

        // 汇编控制指令语法分析器。
        ERR DogCtrlParse(AsmLine* &line);

        // 首要汇编控制指令语法分析器。
        ERR MajorCtrlParse(AsmLine* &line);

        // 从字串里取得数串并转换为数值。
        ERR FetchVal(int32u &val, Jstring &str);

        // RegisterBank设置。
        ERR RegBank_Do(Jstring &str);

        // 汇编日期设置。
        ERR Date_Do(Jstring &str);

        // INCLUDE命令功能模块。
        ERR MC_Include(const Jstring& filename);

        // 遇到EXITM指令的动作。
        ERR MacroEXITM_Do(AsmLine* &Ln);

     // --------- Macro -------------

       void Case_Include_Do(ERR &err, AsmLine* &line, Tokenfield* &p);

       void Case_Reset_Do(ERR &err, Tokenfield* pt);

       void Case_Set_Do(ERR &err, Tokenfield* pt);

     // ---------- 条件汇编 ----------------

        // IF 语句表达式语法分析。
        ERR MroIF_NeedOneExpr(Tokenfield* pt);

        //
       void Case_MroIF_Do(ERR &err, Tokenfield* pt);

       void Case_MroENDIF_Do(ERR &err, Tokenfield* pt);

       void Case_MroELSE_Do(ERR &err, Tokenfield* pt);

       void Case_MroELSEIF_Do(ERR &err, Tokenfield* pt);


     // -------------- 内部函数 --------------------

        // IfElseNest计算器加一。
        void IfElseNest_inc(ERR &err);

        // IfElseNest计算器减一。
        void IfElseNest_dec(ERR &err);

        // 第二遍扫描时,跟踪当前段,当前所属段更新。
        ERR Pass2UpdateCurSeg(Tokenfield* pt, int16u &value);


     // --------- 语义分析内部函数 ------------------

        ERR AddLabelThenDis(Tokenfield* pt, int8u typ, bool var);

        ERR AddExtLabelThenDel(Tokenfield* tt);

        ERR SetVarLabel(Tokenfield* pt, int8u typ, bool var);


        ERR PWordMeaningAct(Tokenfield* pt);

        ERR TknIsORGDo(Tokenfield* pt);

        ERR ReservInstDo(Tokenfield* pt);

        ERR TknIsLabelDefknDo(Tokenfield* pt);

        ERR TknIsDSDoSth(Tokenfield* pt);

        ERR TknIsDBITDoSth(Tokenfield* pt);

        ERR TknIsRSEG_Do(Tokenfield* pt);


        ERR TknIsCSEG_Do(Tokenfield* pt);

        ERR TknIsDSEG_Do(Tokenfield* pt);

        ERR TknIsXSEG_Do(Tokenfield* pt);

        ERR TknIsISEG_Do(Tokenfield* pt);

        ERR TknIsBSEG_Do(Tokenfield* pt);

        ERR TknIsUsing_Do(Tokenfield* pt);


        ERR Tkn_IF_Do(Tokenfield* pt);

        ERR Tkn_ELSEIF_Do(Tokenfield* pt);

       void PublicKn_do(ERR &err, Tokenfield* pt);




        // 宏展开到新汇编行对象。
   AsmLine* TokenNameToNewLn(ERR &err, Tokenfield* pt);




       bool CondLineJudge(ERR &err, AsmLine* line);
        ERR CommandLineToAsmL();
      int8u GetDataType(Tokenfield* p);


       void TknIsDBDoSth(Tokenfield* pt);
       void TknIsDWDoSth(Tokenfield* pt);

     // ----------- Code Generaing -------------

        ERR OPAct_BRef_Do(int16u loc, Dat4ary &dary, int8u pos, const TriVal &trv);

        ERR OPAct_Wrel_Do(int16u loc, Dat4ary &dary, int8u pos, const TriVal &trv);

        ERR OPAct_H8L8_Do(int16u loc, Dat4ary &dary, int8u pos, const TriVal &trv);

        ERR OPAct_H3L8_Do(int16u loc, Dat4ary &dary, const TriVal &trv);

        ERR DBToDBObj(Tokenfield* pt);

        ERR DWToDWObj(Tokenfield* pt);


        ERR OpandAction(Dat4ary &dary, int8u pos, TriVal* trv, int8 act);

        ERR OpndExpTypCal(Tokenfield* pt, TriVal const* &t, int8u &ch);

     OPset* FindResvInstOPset(Tokenfield* pt, ERR &err);

        ERR Translate(Tokenfield* pt);

        ERR Cal_rel(int16u addr,int8u &val);


     // ---------- 代码优化 -----------------

       void RecgJMPandCALL(Tokenfield* pt, OPset* &opset);



    // -----------------------------------------------------------

  public:

     MacroAsmber(int argc, char** argv); // constructor

    ~MacroAsmber();                        // destructor

   // -------- public functions ----------

     ERR AssembleFile(const Jstring& FileNam);

   // ----------- Lex & Parser ------------

        // 词法分析器起点。
        ERR FileToToken();

        // 语法分析器起点。
        ERR AsmFileParse();                // Fn置初值。Ln被修改。

        // 汇编行语法分析器。(用作被AsmFileParse()调用。)
        ERR AsmLineParse(AsmLine* &line);  // Ln被修改。

   // ----------- Meaning Translation -------------

        // 语义分析器起点。
        ERR MeaningTrans();

        // 汇编行语义分析器。
        ERR AsmLineMeaningAct();

   // --------- OBJrecord Translation -------------

       void GenOBJFile();

       void ShowOBJcodeLine(const char* textbuf, int8u &state, FILE* tp);

        // 汇编行目标代码生成器。
        ERR LineToObjCode();


        ERR FileToObjCode();

       void GenListFile();

   // --------- 错误信息输出 -------------

        // 输出警告信息。
       void OutWarning(int8u warn);

        // 输出错误信息。
       void OutputErr(int8u errno);

        // 取得错误总数。
     int16u GetErrorSum()   { return AsmFn->ErrorSum(); } //

        // 取得警告总数。
     int16u GetWarningSum() { return AsmFn->WarningSum(); } //

     Jstring& GetOBJfileName() { return objFilePt->FileName; } //

     Jstring& GetLSTfileName() { return LstFilePt->FileName; } //

     Jstring& GetPname()       { return Pname; } //
     
   // ----------- 数据区 ----------------

     static class SpecialRegs SRegAddr[65]; // 特殊功能寄存器描述。

   // -------- friend menbers -----------
     friend class LabelManager;
     friend class MacrosManager;
     friend class OBJmodule;
     friend class LISTFile;

}; // end class MacroAsmber
//---------------------------------------------------------------------------


//------ 析构器 -------------------------------------------------------------
inline MacroAsmber::~MacroAsmber()
{ delete objFilePt;
  delete LstFilePt;
  delete AsmFn;
  delete JModulePt;

  delete MvList;
  delete MacroMger;
  delete Instm;
  delete LabMger;
} // destructor
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// IfElseNest计算器加一。
// 需要使用Ln。如果出错, 会在该汇编行报错。
//---------------------------------------------------------------------------
inline void MacroAsmber::IfElseNest_inc(ERR &err)
{ if(++IfElseNest > MaxIfElseNest)      // 计算器加一
   { OutputErr(IfElseNestOutErr); err = Have_Errs; } // endif
  else
   { err = OK_no_Err; } // end else
} // end IfElseNest_inc
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// IfElseNest计算器减一。
// 需要使用Ln。如果出错, 会在该汇编行报错。
//---------------------------------------------------------------------------
inline void MacroAsmber::IfElseNest_dec(ERR &err)
{ if(--IfElseNest < 0)                  // 计算器减一
   { OutputErr(ENDIFMisplaceErr); IfElseNest = 0; err = Have_Errs; } // endif
  else
   { err = OK_no_Err; } // end else
} // end IfElseNest_inc
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
#define Pass_1      Pass
#define Pass_2     !Pass
//---------------------------------------------------------------------------
#define Variable_   true
#define Constant_  false
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
#define ErrInLabelDef      1
#define ErrInAddLabel      2
#define ErrInSetLabel      3
#define ErrInORGset        4
#define ErrInExtLabel      5
#define ErrInResvInst      6
#define ErrInPublicDef     7
#define ErrInSegmentDef    8
#define ErrInRSEGset       9
#define ErrInCSEGset      10
#define ErrInDSEGset      11
#define ErrInXSEGset      12
#define ErrInISEGset      13
#define ErrInBSEGset      14
#define ErrInUsing        15
#define ErrInIfElseS      16
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
//               Written by JamesyFront.    ZLGmcu Dev.Co.Ltd.  2002.
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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