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

📄 masmber_c3.cpp

📁 MCS51单片机的宏汇编器源程序。有需要的朋友请下载!
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#define IF_do();                                                                \
          if( Tkn_IF_Do(pt) ) { err = ErrInIfElseS; }
//---------------------------------------------------------------------------
#define ELSEIF_do();                                                            \
          if( Tkn_ELSEIF_Do(pt) ) { err = ErrInIfElseS; }
//---------------------------------------------------------------------------
#define ELSE_do();                                                              \
          Ln->Enable = false;                                                   \
          pt->Token  = ELSE_Kn;                                                 \
          pt->loc[1] = IfElseNest;                                              \
          pt->Token2 = IfStack.getB();                                          \
          if(IfElseNest <= IfStack.getSP())                                     \
           { IfStack.settop(false, (bool)pt->Token2); }
//---------------------------------------------------------------------------
//       Ln->Enable = false;
//       pt->Token  = ELSE_Kn; // Token升级!
//       pt->loc[1] = IfElseNest; // 暂存IF语句的嵌套层数
//       pt->Token2 = IfStack.getB();   // 表达式的真值。
//       if(IfElseNest <= IfStack.getSP()) // 如果ELSE确实是属于本层的
//        { IfStack.settop(false, (bool)pt->Token2); } // endif
//---------------------------------------------------------------------------
#define ENDIF_do();                                                             \
          Ln->Enable = false;                                                   \
          pt->Token  = ENDIF_Kn;                                                \
          pt->loc[1] = IfElseNest;                                              \
          IfElseNest_dec(err);                                                  \
          if(err) { return ErrInIfElseS; }                                      \
          if(IfElseNest < IfStack.getSP()) { IfStack.pop(); }
//---------------------------------------------------------------------------
//       Ln->Enable = false;
//       pt->Token  = ENDIF_Kn;  // Token升级!
//       pt->loc[1] = IfElseNest; // 暂存IF语句的嵌套层数
//       if(IfElseNest_dec()) { return ErrInIfElseS; } // endif
//       if(IfElseNest < IfStack.getSP())
//        { IfStack.pop(); } // endif   把top值丢弃。
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 遇到PUBLIC指令,把其后的单词表中的标号常量找到,并置PUBLIC标志。
//---------------------------------------------------------------------------
void MacroAsmber::PublicKn_do(ERR &err, Tokenfield* pt)
{ Ln->Enable = false;
  pt = pt->next;
  for( pt = pt->ExpPt; pt != NULL; pt = pt->next )
   { JLabelNode* tp = LabMger->SearchLabelCal(pt->Name, err, NULL);
     if(err)
      { if(err == LabNotReady) { err = OK_no_Err; } // endif
        else                   { err = ErrInPublicDef; return; }
      } // endif
     tp->SetPublic();
   } // end for
} // PublicKn_do
//---------------------------------------------------------------------------

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

//---------------------------------------------------------------------------
// 遇到NAME指令,判断名字长度是否在40字符之内。修改模块名字,然后禁用该行。
//---------------------------------------------------------------------------
#define NameModuleDo();                                                         \
        Ln->Enable = false; pt = pt->next;                                      \
        if(pt->Name.getLen() > 40)                                              \
         { OutWarning(LBLTooLongWarn); pt->Name.Trunc(40); }                    \
        JModulePt->SetName(pt->Name);
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 遇到常量定义,将其添加到标号表中。并将该汇编行禁用。
//---------------------------------------------------------------------------
#define AddConstThenDisIt(typ);                                                 \
         if(AddLabelThenDis(pt,typ,Constant_)) { err = ErrInAddLabel; }
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 遇到变量定义,将其添加到标号表中。但保留它在汇编行里。
//---------------------------------------------------------------------------
#define SetVarThenKeepIt(typ);                                                  \
         if(SetVarLabel(pt,typ,Variable_)) { err = ErrInSetLabel; }
//---------------------------------------------------------------------------
#define TknIsORGDoSth();                                                        \
         if( TknIsORGDo(pt) ) { err = ErrInORGset; }
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
#define PASS2DOSth(str);                                                        \
        if(Pass_1) { break; } else { str }
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// pt->Token = PseudoWord
//---------------------------------------------------------------------------
ERR MacroAsmber::PWordMeaningAct(Tokenfield* pt)
{ ERR err = OK_no_Err;
  switch(pt->Token2)
  { case EQUsDefken: { AddConstThenDisIt(LB_NUM);   break; }         // Pass1&2
    case BITsDefken: { AddConstThenDisIt(LB_BIT);   break; }         // Pass1&2
    case CODEDefKen: { AddConstThenDisIt(LB_CODE);  break; }         // Pass1&2
    case DATADefKen: { AddConstThenDisIt(LB_DATA);  break; }         // Pass1&2
    case XDATADefKn: { AddConstThenDisIt(LB_XDATA); break; }         // Pass1&2
    case IDATADefKn: { AddConstThenDisIt(LB_IDATA); break; }         // Pass1&2
    case SETsDefken: {  SetVarThenKeepIt(LB_NUM);   break; }         // Pass1

    case RSEG: { if(TknIsRSEG_Do(pt)) {err = ErrInRSEGset;} break; } // Pass1&2
    case CSEG: { if(TknIsCSEG_Do(pt)) {err = ErrInCSEGset;} break; } // Pass1&2
    case DSEG: { if(TknIsDSEG_Do(pt)) {err = ErrInDSEGset;} break; } // Pass1&2
    case XSEG: { if(TknIsXSEG_Do(pt)) {err = ErrInXSEGset;} break; } // Pass1&2
    case ISEG: { if(TknIsISEG_Do(pt)) {err = ErrInISEGset;} break; } // Pass1&2
    case BSEG: { if(TknIsBSEG_Do(pt)) {err = ErrInBSEGset;} break; } // Pass1&2

    case DB  : { TknIsDBDoSth(pt);   break; } // end case            // Pass1
    case DW  : { TknIsDWDoSth(pt);   break; } // end case            // Pass1
    case DS  : { pt->Token = pt->Token2; TknIsDSDoSth(pt); break; }  // Pass1
    case DBIT: { pt->Token = pt->Token2; TknIsDBITDoSth(pt);break;}  // Pass1
    case ORG : { pt->Token = pt->Token2; TknIsORGDoSth();  break; }  // Pass1

    case    IF_Kn : { IF_do();    break; } // end case               // Pass1
    case ENDIF_Kn : { ENDIF_do(); break; } // end case               // Pass1
    case ELSE_Kn  : { ELSE_do();  break; } // end case               // Pass1
    case ELSEIF_Kn: { ELSEIF_do();break; } // end case               // Pass1

    case NAMEToKn: { NameModuleDo(); break; } // end case            // Pass1
    case USINGTkn: { pt->Token = pt->Token2; USING_do(); break; }    // Pass1
    case PUBLICKn: { PASS2DOSth(PublicKn_do(err, pt);); break; }            // Pass2

    default: { EThrows(printf("\nPWordMeaningAct out of run!"); Debugkey;);
             } // end default
  } // end switch(pt->Token2)

  return err;
} // end PWordMeaningAct
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
#define ErrInOperands  1
#define ErrInOperator  2
//---------------------------------------------------------------------------
// 遇到机器指令的动作。识别出该指令,找到它对应的描述,确定指令的长度。
// This work is done in Pass1 & 2.
//---------------------------------------------------------------------------
ERR MacroAsmber::ReservInstDo(Tokenfield* pt)
{ ERR err;
  OPset* opset = FindResvInstOPset(pt, err); // 得到opset指针, err带值返回。
  if(err)           // 操作数发生错误, GetDataType()找不到对应的寻址模式.
   { return ErrInOperands; } // endif
  if(opset == NULL) // 操作码发生错误
   { OutputErr(InstrctSyntaxErr); return ErrInOperator; } // endif
  // 操作码正确
  // 有可能的话,做一些优化。(SJMP, AJMP, LJMP, ACALL, LCALL)
  if(opset->act1 == JJudge) { RecgJMPandCALL(pt->next, opset); } // endif
  // 已设置好opset, opset带值返回。

  SegPt->SegLc += opset->len;   // 段计数器增加

  if(Pass_2)
   { pt->Token = KnownInst;           // Token进化
     pt->Opset = opset;               // Token->Value域保存opset指针
   } // endif

  return OK_no_Err;                // 正确返回
} // end ReservInstDo
//---------------------------------------------------------------------------







/*
ERR MacroAsmber::ReservInstDo(Tokenfield* pt)
{ ERR err;
  register OPset* opset = FindResvInstOPset(pt, err); // 得到opset指针, err带值返回。
  if(err)           // 操作数发生错误, GetDataType()找不到对应的寻址模式.
   { return ErrInOperands; } // endif
  // 操作数正确
  if(opset == NULL) // 操作码发生错误
   { OutputErr(InstrctSyntaxErr); return ErrInOperator; } // endif
  // 操作码正确
  // 有可能的话,做一些优化。(SJMP, AJMP, LJMP, ACALL, LCALL)
  if(opset->act1 == JJudge) { RecgJMPandCALL(pt->next, opset); } // endif
  // 已设置好opset, opset带值返回。
  pt->Token = OPsetInst;           // Token进化
  pt->Opset = opset;               // Token->Value域保存opset指针
  SegPt->SegLc += opset->len;      // 段计数器增加
  return OK_no_Err;                // 正确返回
} // end ReservInstDo
//---------------------------------------------------------------------------
*/

//---------------------------------------------------------------------------
// 遇到机器指令的动作。识别出该指令,找到它对应的描述,确定指令的长度。
// This work is done in Pass2.
//---------------------------------------------------------------------------
inline ERR MacroAsmber::OPsetInstDo(Tokenfield* pt)
{ // 有可能的话,做一些优化。(SJMP, AJMP, LJMP, ACALL, LCALL)
  if(pt->Opset->act1 == JJudge) { RecgJMPandCALL(pt->next, pt->Opset); } // endif
  // 已设置好opset, opset带值返回。
  pt->Token = KnownInst;           // Token进化
  SegPt->SegLc += pt->Opset->len;  // 段计数器增加
  return OK_no_Err;                // 正确返回
} // end OPsetInstDo
//---------------------------------------------------------------------------

#define AddrInPage(x)              ((x) >= -128 && (x) <= 127)
#define AddrInBlock(x)             ((x) >= -1024 && (x) <= 1023)
//---------------------------------------------------------------------------
// 把可以简化的JMP和CALL改成简化形式。(SJMP, AJMP, LJMP; ACALL, LCALL)。
// 注意:pt指向操作数(Operand)。 opset带值返回。
//---------------------------------------------------------------------------
void MacroAsmber::RecgJMPandCALL(Tokenfield* pt, OPset* &opset)

⌨️ 快捷键说明

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