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

📄 asmf_h.h

📁 MCS51单片机的宏汇编器源程序。有需要的朋友请下载!
💻 H
字号:
//---------------------------------------------------------------------------
//-------- AsmF_H.h ---------------------------------------------------------
//---------------------------------------------------------------------------
#ifndef	AsmF_H.h  // 防止被重复引用
#define AsmF_H.h
//---------------------------------------------------------------------------
#include <stdio.h>
#include "AsmL_H.h"
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
const int16u LineReadBufferSize = 256;
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
//
//              汇编文件类,专门管理asm文件的内部存储结构。
//
//---------------------------------------------------------------------------
class AsmFile : public JObject
{ private:
    MacroAsmber& masm;    // parent

    AsmLine* Head;        // 汇编行链头
    AsmLine* Tail;        // 汇编行链尾

       FILE* FilePt;      // 文件指针, 指向汇编源文件。
     Jstring FileName;    // asm源文件文件名
     int8u runCount;      //

      bool CommentEnable; // 注释启用(如果注释开启,
                          //           汇编器将忽略当前所有汇编行,
                          //           直到它被重新设置为关闭。)

    int32u FileLineSum;   // 文件汇编行的总数
    char buff[LineReadBufferSize]; // 读缓冲区的指针,缓冲区由内部分配获得。

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

  public:

     AsmFile(MacroAsmber& msm, const Jstring& filename); // constructor
    ~AsmFile();                                           // destructor

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

     void  Open();               // 打开文件

     void  Close();              // 关闭文件

     char* ReadALine();          // 从文件中读入一行到缓冲区,返回缓冲区指针。

     bool  FileEnd()              { return feof(FilePt); }

       AsmLine* FirstLine()         { return Head->next; }

     void  AddEndLine();              // 添加“END”汇编行。

     void  AddAsmLine(AsmLine* line); // 往汇编文件中添加一条汇编行。

     void  InsertAsmLine(AsmLine* line, AsmLine* from);

     int16u& ErrorSum()           { return Head->head->loc[0]; } //

     int16u& WarningSum()         { return Head->head->loc[1]; } //

     void  AddErr(int16u lineNo, ERR errNo);

     void  AddWarn(int16u lineNo, ERR warnNo);

     // 返回指向第一个错误或警告的指针。
     Tokenfield* FirstErrWarnPt() { return Head->head->next; } //

  //------- debug functions ---------
     void ShowFileToken();

  //------- friend members ----------
    friend class MacroAsmber;
    friend class LISTFile;
    friend class OBJfile;
    friend class OBJmodule;
}; // end AsmFile
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// 以只读模式打开文件。
//---------------------------------------------------------------------------
inline void AsmFile::Open()
{ FilePt = fopen((const char*)FileName,"r"); // 给文件句柄赋值。
  if(FilePt == NULL)
   { printf("\nCannot open file %s!",(const char*)FileName); exit(1); }
  // The file has opened...
} // end Open
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// 关闭文件
//---------------------------------------------------------------------------
inline void AsmFile::Close()
{ if( fclose(FilePt) )
   { printf("\nClose file %s error.",(const char*)FileName); } // endif
} // end Close
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// 从文件中读入一行,放到缓冲区里。
//---------------------------------------------------------------------------
inline char* AsmFile::ReadALine()
{ fgets(buff, LineReadBufferSize, FilePt);
  buff[LineReadBufferSize-1]='\0';    // 缓冲区最终端填字串尾。

  register char* p = buff + strlen(buff) - 1;
  if( *p == '\n' )                // p 指向读入行最后一个字符。
   { *p = '\0'; } // endif
  return buff;
} // end ReadALine
//---------------------------------------------------------------------------
const int32u MaxFileAsmLineSum = 100000;
//---------------------------------------------------------------------------
#define FatalErrPrn       printf("\nFatal Error: Too many asm lines!");
//---------------------------------------------------------------------------
// 往汇编文件中添加一条汇编行。
//---------------------------------------------------------------------------
inline void AsmFile::AddAsmLine(AsmLine* line)
{ Tail->next = line;
  Tail = Tail->next;
  if(++FileLineSum > MaxFileAsmLineSum)
   { FatalErrPrn; exit(1); } // endif
} // end AddAsmLine
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 往汇编文件中插入一条汇编行。插在from后面。
//---------------------------------------------------------------------------
inline void AsmFile::InsertAsmLine(AsmLine* line, AsmLine* from)
{ line->next = from->next;
  from->next = line;
  if(++FileLineSum > MaxFileAsmLineSum)
   { FatalErrPrn; exit(1); } // endif
  if(Tail == from) { Tail = line; } // endif
} // end InsertAsmLine
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
inline void AsmFile::AddEndLine()
{ Tail->next = new AsmLine;
  ++FileLineSum;
  Tail->next->AddTokenfield(END, NULL, 0);
  Tail->next->LineNo = Tail->LineNo + 1;
  Tail = Tail->next;
} // end AddEndLine
//---------------------------------------------------------------------------
#undef FatalErrPrn

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

⌨️ 快捷键说明

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