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

📄 objmodule_h.h

📁 MCS-51单片机宏汇编器源程序,单片机初学者必看
💻 H
字号:
//---------------------------------------------------------------------------
//   OBJModule_H.h 
//---------------------------------------------------------------------------
#ifndef	OBJModule_H.h  // 防止被重复引用
#define OBJModule_H.h
//---------------------------------------------------------------------------

#include "Jstring_H.h"
#include "Tokens_H.h"
#include "AsmF_H.h"
#include "JdatBlock_H.h"
#include "OBJrecord_H.h"
#include "JLabelNode_H.h"
#include "OBJfile_H.h"
#include "Dat4ary_H.h"
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 外部变量ID号码描述结构体节点。用于OBJmodule中形成一条链表。
//---------------------------------------------------------------------------
struct ExtSymDef
{      int8u  IDBLK;   //
      int16u  ExtID;   // 外部变量的ID号码。
  JLabelNode* LabPt;   // 反映该外部变量的标号描述体(节点)指针。
   ExtSymDef* next;    // 指向下一个外部变量信息(包含ExtID)。
}; // end ExtSymDef
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// 目标模块管理器。
//---------------------------------------------------------------------------
class OBJmodule : public JObject
{ private:
    MacroAsmber& masm;       // 指向父类
    ExtSymDef* ExtSymDefHead;// 外部变量定义链头
    int16u ExtSymSum;        // 外部变量总个数
    Jstring ModuleName;      // 模块名
    int8u TRN_ID;            // 0FDH = ASM51,  0FEH = PL/M51,  0FFH = RL51
    int8u REG_MSK;           // Bit0--bank0, Bit1--bank1, Bit2--bank2, Bit3--bank3
                             // which bank is used by the module
    bool Debug;              // 标志,是否将供仿真器使用的调试信息加入到目标文件中。

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

    void LnObj_ToContentAndFix( int16u FirstSet, AsmLine* CurLn,
                      OBJrecord &ContRec, OBJrecord &FixUpRec, bool &EvenFix );

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

  public:

    AsmFile* SrcfilePt;      // 本模块所对应的ASM源文件对象指针。
    OBJfile* OBJfilePt;      // 本模块所对应的OBJ文件对象指针。

    ASM_Segment* SegDefHead; // 模块中的一系列段的段链头
    ASM_Segment* SegDefTail; // 模块中的一系列段的段链尾

    // OBJmodule* next;

  // -------- constructors ------------
     OBJmodule(MacroAsmber& m, const Jstring& Mname); // constructor

    ~OBJmodule();                                      // destructor

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

    void setUseBank(int8u n);   // 设置时用过的REG Bank

    void NoRegBank()              { REG_MSK = 0; }

    void SetDebug(bool d)         { Debug = d; }

   int8u GetRegBankUsedInfo()     { return REG_MSK; }

    ASM_Segment* GetAbsCodeSeg()  { return SegDefHead; }

    ASM_Segment* GetAbsDataSeg()  { return SegDefHead->next; }

    ASM_Segment* GetAbsXdataSeg() { return SegDefHead->next->next; }

    ASM_Segment* GetAbsIdataSeg() { return SegDefHead->next->next->next; }

    ASM_Segment* GetAbsBitSeg()   { return SegDefHead->next->next->next->next; }

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

    int16u AddExtSymDef(JLabelNode* LBpt); // 添加一个外部变量到模块中。返回SymID。

    const Jstring& GetName()             { return ModuleName; } // 得到模块名

    void SetName(const Jstring& name)   { ModuleName = name; } // 设置模块名

    ASM_Segment* AddSegment(Tokenfield &tkn); // 往模块中添加一个新段。

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

    void WriteModuleHeader();     // 写一个模块头到文件。

    void WriteModuleENDrec();     // 写一个模块尾到文件。

    void WriteScopeDefMB();       // 写一个模块ScopeDef到文件(Module Block)。

    void WriteScopeDefME();       // 写一个模块ScopeDef到文件(Module End)。

    void WriteSRCNamesRec();      // 写一个源文件名记录到文件。

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

    void WriteASegDefRec(ASM_Segment* segpt); // 写一个段定义记录。

    void WriteSegDefRecords();    // 把模块中的一系列段的段定义写到文件中。

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

    void WriteAnExtDefRec();      // 写一个外部变量定义记录。

    void WriteAPubDefRec();       // 写一个公共变量定义记录。

    void WriteDebugSegSymRec();   // 写一个DEUBG的段符号记录。

    void WriteDebugPubSymRec();   // 写一个DEUBG的公共符号记录。

    void WriteDebugLocalSymRec(); // 写一个DEUBG的局部符号记录。

    void GenDebugSymbolRecs();    // 写DEBUG的段符号,公共符号,局部符号记录。

    void WriteDebugLineNoRec(AsmLine* begin, AsmLine* end); // 写行号记录。

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

    // 写一个小节内容和Fixup记录。
    void GenContentAndFix(AsmLine* &CurLn, AsmLine* Last, int16u sgid);

    // 写一个Content三元组到文件。
    void GenContentFixLineNo(SegTriple* strp, int16u segid);

    // 写一系列Content三元组到文件。
    void GenContentFixLineNo(ASM_Segment* segp);

    // 写一堆Content三元组到文件。
    void GenContentFixLineNo();

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

    // 写一个模块到文件。
    void WriteModuleToOBJFile();

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

    void show()const;

  // ------- friend members ----------
  //friend class MacroAsmber;

}; // end OBJmodule
//---------------------------------------------------------------------------


// 在使用 OBJmodule 中,需跟踪汇编文件中的BankUsing来设置REG_MSK值。


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

⌨️ 快捷键说明

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