📄 masmber_c3.cpp
字号:
#define IF_do(); \
if( Tkn_IF_Do(pt) ) { err = ErrInIfElseS; }
//---------------------------------------------------------------------------
#define ELSEIF_do(); \
if( Tkn_ELSEIF_Do(pt) ) { err = ErrInIfElseS; }
//---------------------------------------------------------------------------
#define ELSE_do(); \
Ln->Enable = false; \
pt->Token = ELSE_Kn; \
pt->loc[1] = IfElseNest; \
pt->Token2 = IfStack.getB(); \
if(IfElseNest <= IfStack.getSP()) \
{ IfStack.settop(false, (bool)pt->Token2); }
//---------------------------------------------------------------------------
// Ln->Enable = false;
// pt->Token = ELSE_Kn; // Token升级!
// pt->loc[1] = IfElseNest; // 暂存IF语句的嵌套层数
// pt->Token2 = IfStack.getB(); // 表达式的真值。
// if(IfElseNest <= IfStack.getSP()) // 如果ELSE确实是属于本层的
// { IfStack.settop(false, (bool)pt->Token2); } // endif
//---------------------------------------------------------------------------
#define ENDIF_do(); \
Ln->Enable = false; \
pt->Token = ENDIF_Kn; \
pt->loc[1] = IfElseNest; \
IfElseNest_dec(err); \
if(err) { return ErrInIfElseS; } \
if(IfElseNest < IfStack.getSP()) { IfStack.pop(); }
//---------------------------------------------------------------------------
// Ln->Enable = false;
// pt->Token = ENDIF_Kn; // Token升级!
// pt->loc[1] = IfElseNest; // 暂存IF语句的嵌套层数
// if(IfElseNest_dec()) { return ErrInIfElseS; } // endif
// if(IfElseNest < IfStack.getSP())
// { IfStack.pop(); } // endif 把top值丢弃。
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 遇到PUBLIC指令,把其后的单词表中的标号常量找到,并置PUBLIC标志。
//---------------------------------------------------------------------------
void MacroAsmber::PublicKn_do(ERR &err, Tokenfield* pt)
{ Ln->Enable = false;
pt = pt->next;
for( pt = pt->ExpPt; pt != NULL; pt = pt->next )
{ JLabelNode* tp = LabMger->SearchLabelCal(pt->Name, err, NULL);
if(err)
{ if(err == LabNotReady) { err = OK_no_Err; } // endif
else { err = ErrInPublicDef; return; }
} // endif
tp->SetPublic();
} // end for
} // PublicKn_do
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 遇到NAME指令,判断名字长度是否在40字符之内。修改模块名字,然后禁用该行。
//---------------------------------------------------------------------------
#define NameModuleDo(); \
Ln->Enable = false; pt = pt->next; \
if(pt->Name.getLen() > 40) \
{ OutWarning(LBLTooLongWarn); pt->Name.Trunc(40); } \
JModulePt->SetName(pt->Name);
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 遇到常量定义,将其添加到标号表中。并将该汇编行禁用。
//---------------------------------------------------------------------------
#define AddConstThenDisIt(typ); \
if(AddLabelThenDis(pt,typ,Constant_)) { err = ErrInAddLabel; }
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 遇到变量定义,将其添加到标号表中。但保留它在汇编行里。
//---------------------------------------------------------------------------
#define SetVarThenKeepIt(typ); \
if(SetVarLabel(pt,typ,Variable_)) { err = ErrInSetLabel; }
//---------------------------------------------------------------------------
#define TknIsORGDoSth(); \
if( TknIsORGDo(pt) ) { err = ErrInORGset; }
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#define PASS2DOSth(str); \
if(Pass_1) { break; } else { str }
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// pt->Token = PseudoWord
//---------------------------------------------------------------------------
ERR MacroAsmber::PWordMeaningAct(Tokenfield* pt)
{ ERR err = OK_no_Err;
switch(pt->Token2)
{ case EQUsDefken: { AddConstThenDisIt(LB_NUM); break; } // Pass1&2
case BITsDefken: { AddConstThenDisIt(LB_BIT); break; } // Pass1&2
case CODEDefKen: { AddConstThenDisIt(LB_CODE); break; } // Pass1&2
case DATADefKen: { AddConstThenDisIt(LB_DATA); break; } // Pass1&2
case XDATADefKn: { AddConstThenDisIt(LB_XDATA); break; } // Pass1&2
case IDATADefKn: { AddConstThenDisIt(LB_IDATA); break; } // Pass1&2
case SETsDefken: { SetVarThenKeepIt(LB_NUM); break; } // Pass1
case RSEG: { if(TknIsRSEG_Do(pt)) {err = ErrInRSEGset;} break; } // Pass1&2
case CSEG: { if(TknIsCSEG_Do(pt)) {err = ErrInCSEGset;} break; } // Pass1&2
case DSEG: { if(TknIsDSEG_Do(pt)) {err = ErrInDSEGset;} break; } // Pass1&2
case XSEG: { if(TknIsXSEG_Do(pt)) {err = ErrInXSEGset;} break; } // Pass1&2
case ISEG: { if(TknIsISEG_Do(pt)) {err = ErrInISEGset;} break; } // Pass1&2
case BSEG: { if(TknIsBSEG_Do(pt)) {err = ErrInBSEGset;} break; } // Pass1&2
case DB : { TknIsDBDoSth(pt); break; } // end case // Pass1
case DW : { TknIsDWDoSth(pt); break; } // end case // Pass1
case DS : { pt->Token = pt->Token2; TknIsDSDoSth(pt); break; } // Pass1
case DBIT: { pt->Token = pt->Token2; TknIsDBITDoSth(pt);break;} // Pass1
case ORG : { pt->Token = pt->Token2; TknIsORGDoSth(); break; } // Pass1
case IF_Kn : { IF_do(); break; } // end case // Pass1
case ENDIF_Kn : { ENDIF_do(); break; } // end case // Pass1
case ELSE_Kn : { ELSE_do(); break; } // end case // Pass1
case ELSEIF_Kn: { ELSEIF_do();break; } // end case // Pass1
case NAMEToKn: { NameModuleDo(); break; } // end case // Pass1
case USINGTkn: { pt->Token = pt->Token2; USING_do(); break; } // Pass1
case PUBLICKn: { PASS2DOSth(PublicKn_do(err, pt);); break; } // Pass2
default: { EThrows(printf("\nPWordMeaningAct out of run!"); Debugkey;);
} // end default
} // end switch(pt->Token2)
return err;
} // end PWordMeaningAct
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#define ErrInOperands 1
#define ErrInOperator 2
//---------------------------------------------------------------------------
// 遇到机器指令的动作。识别出该指令,找到它对应的描述,确定指令的长度。
// This work is done in Pass1 & 2.
//---------------------------------------------------------------------------
ERR MacroAsmber::ReservInstDo(Tokenfield* pt)
{ ERR err;
OPset* opset = FindResvInstOPset(pt, err); // 得到opset指针, err带值返回。
if(err) // 操作数发生错误, GetDataType()找不到对应的寻址模式.
{ return ErrInOperands; } // endif
if(opset == NULL) // 操作码发生错误
{ OutputErr(InstrctSyntaxErr); return ErrInOperator; } // endif
// 操作码正确
// 有可能的话,做一些优化。(SJMP, AJMP, LJMP, ACALL, LCALL)
if(opset->act1 == JJudge) { RecgJMPandCALL(pt->next, opset); } // endif
// 已设置好opset, opset带值返回。
SegPt->SegLc += opset->len; // 段计数器增加
if(Pass_2)
{ pt->Token = KnownInst; // Token进化
pt->Opset = opset; // Token->Value域保存opset指针
} // endif
return OK_no_Err; // 正确返回
} // end ReservInstDo
//---------------------------------------------------------------------------
/*
ERR MacroAsmber::ReservInstDo(Tokenfield* pt)
{ ERR err;
register OPset* opset = FindResvInstOPset(pt, err); // 得到opset指针, err带值返回。
if(err) // 操作数发生错误, GetDataType()找不到对应的寻址模式.
{ return ErrInOperands; } // endif
// 操作数正确
if(opset == NULL) // 操作码发生错误
{ OutputErr(InstrctSyntaxErr); return ErrInOperator; } // endif
// 操作码正确
// 有可能的话,做一些优化。(SJMP, AJMP, LJMP, ACALL, LCALL)
if(opset->act1 == JJudge) { RecgJMPandCALL(pt->next, opset); } // endif
// 已设置好opset, opset带值返回。
pt->Token = OPsetInst; // Token进化
pt->Opset = opset; // Token->Value域保存opset指针
SegPt->SegLc += opset->len; // 段计数器增加
return OK_no_Err; // 正确返回
} // end ReservInstDo
//---------------------------------------------------------------------------
*/
//---------------------------------------------------------------------------
// 遇到机器指令的动作。识别出该指令,找到它对应的描述,确定指令的长度。
// This work is done in Pass2.
//---------------------------------------------------------------------------
inline ERR MacroAsmber::OPsetInstDo(Tokenfield* pt)
{ // 有可能的话,做一些优化。(SJMP, AJMP, LJMP, ACALL, LCALL)
if(pt->Opset->act1 == JJudge) { RecgJMPandCALL(pt->next, pt->Opset); } // endif
// 已设置好opset, opset带值返回。
pt->Token = KnownInst; // Token进化
SegPt->SegLc += pt->Opset->len; // 段计数器增加
return OK_no_Err; // 正确返回
} // end OPsetInstDo
//---------------------------------------------------------------------------
#define AddrInPage(x) ((x) >= -128 && (x) <= 127)
#define AddrInBlock(x) ((x) >= -1024 && (x) <= 1023)
//---------------------------------------------------------------------------
// 把可以简化的JMP和CALL改成简化形式。(SJMP, AJMP, LJMP; ACALL, LCALL)。
// 注意:pt指向操作数(Operand)。 opset带值返回。
//---------------------------------------------------------------------------
void MacroAsmber::RecgJMPandCALL(Tokenfield* pt, OPset* &opset)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -