📄 labelmaniger_c.cpp
字号:
//---------------------------------------------------------------------------
// 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 + -