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

📄 masmber_c4.cpp

📁 MCS51单片机的宏汇编器源程序。有需要的朋友请下载!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  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 + -