📄 masmber_c4.cpp
字号:
Tokenfield* p = pt->next; // Now, s->Token==Operand.
OPset* setPt = pt->Opset; // 指令格式
int8u length = setPt->len; // 指令长度
Dat4ary& Ndatry = *new Dat4ary; // 创建新结点
Ndatry.dat[3] = length;
Ndatry.dat[0] = setPt->OPobj; // 指令目标码
TriVal Trv[3]; // 三个操作数TriVal, 来自三个Expr。
for( int8u c = 0;
p && c < 3; // conditions
p = p->next, c++ )
{ // At first, p->Token == Operand.
Tokenfield* s = p->ExpPt; // 从Operand 下降到 Expression
switch(s->Token)
{ case '#': // no breaking!
case '@': // no breaking!
case '/': s = s->next; // 指针前移
// no default!
} // end switch
// Now, s->Token==Expression
s = s->ExpPt; // 从Expression下降到Expression头
register const TriVal* tt = LabMger->CalExpression(err, s); // 给TriVal赋值
if(err) { OutputErr(WrongOperandsErr+c); return c+1; } // endif
Trv[c] = *tt;
if(Trv[c].rseg == NULL)
{ Trv[c].rseg = JModulePt->GetAbsCodeSeg(); } // endif
} // end for p & c
// 多余的Operand被忽略。
// 至此,三个TriVal(Trv[])已经设置好。
if(length > 1)
{ if(OpandAction(Ndatry, 1, Trv, setPt->act1)) { err = 4; } // 第二个字节出错
} // endif length>1
if(!err && length > 2)
{ if(OpandAction(Ndatry, 2, Trv, setPt->act2)) { err = 5; } // 第三个字节出错
} // endif length>2
TokenOper::DelOPNDList(pt->next); // 删除其后的Operand表。
pt->next = NULL;
pt->Token = InstCode; // Token的进化!!
pt->D4ary = &Ndatry; // 接入结点
return err;
} // end Translate
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 根据act,对dary的第pos个字节进行操作。Trv[]装有源数。
//---------------------------------------------------------------------------
ERR MacroAsmber::OpandAction(Dat4ary &dary, int8u pos, TriVal* trv, int8 act)
{ ERR err ;
switch(act) // 在KnownInst中,dary.dat[0]的Loc对应Ln->lc。
{ case BRef_1 : { err = OPAct_BRef_Do(Ln->lc + pos, dary, pos, trv[0]);
break; // 把第一操作数d1写入pos位置
} // end case
case BRef_2 : { err = OPAct_BRef_Do(Ln->lc + pos, dary, pos, trv[1]);
break; // 把第二操作数d2写入pos位置
} // end case
case BRef_3 : { err = OPAct_BRef_Do(Ln->lc + pos, dary, pos, trv[2]);
break; // 把第三操作数d3写入pos位置
} // end case
case Wrel_1 : { err = OPAct_Wrel_Do(Ln->lc + pos, dary, pos, trv[0]);
break; // 把第一操作数d1换成相对偏移,然后写入pos位置
} // end case
case Wrel_2 : { err = OPAct_Wrel_Do(Ln->lc + pos, dary, pos, trv[1]);
break; // 把第二操作数d2换成相对偏移,然后写入pos位置
} // end case
case Wrel_3 : { err = OPAct_Wrel_Do(Ln->lc + pos, dary, pos, trv[2]);
break; // 把第三操作数d3换成相对偏移,然后写入pos位置
} // end case
case JJudge : // 同下。
case H8L8_1 : { err = OPAct_H8L8_Do(Ln->lc + pos, dary, pos, trv[0]);
break;
} // end case
case H8L8_2 : { err = OPAct_H8L8_Do(Ln->lc + pos, dary, pos, trv[1]);
break;
} // end case
case 0 : { err = OK_no_Err; break; // 空操作
} // end case
case H3L8_0 : { err = OPAct_H3L8_Do(Ln->lc + pos, dary, trv[0]);
break;
} // end case
default : { err = Have_Errs;
EThrows(printf("\nOpandAction out of run!"); Debugkey;); // debug
} // end defualt
} // end switch
return err;
} // end OpandAction
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 由TriVal(trv)给dary的第pos个字节赋值。
//---------------------------------------------------------------------------
ERR MacroAsmber::
OPAct_BRef_Do(int16u loc, Dat4ary &dary, int8u pos, const TriVal &trv)
{ if( not8bit(trv.val) && trv.fix == 0 )
{ OutWarning(DataBeTrun8Warn); } // endif
if( dary.BytePosSettle(trv, pos, loc) )
{ DebugKit(printf("\nErr in ByteSettle.\n"); Debugkey;); // debug
return Have_Errs;
} // endif
return OK_no_Err;
} // end OPAct_BRef_Do
//---------------------------------------------------------------------------
#pragma argsused
//---------------------------------------------------------------------------
// 由TriVal(trv)给dary的第pos个字节赋rel值。
//---------------------------------------------------------------------------
ERR MacroAsmber::
OPAct_Wrel_Do(int16u loc, Dat4ary &dary, int8u pos, const TriVal &trv)
{ if( not16bit(trv.val) )
{ OutWarning(DataBeTrun16Warn); } // endif
if(trv.rseg != Ln->sgpt) // 当前汇编行所在的段
{ OutputErr(SegNotMatchErr); return Have_Errs; } // error!
int8u vval; // 供下面调用.
if(Cal_rel((int16u)trv.val, vval)) { return Have_Errs; } // error!
// 计算相对位移。
switch(trv.rel)
{ case 'A': case 'R': { dary.dat[pos] = vval; return OK_no_Err; } // end case
case 'E': { OutputErr(SegNotMatchErr); return Have_Errs; } // end case
default : { EThrows(printf("\nOPAct_WRef_Do out of run!"); Debugkey;); // debug
return Have_Errs;
} // default
} // end switch
} // end OPAct_BRef_Do
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 由TriVal(trv)给dary的第pos个字节赋WORD值。
//---------------------------------------------------------------------------
inline ERR MacroAsmber::
OPAct_H8L8_Do(int16u loc, Dat4ary &dary, int8u pos, const TriVal &trv)
{ if( not16bit(trv.val) )
{ OutWarning(DataBeTrun16Warn); } // endif
if( dary.WordPosSettle(trv, pos, loc) )
{ DebugKit(printf("\nErr in WordSettle.\n"); Debugkey;); // debug
return Have_Errs;
} // endif
return OK_no_Err;
} // end OPAct_H8L8_Do
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
inline ERR MacroAsmber::
OPAct_H3L8_Do(int16u loc, Dat4ary &dary, const TriVal &trv)
{ if( not16bit(trv.val) )
{ OutWarning(DataBeTrun16Warn); } // endif
if( dary.H3L8Settle(trv, loc) )
{ DebugKit(printf("\nErr in WordSettle.\n"); Debugkey;); // debug
return Have_Errs;
} // endif
return OK_no_Err;
} // end OPAct_H3L8_Do
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// loc和len必须预先设置好,输入str为转移地址字符串
//---------------------------------------------------------------------------
ERR MacroAsmber::Cal_rel(int16u addr,int8u &val)
{ DebugKit(printf("\nIn cal rel, addr=%xh",addr);); // debug
register int16 address = addr - Ln->lc - Ln->len;
if(address>127 || address<-128)
{ OutputErr(RelativeAddrErr); return Have_Errs; } // endif
val = (int8u)address; // 会丢弃高位
return OK_no_Err;
} // end Cal_rel
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// end MAsmber_C4.cpp
//---------------------------------------------------------------------------
// Written by JamesyFront. ZLGmcu Dev.Co.Ltd. 2002.
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -