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

📄 masmber_c0.cpp

📁 MCS51单片机的宏汇编器源程序。有需要的朋友请下载!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  SegPt->SegLc += pt->Token2;               // 段计数器增加
  return OK_no_Err;
} // end TknIsDSDoSth
//---------------------------------------------------------------------------

#define ErrInDBITExp    1
#define ErrInDBITTyp    2
#define ErrInDBITSeg    3
//---------------------------------------------------------------------------
// DBIT指令不能计算前向参考式。
// 计算该DBIT语句占用的字节数。设置汇编行占用字节数长度,段计数器增加。
// This work is done in Pass1&2.
//---------------------------------------------------------------------------
ERR MacroAsmber::TknIsDBITDoSth(Tokenfield* pt)
{ ERR err;
  const TriVal* t = LabMger->CalExpression(err, pt->next->ExpPt);
  if(err)
   { OutputErr(ExpSyrErr); return ErrInDBITExp; } // endif
  if( t->rseg || t->typ != LB_NUM || t->rel !='A' )
   { OutputErr(ExpTypNotMatchErr); return ErrInDBITTyp; } // endif
  if(SegPt->GetSegType() != SEG_BIT )            // !!!!!
   { OutputErr(SegNotMatchErr); return ErrInDBITSeg; } // endif
  if(not16bit(t->val))
   { OutWarning(DataBeTrun16Warn); } // endif


  pt->Token2 = (int16u)(t->val);            // pt->Value = DBIT数值

  //if(SegPt->SegType != SEG_BIT)
  // { pt->Token2 = pt->Token2/8 + 1; } // endif

  SegPt->SegLc += pt->Token2;               // 段计数器增加
  return OK_no_Err;
} // end TknIsDBITDoSth
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 遇到RSEG指令,pt->Token==REG, pt->next->Name存有段名。
// This work is done both in Pass1 and Pass2.
//---------------------------------------------------------------------------
ERR MacroAsmber::TknIsRSEG_Do(Tokenfield* pt)
{ if(Pass)     // Pass1
   { JLabelNode* tp;
     if( !LabMger->SearchLabel(pt->next->Name, tp) ) // 带回tp
      { OutputErr(RSegNameErr); return Have_Errs; } // endif
     // 根据段名找到了所需段。
     SegPt = tp->RefSeg;             // 换成所选择的新段
     Ln->sgpt = SegPt;               // 设置行的所属段
   } // endif
  else         // Pass2
   { SegPt->UpdateSegSize(); // 根据SegLc更新段大小,保存上一段的最大地址
     SegPt->CloseCurrentSegTrp(Ln);  // 结束当前段的当前片.

     SegPt = Ln->sgpt;               // 换成所选择的新段
     Ln->lc = SegPt->SegLc;          // 汇编行更新地址偏移
     SegPt->AddSegTrp(Ln);           // 在新选择的新段中增加新片。

     Ln->Enable = false;             // 禁用该RSEG行
     pt->Token = pt->Token2;         // Token升级
   } // end else
  return OK_no_Err;
} // end TknIsRSEG_Do
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 在第二遍扫描时,根据pt所指向的参数表达式更新当前段(由汇编行所属段指定)。
// 所要更新的段一定要是绝对段!
// 注意,SegPt和Ln需设置好。pt可以是NULL。
// value 返回表达式的TriVal的值。
//---------------------------------------------------------------------------
ERR MacroAsmber::Pass2UpdateCurSeg(Tokenfield* pt, int16u &value)
{ SegPt->UpdateSegSize(); // 根据SegLc更新段大小,保存上一段的最大地址
  SegPt->CloseCurrentSegTrp(Ln);  // 结束当前段的当前片.

  SegPt = Ln->sgpt;               // 换成所选择的新段
  Ln->lc = SegPt->SegLc;          // 汇编行更新地址偏移

  if(pt && pt->Token == ExpresnKn)
   { DebugMsg(printf("\n Cseg has Expr...");)

     ERR err;
     const TriVal* t = LabMger->CalExpression(err, pt->ExpPt); // 带err返回。

     if(err)
      { OutputErr(ORGdataCalErr); return Have_Errs; } // endif
     if( t->typ > LB_NUM ) // (LB_NUM==5)
      { OutputErr(ExpTypNotMatchErr); return Have_Errs; } // endif
     if( t->rseg && t->rseg != SegPt )
      { OutputErr(SegNotMatchErr); return Have_Errs; } // endif
     if( t->rel != 'A' )
      { OutputErr(NotAbsAddrErr); return Have_Errs; } // endif
     if(not16bit(t->val))
      { OutWarning(DataBeTrun16Warn); } // endif

     SegPt->SegLc = (int16u)(t->val);   // 重新设置段计数器, 不产生新段
        Ln->lc = SegPt->SegLc;          // 汇编行更新地址偏移
         value = SegPt->SegLc;          // !!! value值保存偏移量!!!
   } // endif
  else
   { DebugMsg(printf("\n No cseg expr...");) } // end else

  SegPt->AddSegTrp(Ln);           // 在新选择的新段中增加新片。
  return OK_no_Err;
} // end Pass2UpdateCurSeg
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 第一次是换段,第二次是换段且改偏移值。
// This work is done both in Pass1 and Pass2.
//---------------------------------------------------------------------------
ERR MacroAsmber::TknIsCSEG_Do(Tokenfield* pt)
{ if(Pass_1)     // Pass1
   { SegPt = JModulePt->GetAbsCodeSeg();
     Ln->sgpt = SegPt;               // 设置行的所属段
     return OK_no_Err;
   } // endif
  else         // Pass2
   { Ln->Enable = false;             // 禁用该CSEG行
     pt->Token = pt->Token2;         // Token升级
     return Pass2UpdateCurSeg(pt->next, pt->Token2);
   } // end else
} // end TknIsCSEG_Do
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// This work is done both in Pass1 and Pass2.
//---------------------------------------------------------------------------
ERR MacroAsmber::TknIsDSEG_Do(Tokenfield* pt)
{ if(Pass_1)     // Pass1
   { SegPt = JModulePt->GetAbsDataSeg();
     Ln->sgpt = SegPt;               // 设置行的所属段
     return OK_no_Err;
   } // endif
  else         // Pass2
   { Ln->Enable = false;             // 禁用该CSEG行
     pt->Token = pt->Token2;         // Token升级
     return Pass2UpdateCurSeg(pt->next, pt->Token2);
   } // end else
} // end TknIsDSEG_Do
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// This work is done both in Pass1 and Pass2.
//---------------------------------------------------------------------------
ERR MacroAsmber::TknIsXSEG_Do(Tokenfield* pt)
{ if(Pass_1)     // Pass1
   { SegPt = JModulePt->GetAbsXdataSeg();
     Ln->sgpt = SegPt;               // 设置行的所属段
     return OK_no_Err;
   } // endif
  else         // Pass2
   { Ln->Enable = false;             // 禁用该CSEG行
     pt->Token = pt->Token2;         // Token升级
     return Pass2UpdateCurSeg(pt->next, pt->Token2);
   } // end else
} // end TknIsXSEG_Do
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// This work is done both in Pass1 and Pass2.
//---------------------------------------------------------------------------
ERR MacroAsmber::TknIsISEG_Do(Tokenfield* pt)
{ if(Pass_1)     // Pass1
   { SegPt = JModulePt->GetAbsIdataSeg();
     Ln->sgpt = SegPt;               // 设置行的所属段
     return OK_no_Err;
   } // endif
  else         // Pass2
   { Ln->Enable = false;             // 禁用该CSEG行
     pt->Token = pt->Token2;         // Token升级
     return Pass2UpdateCurSeg(pt->next, pt->Token2);
   } // end else
} // end TknIsISEG_Do
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// This work is done both in Pass1 and Pass2.
//---------------------------------------------------------------------------
ERR MacroAsmber::TknIsBSEG_Do(Tokenfield* pt)
{ if(Pass_1)     // Pass1
   { SegPt = JModulePt->GetAbsBitSeg();
     Ln->sgpt = SegPt;               // 设置行的所属段
     return OK_no_Err;
   } // endif
  else         // Pass2
   { Ln->Enable = false;             // 禁用该CSEG行
     pt->Token = pt->Token2;         // Token升级
     return Pass2UpdateCurSeg(pt->next, pt->Token2);
   } // end else
} // end TknIsBSEG_Do
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 注意,USING伪指令在两次扫描时都有效。
//---------------------------------------------------------------------------
ERR MacroAsmber::TknIsUsing_Do(Tokenfield* pt)
{ ERR err;
  const TriVal* t = LabMger->CalExpression(err, pt->next->ExpPt);
  if(err) { OutputErr(ExpSyrErr); return Have_Errs; } // endif

  if( t->rseg || t->typ != LB_NUM || t->rel !='A' )
   { OutputErr(ExpTypNotMatchErr); return Have_Errs; } // endif
  if(t->val < 0)
   { OutputErr(NegDatNotAllowErr); return Have_Errs; } // endif
  if(t->val > 3)
   { OutputErr(UsingWrongErr); return Have_Errs; } // endif

  pt->Token2 = (int8u)(t->val);             // pt->Value = USING 数值。

  register int8u Addr = (int8u)(pt->Token2);
  JModulePt->setUseBank(Addr);              // 0~3
  Addr <<= 3;                               // 000 ~ 111

  JLabelNode* pb;
  if(LabMger->SearchLinkList("AR7",pb))           // 找到AR7。
   { for( register int8 i = 7; i >= 0; --i )   // 修改AR0~AR7。
      { pb->Value = Addr + i; pb = pb->next; } // end for
   } // endif
  return OK_no_Err;
} // end TknIsUsing_Do
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 遇到IF语句要做的事。需要使用Ln。
// 流程:
// (1)计算IF所带的表达式的值。
// (2)判断该值是否合法。
// (3)保存该结果到pt节点的Token2域。
// (4)把(当前的IFstate,表达式的值)状态压栈!!
// (5)pt->loc[1] 暂存IF语句的嵌套层数
// (6)返回。
//---------------------------------------------------------------------------
ERR MacroAsmber::Tkn_IF_Do(Tokenfield* pt)
{ ERR err = OK_no_Err;
  Ln->Enable = false;
  pt->Token = IF_Kn; // Token升级!
  IfElseNest_inc(err);
  if(err) { return Have_Errs; } // endif
  pt->Token2 = 0;          // 清零。
  pt->loc[1] = IfElseNest; // 暂存IF语句的嵌套层数

  if(IfStack.GetXorTop()) { return OK_no_Err; } // endif 如果上层状态被ban
  // Now, 上层状态不被ban
  const TriVal* t = LabMger->CalExpression(err, pt->next->ExpPt); // 带err返回。
  if(err)
   { OutputErr(IFexprErr); return ErrInIfElseS; } // endif
  if( t->typ != LB_NUM ) // (LB_NUM==5)
   { OutWarning(IFexprWarn); } // endif
  if(t->val < 0)
   { OutWarning(NegContPosWarn); } // endif
  if(not16bit(t->val))
   { OutWarning(DataBeTrun16Warn); } // endif

  pt->Token2 = (int16u)t->val; // 保存结果。
  IfStack.push( true, (bool)pt->Token2 ); // 把状态压栈!!

  return OK_no_Err;
} // end Tkn_IF_Do
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 遇到ELSEIF语句要做的事。需要使用Ln。
//---------------------------------------------------------------------------
ERR MacroAsmber::Tkn_ELSEIF_Do(Tokenfield* pt)
{ Ln->Enable = false;
  pt->Token = ELSEIF_Kn;  // Token升级!
  pt->Token2 = 0;
  pt->loc[1] = IfElseNest; // 暂存IF语句的嵌套层数

  if(IfElseNest > IfStack.getSP()) { return OK_no_Err; } // 如果ELSEIF是不属于本层的
  // Now, ELSEIF确实是属于本层的

  if( IfStack.getB() ) // 如果ELSEIF上面的IF语句中的表达式为真的话
   { IfStack.settop(false, true); return OK_no_Err; } // endif
  // ELSEIF上面的IF语句没有执行,即IF表达式的值为假

  ERR err;
  const TriVal* t = LabMger->CalExpression(err, pt->next->ExpPt); // 带err返回。
  if(err)
   { OutputErr(IFexprErr); return Have_Errs; } // endif
  if( t->typ != LB_NUM ) // (LB_NUM==5)
   { OutWarning(IFexprWarn); } // endif
  if(t->val < 0)
   { OutWarning(NegContPosWarn); } // endif
  if(not16bit(t->val))
   { OutWarning(DataBeTrun16Warn); } // endif

  pt->Token2 = (int16u)t->val; // 保存表达式结果。
  IfStack.settop(true,(bool)pt->Token2); // 改变状态!!
  return OK_no_Err;
} // end Tkn_ELSEIF_Do
//---------------------------------------------------------------------------

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

⌨️ 快捷键说明

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