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

📄 masmber_c2.cpp

📁 MCS51单片机的宏汇编器源程序。有需要的朋友请下载!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
              default : OutputErr(ArguExcevErr); return ParseErr;               \
            }
//---------------------------------------------------------------------------
#define NeedCExpList();                                                         \
            count = TokenOper::IsCExpList(pt, err);                             \
            if(err) { OutputErr(err); return ParseErr; }                        \
            switch(count)                                                       \
            { case  0 : OutputErr(ArguInsufErr); return ParseErr;               \
              default : return ParseOK;                                         \
            }
//---------------------------------------------------------------------------
#define Need01Exp();                                                            \
                  count = TokenOper::CalExpNum(pt, err);                        \
                  if(err) { OutputErr(err); return ParseErr; }                  \
                  switch(count)                                                 \
                  { case  0 : case  1 : return ParseOK;                         \
                    default : OutputErr(ArguExcevErr); return ParseErr;         \
                  }
//---------------------------------------------------------------------------
#define NeedOneWord();                                                          \
                  count = TokenOper::CalWordNum(pt, err);                       \
                  if(err) { OutputErr(err); return ParseErr; }                  \
                  if(pt) { OutputErr(ArguExcevErr); return ParseErr; }          \
                  switch(count)                                                 \
                  { case  0 : OutputErr(ArguInsufErr); return ParseErr;         \
                    case  1 : return ParseOK;                                   \
                    default : OutputErr(ArguExcevErr); return ParseErr;         \
                  }
//---------------------------------------------------------------------------
#define NeedWordList();                                                         \
                  Tokenfield* npt = pt;                                         \
                  count = TokenOper::CalWordNum(npt, err);   /*带err值返回*/    \
                  if(err) { OutputErr(err); return ParseErr; }                  \
                  if(npt) { OutputErr(ArguExcevErr); return ParseErr; }         \
                  if(count == 0)                                                \
                   { OutputErr(ArguInsufErr); return ParseErr; }                \
                  TokenOper::WordListToToken(pt, count);                        \
                  return ParseOK;
//---------------------------------------------------------------------------
#define NeedZeroExp();                                                          \
            if(pt->next == NULL) { return ParseOK; }                            \
            else { OutputErr(ArguExcevErr); return ParseErr; }
//---------------------------------------------------------------------------
// 伪指令语法分析器。
// 要使用Ln。
//---------------------------------------------------------------------------
ERR MacroAsmber::PsdoWordParse(Tokenfield* pt)
{ ERR err = OK_no_Err; int8 count;   // 公用变量。
  switch(pt->Token2)     // Token为PseudoWord的节点,其命令字在Value中。
  { case ORG :           // ORG Parse:      ORG  ValueExpr
    case EQUsDefken:     case SETsDefken:     case BITsDefken:
    case CODEDefKen:     case DATADefKen:     case XDATADefKn:
    case IDATADefKn:     case    DS     :     case   DBIT    :
    case USINGTkn  :  { NeedOneExp(); } // end case
    case DB:    case DW:
                      { NeedCExpList(); } // end case
    case CSEG:  case DSEG:  case XSEG:  case ISEG:  case BSEG:
                      { Need01Exp(); } // end case
    case RSEG:  case NAMEToKn:
                      { NeedOneWord(); } // end case
    case PUBLICKn:    { NeedWordList(); } // end case

    case IF_Kn: case ELSEIF_Kn:
                      { if(Ln->FirstTkn() != pt)   // 一行应只有一个IF等指令。
                         { OutputErr(ExcvPswWordErr); return ParseErr; } // endif
                        NeedOneExp(); // 需要一个数值表达式。
                      } // end case
    case ENDIF_Kn:  case ELSE_Kn:
                      { if(Ln->FirstTkn() != pt)   // 一行应只有一个IF等指令。
                         { OutputErr(ExcvPswWordErr); return ParseErr; } // endif
                        NeedZeroExp(); // 不需要数值表达式。
                      } // end case
    case IFNUL_Kn:    { if(Ln->FirstTkn() != pt)   // 一行应只有一个IF等指令。
                         { OutputErr(ExcvPswWordErr); return ParseErr; } // endif
                        if(pt->next != NULL)       // IF NUL xxyy
                         { pt->Token2 = IF_Kn;
                           register Tokenfield* p = pt->next;
                           p->Token = ValueToken; p->Value = 0; p->Name.Removal();
                           TokenOper::DelnextTokenNode(p);
                         } // endif
                        else                       // IF NUL
                         { pt->Token2 = IF_Kn;
                           Ln->AddTokenfield(ValueToken, NULL, 1);
                         } // end else
                        NeedOneExp(); // 需要一个数值表达式。
                      } // end case
     // If there are more P_words, to be written here.
    default  : { OutputErr(UnkPWordErr); return ParseErr; } // end default
  } // end switch
} // end PsdoWordParse
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 汇编指令语法分析器。
//---------------------------------------------------------------------------
ERR MacroAsmber::ResvInstParse(Tokenfield* pt)
{ int8 argvsum = InstSystem::InstArgvSum( pt->Token2 );  // 取得该指令所带的操作数个数(0~3).
               //pt->show(); printf("\n Argv sum Needed = %d.",argvsum); Debugkey;
  ERR err;
  int8 count = TokenOper::CalOPadNum(pt, err);     // 获取操作数的个数
  // 对该过程中产生的错误进行解释.
  if( err ) { OutputErr(err); return ParseErr; } // endif
  // 如果没有错误, 比较所取得的操作数个数是否与规定的一致.
  if(argvsum == count)
   { //DebugMsg(cout<<"\nResvInstParse Parse ok!";) Debugkey;
     return ParseOK;     // no error
   } // endif
  // Now, 所取得的操作数个数与规定的不一致! 有错!
  if(count < argvsum) { OutputErr(ArguInsufErr); } // endif
  else                { OutputErr(ArguExcevErr); } // end else
  return ParseErr;     // have error!
} // end ResvInstParse
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
ERR MacroAsmber::MacroEXITM_Do(AsmLine* &Ln)
{ ERR err = OK_no_Err;
  Ln->Enable = false;
  Ln = Ln->next;           // Ln->next 不可能为空。
  if(Ln->NestNo > 0)
   { for( register int16u n = Ln->NestNo;
              Ln->NestNo >= n;
                  Ln = Ln->next )
     { switch(Ln->HeadToken())
       { case IF_Kn :
              { IfElseNest_inc(err);
                if(err) { return Have_Errs; } // endif
                break;
              } // end case
         case ENDIF_Kn:
              { IfElseNest_dec(err);
                if(err) { return Have_Errs; } // endif
                break;
              } // end case
         default : {} // end default
       } // end switch
       Ln->Enable = false; Ln->Unsm = true; Ln->hideln = true; // 该行不汇编。
     } // end for
   } // endif     // 上面改变了Ln!!!!!
  else // EXITM 处在最外层,出错。
   { OutputErr(MacroExitmErr); err = Have_Errs; } // end else

  return err;
} // end MacroEXITM_Do
//---------------------------------------------------------------------------

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Expression Parse:                              Priority                   *
 *     Value            = Expr          12              A   High             *
 *     Word             = Expr          12              |                    *
 *       $              = Expr          12              |                    *
 *   ( Expr )           = Expr          11              |                    *
 *     Expr.Expr        = Expr          10              |                    *
 *     NOT  Expr        = Expr           9              |                    *
 *     HIGH Expr        = Expr           8              |                    *
 *     LOW  Expr        = Expr           8              |                    *
 *     + Expr           = Expr           7              |                    *
 *     - Expr           = Expr           7              |                    *
 *   Expr * Expr        = Expr           6              |                    *
 *   Expr / Expr        = Expr           6              |                    *
 *   Expr % Expr        = Expr           6              |                    *
 *   Expr + Expr        = Expr           5              |                    *
 *   Expr - Expr        = Expr           5              |                    *
 *   Expr SHL Expr      = Expr           4              |                    *
 *   Expr SHR Expr      = Expr           4              |                    *
 *   Expr AND Expr      = Expr           3              |                    *
 *   Expr  OR Expr      = Expr           2              |                    *
 *   Expr XOR Expr      = Expr           2              |                    *
 *   Expr >= Expr       = Expr           1              |                    *
 *   Expr <= Expr       = Expr           1              |                    *
 *   Expr  = Expr       = Expr           1              |                    *
 *   Expr <> Expr       = Expr           1              |                    *
 *   Expr  < Expr       = Expr           1              |                    *
 *   Expr  > Expr       = Expr           1              V   Low              *
 *                                                                           *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *   8051 Instructions Line Parse:                                           *
 *   [ LabelDefKn ] Instructions  Operand1,Operand2[,Operand3]               *
 *   [ LabelDefKn ] Instructions [Operand1]                                  *
 *                                                                           *
 *   UnDefWord :        = LabelDefKn                                         *
 *   MOV ADD ADC XOR... = Instructions                                       *
 *                                                                           *
 *      @ A + DPTR      =  Operand         aA_DPTR                           *
 *      @ A + PC        =  Operand         aA_PC                             *
 *      @Ri (i=0~1)     =  Operand         aRi                               *
 *       Rn (n=0~7)     =  Operand         _Rn                               *
 *            DPTR      =  Operand         _DPTR                             *
 *             AB       =  Operand         _AB                               *
 *             A        =  Operand         _A                                *
 *             C        =  Operand         _C                                *
 *          / Expr      =  Operand         _bit                              *
 *          @ Expr      =  Operand                                           *
 *          # Expr      =  Operand                                           *
 *            Expr      =  Operand                                           *
 *                                                                           *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

//---------------------------------------------------------------------------
// end MAsmber_C2.cpp
//---------------------------------------------------------------------------
//               Written by JamesyFront.    ZLGmcu Dev.Co.Ltd.  2002.
//---------------------------------------------------------------------------






⌨️ 快捷键说明

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