?? masmber_c4.cpp
字號(hào):
//---------------------------------------------------------------------------
// MAsmber_C4.cpp
//---------------------------------------------------------------------------
#include "MAsmber_H.h"
#include "AsmF_H.h"
#include "OBJfile_H.h"
#include "ListFile_H.h"
#include "OBJModule_H.h"
#include "TokenOper_H.h"
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//
// 目標(biāo)代碼生成器
//
//---------------------------------------------------------------------------
#define DebugKit(str) //DebugMsg(str)
//---------------------------------------------------------------------------
// 匯編行代碼生成。
// 要對Ln所指向的匯編行進(jìn)行分析。
// 如果有錯(cuò),則返回非零值。
//---------------------------------------------------------------------------
ERR MacroAsmber::LineToObjCode()
{ if(!Ln->Enable) { return 0; } // 如果此行被禁用,忽略此行
DebugKit(printf("\nToObjCode Ln=%d",Ln->LineNo); Debugkey);
int16u temp = Ln->lc; // 暫存Ln->lc,以便以后恢復(fù)
Tokenfield* pt = Ln->FirstTkn(); // 每次從行頭開始
ERR err = OK_no_Err;
switch(pt->Token)
{ case KnownInst : // 這一次, 必須把所有的表達(dá)式都算出來!!!
{ Ln->len = pt->Opset->len; // 給匯編行長度賦值。
err = Translate(pt); // 從 KnownInst -> Instcode 的轉(zhuǎn)換
break;
} // end case
case DB :
{ err = DBToDBObj(pt); // 成功=0,否則返回出錯(cuò)碼
break;
} // end case
case DW :
{ err = DWToDWObj(pt); // 成功=0,否則返回出錯(cuò)碼
break;
} // end case
case SETsDefken:
{ JLabelNode* temp;
if( LabMger->SearchLinkList(pt->Name, temp) ) // temp 帶回搜索值
{ temp->CopyFrom(*pt->LabPt); } // endif
else
{ DebugKit(printf("\nBugs in LineToObjCode!"); Debugkey;); // debug
} // end else
Ln->Enable = false;
break;
} // end case
case USINGTkn : { err = TknIsUsing_Do(pt); Ln->Enable = false;
if(err) { return Have_Errs; }
break;
} // end case
default: { err = Have_Errs;
EThrows(printf("\nToObjCode out of run!\n"); Debugkey;); // debug
} // end default
} // end switch
Ln->lc = temp; // 恢復(fù)Ln->lc
return err;
} // end LineToObjCode
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 目標(biāo)代碼生成。
//---------------------------------------------------------------------------
ERR MacroAsmber::FileToObjCode()
{ ERR erra = OK_no_Err;
for( Ln = AsmFn->FirstLine(); Ln; Ln = Ln->next ) // 全文件掃描
{
if( LineToObjCode() ) { erra = Have_Errs; } // endif
} // end for
return erra;
} // end ToObjCode
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#define IDType(typ) (((typ)==LB_SEG) ? IDBLK_SEG_OPND : IDBLK_REL_OPND)
//---------------------------------------------------------------------------
// 從DB 到 DBObjCode 的進(jìn)化!
// pt->Token == DB
// DB ->next must not be NULL
// err = 0, 成功; err = 1, 錯(cuò)誤。
//---------------------------------------------------------------------------
ERR MacroAsmber::DBToDBObj(Tokenfield* pt) // 成功=0,否則返回出錯(cuò)碼
{ ERR err = OK_no_Err;
int16u lctemp = Ln->lc; // 暫存
for(Tokenfield* tt = pt->next; tt; tt = tt->next)
{ switch(tt->Token)
{ case LongCharn : case StrDataKn : // 常量字符串
{ Ln->lc += tt->DatPt->GetLen(); // 原Token保持不變。
break;
} // end case
case ExpresnKn :
{ const TriVal& trv = *LabMger->CalExpression(err, tt->ExpPt); // 帶回err。
if(err) { return Have_Errs; } // 該行異常終止
if(not8bit(trv.val)) { OutWarning(DataBeTrun8Warn); } // endif
TokenOper::DelTokenList(tt->ExpPt); // 釋放內(nèi)存
tt->Token = ObjcodeKn; // Token進(jìn)化
tt->D4ary = new Dat4ary; // 一個(gè)Byte就有一個(gè)D4ary.
Dat4ary &Ndary = *(tt->D4ary);
if( Ndary.ByteSettle(trv, Ln->lc) )
{ DebugKit(printf("\nErr in ByteSettle.\n"); Debugkey;); // debug
return Have_Errs;
} // endif
++Ln->lc; break;
} // end case
default:
{ EThrows(printf("\nDBToDBObj out of run!"); Debugkey;); // debug
} // default
} // end switch
} // end for
Ln->lc = lctemp; // 恢復(fù)
pt->Token = DBObjCode; // Token的進(jìn)化!
return OK_no_Err;
} // end DBToDBObj
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 從DW 到 DWObjCode 的進(jìn)化!
// pt->Token == DW
// DW ->next must not be NULL
// err = 0, 成功; err = 1, 錯(cuò)誤。
//---------------------------------------------------------------------------
ERR MacroAsmber::DWToDWObj(Tokenfield* pt) // 成功=0,否則返回出錯(cuò)碼
{ ERR err = OK_no_Err;
int16u lctemp = Ln->lc; // 暫存
for(Tokenfield* tt = pt->next; tt; tt = tt->next)
{ switch(tt->Token)
{ case LongCharn : case StrDataKn :
{ Dat4ary &Ndary = *new Dat4ary;
Ndary.dat[3] = 2; // len = 2
if(tt->DatPt->GetLen() > 2)
{ OutWarning(DataBeTrun16Warn); } // endif
if(tt->DatPt->GetLen() < 2)
{ OutWarning(DataBeExtentWarn);
register const int8u* w = (const char*)*(tt->DatPt);
Ndary.dat[0] = 0; // high byte extended to 0.
Ndary.dat[1] = *w;
} // endif
else //(==2)
{ register const int8u* w = (const char*)*(tt->DatPt);
Ndary.dat[0] = *w;
Ndary.dat[1] = *(w+1);
} // end else
delete tt->DatPt; // 釋放內(nèi)存
tt->Token = ObjcodeKn; // Token進(jìn)化
tt->D4ary = &Ndary;
Ln->lc += 2; break;
} // end case
case ExpresnKn :
{ const TriVal& trv = *LabMger->CalExpression(err, tt->ExpPt); // 帶回err。
if(err) { return Have_Errs; } // 該行異常終止
if(not16bit(trv.val)) { OutWarning(DataBeTrun16Warn); } // endif
TokenOper::DelTokenList(tt->ExpPt); // 釋放內(nèi)存
tt->Token = ObjcodeKn; // Token進(jìn)化
tt->D4ary = new Dat4ary;
Dat4ary &Ndary = *(tt->D4ary);
if( Ndary.WordSettle(trv, Ln->lc) )
{ DebugKit(printf("\nErr in WordSettle.\n"); Debugkey;); // debug
return Have_Errs;
} // endif
Ln->lc += 2; break;
} // end case
default: { EThrows(printf("\nDWToDWObj out of run!\n"); Debugkey;); // debug
} // end default
} // end switch
} // end for
Ln->lc = lctemp; // 恢復(fù)
pt->Token = DWObjCode; // Token的進(jìn)化!
return OK_no_Err;
} // end DWToDWObj
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 把匯編指令翻譯成目標(biāo)代碼。
// pt是指向KnownInst的指針, pt->Opset指向該指令的OPset。
// err = 1, 第一個(gè)操作數(shù)出錯(cuò)。
// err = 2, 第二個(gè)操作數(shù)出錯(cuò)。
// err = 3, 第三個(gè)操作數(shù)出錯(cuò)。
//---------------------------------------------------------------------------
ERR MacroAsmber::Translate(Tokenfield* pt) // 成功=0,否則返回出錯(cuò)碼
{ ERR err = 0;
// At first, pt->Token == KnownInst.
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -