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

📄 labelmaniger_c.cpp

📁 MCS51单片机的宏汇编器源程序。有需要的朋友请下载!
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//---------------------------------------------------------------------------
//  err = BadRelExp         (x)
//  err = IllExpTypOp       (x)
//---------------------------------------------------------------------------
ERR LabelManager::OPAdd(TriVal &a, TriVal &b, TriVal &c)
{      ifRel( 'A', 'A' ) { c.rel = 'A'; c.rseg = NULL; } // endif
  else ifRel( 'A', 'R' ) { c.rel = 'R'; c.rseg = b.rseg; } // endif
  else ifRel( 'R', 'A' ) { c.rel = 'R'; c.rseg = a.rseg; } // endif
  else ifRel( 'E', 'A' ) { c.rel = 'E'; c.ExtID = a.ExtID; } // endif
  else ifRel( 'A', 'E' ) { c.rel = 'E'; c.ExtID = b.ExtID;; } // endif
  else { masm.OutputErr(BadRelExpErr); return BadRelExp; } // endif

       ifTypNum( ==, ==) { c.typ = LB_NUM; } // endif
  else ifTypNum( ==, !=) { c.typ = b.typ; }  // endif
  else ifTypNum( !=, ==) { c.typ = a.typ; }  // endif
  else      //ifTypNum( !=, !=)
   { if(a.typ == LB_REG && b.typ == LB_REG) // 寄存器运算
      { if(a.val == _A && b.val == _DPTR)
         { c.typ = LB_REG; c.val = _A_DPTR; return OK_no_Err; } // endif
        if(a.val == _A && b.val == _PC)
         { c.typ = LB_REG; c.val = _A_PC;   return OK_no_Err; } // endif
      } // endif 寄存器运算
     masm.OutputErr(IllTypExpErr); return IllExpTypOp;
   } // end else

  c.val = a.val + b.val;
  return OK_no_Err;
} // end OPAdd
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
//  A - A = A,                  N - N = N
//  A - R = Error!              N - ? = Error!
//  R - A = R,                  C - N = C, D - N = D, B - N = B,  ...
//  R - R = A.(same seg)        ? - ? = N.(same typ)
//---------------------------------------------------------------------------
//  err = BadRelExp          (x)
//  err = IllExpTypOp        (x)
//---------------------------------------------------------------------------
ERR LabelManager::OPSub(TriVal &a, TriVal &b, TriVal &c)
{      ifRel( 'A', 'A' ) { c.rel = 'A'; c.rseg = NULL; } // endif
  else ifRel( 'R', 'A' ) { c.rel = 'R'; c.rseg = a.rseg; } // endif
  else ifRel( 'R', 'R' )
        { if( IsSameSeg(a,b) )
           { c.rel = 'A'; c.rseg = NULL; } // endif
          else
           { masm.OutputErr(BadRelExpErr); return BadRelExp; } // end else
        } // endif
  else ifRel( 'E', 'A' ) { c.rel = 'E'; c.ExtID = a.ExtID; } // endif
  else { masm.OutputErr(BadRelExpErr); return BadRelExp; } // endif

       ifTypNum( ==, ==) { c.typ = LB_NUM; } // endif
  else ifTypNum( ==, !=)
       { masm.OutputErr(IllTypExpErr); return IllExpTypOp; }  // endif
  else ifTypNum( !=, ==) { c.typ = a.typ; }  // endif
  else       // ifTypNum( !=, !=)
   { if( IsSameTyp(a,b) )
      { c.typ = LB_NUM; } // endif
     else
      { masm.OutputErr(IllTypExpErr); return IllExpTypOp; } // end else
   } // endif

  c.val = a.val - b.val; return OK_no_Err;
} // end OPSub
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
//  A * A = A,                  N * N = N
//  A * R = Error!              N * ? = Error!
//  R * A = Error!              ? * N = Error!
//  R * R = Error!              ? * ? = Error!
//---------------------------------------------------------------------------
//  err = BadRelExp            (x)
//  err = IllExpTypOp          (x)
//---------------------------------------------------------------------------
ERR LabelManager::OPMul(TriVal &a, TriVal &b, TriVal &c)
{ ifRel( 'A', 'A' ) { c.rel = 'A'; c.rseg = NULL; } // endif
  else { masm.OutputErr(BadRelExpErr); return BadRelExp; } // end else

  ifTypNum( ==, ==) { c.typ = LB_NUM; } // endif
  else { masm.OutputErr(IllTypExpErr); return IllExpTypOp; } // end else

  c.val = a.val * b.val; return OK_no_Err;
} // end OPMul
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
//  A / A = A,                  N / N = N
//  A / R = Error!              N / ? = Error!
//  R / A = Error!              ? / N = Error!
//  R / R = Error!              ? / ? = Error!
//---------------------------------------------------------------------------
//  err = BadRelExp               (x)
//  err = IllExpTypOp             (x)
//  err = DividedByZero           (x)
//---------------------------------------------------------------------------
ERR LabelManager::OPDiv(TriVal &a, TriVal &b, TriVal &c)
{ ifRel( 'A', 'A' ) { c.rel = 'A'; c.rseg = NULL;} // endif
  else { masm.OutputErr(BadRelExpErr); return BadRelExp; } // end else

  ifTypNum( ==, ==) { c.typ = LB_NUM; } // endif
  else { masm.OutputErr(IllTypExpErr); return IllExpTypOp; } // end else

  if(b.val)     // (b.val != 0)
   { c.val = a.val / b.val; return OK_no_Err; } // endif
  else          // (b.val == 0)
   { masm.OutputErr(DividerIsZeroErr); return DividedByZero; } // end else
} // end OPDiv
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
//  A % A = A,                  N % N = N
//  A % R = Error!              N % ? = Error!
//  R % A = Error!              ? % N = Error!
//  R % R = Error!              ? % ? = Error!
//---------------------------------------------------------------------------
//  err = BadRelExp             (x)
//  err = IllExpTypOp           (x)
//  err = DividedByZero         (x)
//---------------------------------------------------------------------------
ERR LabelManager::OPMod(TriVal &a, TriVal &b, TriVal &c)
{ ifRel( 'A', 'A' ) { c.rel = 'A'; c.rseg = NULL; } // endif
  else { masm.OutputErr(BadRelExpErr); return BadRelExp; } // end else

  ifTypNum( ==, ==) { c.typ = LB_NUM; } // endif
  else { masm.OutputErr(IllTypExpErr); return IllExpTypOp; } // end else

  if(b.val)     // (b.val != 0)
   { c.val = a.val % b.val; return OK_no_Err; } // endif
  else          // (b.val == 0)
   { masm.OutputErr(DividerIsZeroErr); return DividedByZero; } // end else
} // end OPMod
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
//  A . A = A,                  N . N = Error!
//  A . R = Error!              N . ? = Error!
//  R . A = R.A, ??             ? . N = BIT (bit typ)
//  R . R = Error!              ? . ? = Error!
//---------------------------------------------------------------------------
//  err = BadRelExp              (x)
//  err = IllExpTypOp            (x)
//  err = BitAddrOutRange        (x)
//---------------------------------------------------------------------------
ERR LabelManager::OPDot(TriVal &a, TriVal &b, TriVal &c)
{      ifRel( 'A', 'A' ) { c.rel = 'A'; c.rseg = NULL; } // endif
  else ifRel( 'R', 'A' ) { masm.OutputErr(BadRelExpErr); return BadRelExp; } // endif
  else { masm.OutputErr(BadRelExpErr); return BadRelExp; } // end else

  ifTypNum( !=, ==) { c.typ = LB_BIT; } // endif
  else ifTypNum( == ,==) { c.typ = LB_BIT; } // endif
  else { masm.OutputErr(IllTypExpErr); return IllExpTypOp; } // end else

  if( not8bit(a.val) || not3bit(b.val) )
   { masm.OutputErr(BitAddrOutRangeErr); return BitAddrOutRange; } // 位数据越界。

  register int8u cc = a.val;    // 截去高位
  if( cc >= 0x80 ) { c.val = (cc & 0xf8) + b.val; } // endif
  else             { c.val = ((cc - 0x20)<<3) + b.val; } // end else
  return OK_no_Err;
} // end OPDot
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// 输入时tp指向一个Label。如果tp所指向的Label是Public,返回tp。
// 否则,移动tp,使其指向一个Public的Label, 返回tp。失败返回NULL。
//---------------------------------------------------------------------------
JLabelNode* LabelManager::GetAPublicLabel(JLabelNode* &tp)
{ for( ; tp && !tp->IsPublic(); tp = tp->next ); // end for
  return tp;
} // end GetASegLabel
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 输入时tp指向一个Label。如果tp所指向的Label不是Public,返回tp。
// 否则,移动tp,使其指向一个Local的Label, 返回tp。失败返回NULL。
//---------------------------------------------------------------------------
JLabelNode* LabelManager::GetALocalLabel(JLabelNode* &tp)
{ for( ; tp && tp->IsPublic(); tp = tp->next ); // end for
  return tp;
} // end GetALocalLabel
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
ERR LabelManager::LabelFresh()     // 整理标号
{ for( register JLabelNode* tp = head->next; tp; tp = tp->next )
   { if( !tp->vv.ValOk && tp->vv.Indirect )
      { tp->SetValue(tp->LnPt->lc); } // endif

     if(tp->RefSeg == NULL)
      { tp->RefSeg = masm.JModulePt->SegDefHead; } // endif

     if(tp->vv.LBLTyp == LB_SEG)
      { tp->SetValue(tp->RefSeg->SegSize); } // endif

     // others??

   } // end for
  return OK_no_Err;
} // end LabelFresh
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 根据创建顺序对标号排序。在显示时才用,计算时不能用。
// 调用后,该链将不能用于计算。链中节点的个数值也不准确。tail失去意义。
//---------------------------------------------------------------------------
void LabelManager::SortLabelByCrno()
{ JLabelNode* old = head->next;
  head->next = NULL; tail = head; // Now, the linklist is empty again.

  register JLabelNode* cur;
  register JLabelNode* nxt;
  for( cur = old;
           cur != NULL;
               cur = nxt ) // 遍历整条链
   { //..................................................
     nxt = cur->next;  // 暂存
     register JLabelNode* tp;
     if( !SearchLinkList(cur->LName, tp) ) // 如果在新表中找不到该变量...
      { // 这就说明新表中不存在与它重复的标号
        cur->next = head->next; head->next = cur; // 从表头插入
      } // endif
     //..................................................
   } // end for
} // end SortLabelByCrno
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void LabelManager::ShowLabelList()
{ printf("\nName            Type  Value  atrb   References");
  printf("\n-----------------------------------------------------");

  JLabelNode* pt = head;  // SearchLinkList("CY",pt);
  int8u cc = 0;
  for( pt = pt->next; pt; pt = pt->next )
   { pt->Show();
     if((++cc)%16==0) { Waitkey; } // endif
   } // endfor
} // end ShowLabelList
//---------------------------------------------------------------------------


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

⌨️ 快捷键说明

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