📄 objmodule_h.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 + -