📄 assembler.cpp
字号:
break;
case MC_DUMPMEM:
I(&fii, MC_DUMPMEM);
break;
case MC_DUMPMEMAPPEND:
I(&fii, MC_DUMPMEMAPPEND);
break;
case MC_DUMPASPE:
I(&fii, MC_DUMPASPE);
break;
case MC_GETPREVOPADDR:
I(&fii, MC_GETPREVOPADDR);
break;
case MC_GETNEXTOPADDR:
I(&fii, MC_GETNEXTOPADDR);
break;
case MC_GETPROCADDRESS:
I(&fii, MC_GETPROCADDRESS);
break;
case MC_RUNTORETURN:
I(&fii, MC_RUNTORETURN);
break;
case MC_RUNTOUSERCODE:
I(&fii, MC_RUNTOUSERCODE);
break;
case MC_RUN:
I(&fii, MC_RUN);
break;
case MC_ANIMATEINTO:
I(&fii, MC_ANIMATEINTO);
break;
case MC_ANIMATEOVER:
I(&fii, MC_ANIMATEOVER);
break;
case MC_STEPINTO:
I(&fii, MC_STEPINTO);
break;
case MC_STEPOVER:
I(&fii, MC_STEPOVER);
break;
case MC_ESTI:
I(&fii, MC_ESTI);
break;
case MC_ESTO:
I(&fii, MC_ESTO);
break;
case MC_GO:
I(&fii, MC_GO);
break;
case MC_TRACEINTO:
I(&fii, MC_TRACEINTO);
break;
case MC_TRACEOVER:
I(&fii, MC_TRACEOVER);
break;
case MC_TRACEINTOCOND:
I(&fii, MC_TRACEINTOCOND);
break;
case MC_TRACEOVERCOND:
I(&fii, MC_TRACEOVERCOND);
break;
case MC_ASM:
I(&fii, MC_ASM);
break;
case MC_ANALYSE:
I(&fii, MC_ANALYSE);
break;
case MC_COMMENT:
I(&fii, MC_COMMENT);
break;
case MC_LOGTEXT:
I(&fii, MC_LOGTEXT);
break;
case MC_LOGLONG:
I(&fii, MC_LOGLONG);
break;
case MC_BP:
I(&fii, MC_BP);
break;
case MC_BC:
I(&fii, MC_BC);
break;
case MC_BPCND:
I(&fii, MC_BPCND);
break;
case MC_BPL:
I(&fii, MC_BPL);
break;
case MC_BPLCND:
I(&fii, MC_BPLCND);
break;
case MC_BPRM:
I(&fii, MC_BPRM);
break;
case MC_BPWM:
I(&fii, MC_BPWM);
break;
case MC_BPMC:
I(&fii, MC_BPMC);
break;
case MC_BPHWS:
I(&fii, MC_BPHWS);
break;
case MC_BPHWC:
I(&fii, MC_BPHWC);
break;
case MC_EOB:
IL(&fii, MC_EOB);
break;
case MC_EOBINT3:
IL(&fii, MC_EOBINT3);
break;
case MC_EOBHW:
IL(&fii, MC_EOBHW);
break;
case MC_EOBMEM:
IL(&fii, MC_EOBMEM);
break;
case MC_EOE:
IL(&fii, MC_EOE);
break;
case MC_COB:
I(&fii, MC_COB);
break;
case MC_COE:
I(&fii, MC_COE);
break;
case MC_GMI:
I(&fii, MC_GMI);
break;
case MC_SETLBL:
I(&fii, MC_SETLBL);
break;
case MC_PAUSE:
I(&fii, MC_PAUSE);
break;
case MC_HIDEOD:
I(&fii, MC_HIDEOD);
break;
case MC_UNHIDEOD:
I(&fii, MC_UNHIDEOD);
break;
case MC_FIND:
I(&fii, MC_FIND);
break;
case MC_MALLOC:
I(&fii, MC_MALLOC);
break;
case MC_FREE:
I(&fii, MC_FREE);
break;
case MC_STRCPY:
I(&fii, MC_STRCPY);
break;
case MC_STRCAT:
I(&fii, MC_STRCAT);
break;
case MC_STRLEN:
I(&fii, MC_STRLEN);
break;
case MC_LTOA:
I(&fii, MC_LTOA);
break;
case MC_MEMCPY:
I(&fii, MC_MEMCPY);
break;
case MC_PRINTBUFTODUMP:
I(&fii, MC_PRINTBUFTODUMP);
break;
case MC_PRINTBUFTONEWDUMP:
I(&fii, MC_PRINTBUFTONEWDUMP);
break;
case MC_STEPINTOS:
I(&fii, MC_STEPINTOS);
break;
case MC_STEPOVERS:
I(&fii, MC_STEPOVERS);
break;
case MC_SEARCH:
I(&fii, MC_SEARCH);
break;
case MC_FINDPROCBEGIN:
I(&fii, MC_FINDPROCBEGIN);
break;
case MC_FINDPROCEND:
I(&fii, MC_FINDPROCEND);
break;
case MC_FINDPREVPROC:
I(&fii, MC_FINDPREVPROC);
break;
case MC_FINDNEXTPROC:
I(&fii, MC_FINDNEXTPROC);
break;
case MC_FOLLOWCALL:
I(&fii, MC_FOLLOWCALL);
break;
case MC_EMBEDDEDASM:
ProcessEmbeddedAsm(&fii, PT_PASS2);
break;
case MC_ISWINNTKERNEL:
I(&fii, MC_ISWINNTKERNEL);
break;
case MC_GOTOCPUADDR:
I(&fii, MC_GOTOCPUADDR);
break;
case MC_GOTODUMPADDR:
I(&fii, MC_GOTODUMPADDR);
break;
case MC_REVERSEFIND:
I(&fii, MC_REVERSEFIND);
break;
case MC_REVERSESEARCH:
I(&fii, MC_REVERSESEARCH);
break;
case MC_COPYBYTESTO:
I(&fii, MC_COPYBYTESTO);
break;
case MC_REPLACEBYTESEX:
I(&fii, MC_REPLACEBYTESEX);
break;
case MC_UPDATEDUMPBUF:
I(&fii, MC_UPDATEDUMPBUF);
break;
case MC_WRITEMEMHEXES:
I(&fii, MC_WRITEMEMHEXES);
break;
case MC_READFILEINTOMEM:
I(&fii, MC_READFILEINTOMEM);
break;
case MC_VIRTUALALLOCEX:
I(&fii, MC_VIRTUALALLOCEX);
break;
case MC_VIRTUALFREEEX:
I(&fii, MC_VIRTUALFREEEX);
break;
}
break; // terminate TOK_TOKEN to skip the steps follow
}
nRetCode = FindLabelName(
strTokenName.GetLength() + 1,
strTokenName
);
if (0 == nRetCode)
Error(ERR_NOID, strTokenName, fii.FileName, fii.LineNum);
break; // TOK_TOKEN
case TOK_LABEL:
break;
case TOK_ERR:
Error(ERR_NOID, strTokenName, fii.FileName, fii.LineNum);
FatalError();
goto Exit0;
case TOK_EOF:
// if it is the first appeared file,
// and the last byte of opcode is not "halt",
// then add 'halt' to the end of code.
if (
(1 == m_nFileListCount) &&
(m_VM->opcode(MC_HALT) != m_Code[m_unCodeLen - 1])
)
{
AddOpcode(MC_HALT);
}
goto Exit1;
}
}
Exit1:
nRetResult = 1;
Exit0:
--m_nFileListCount;
if (fp_in)
{
fclose(fp_in);
fp_in = NULL;
}
return nRetResult;
}
int CAssembler::MakeSymbolTable(
/* [size_is][in] */ const UINT unFileNameSize,
/* [in] */ const char *szFileName
)
{
ASSERT(szFileName);
int nRetResult = 0;
int nRetCode;
FILE *fp_in = NULL;
CString strTokenName;
FILEINFO fii;
TOKENTYPE tt;
MNEMONICTYPE mt;
OM_PROCESS_ERROR((strlen(szFileName) + 1) == unFileNameSize);
fp_in = fopen(szFileName, "rt"); // do NOT use "rb" here!
OM_PROCESS_ERROR(fp_in);
strcpy(fii.FileName, szFileName);
fii.fp = fp_in;
fii.LineNum = 1;
++m_nFileListCount;
while (!m_nStopFlag)
{
tt = NextToken(&fii, &strTokenName);
switch (tt)
{
case TOK_TOKEN:
nRetCode = IsMnemonic(
strTokenName.GetLength() + 1,
(LPCTSTR)strTokenName,
&mt
);
if (0 != nRetCode) // it is a mnemonic
{
switch (mt)
{
case MC_INCLUDE:
nRetCode = ProcessInclude(&fii, PT_PASS1);
OM_PROCESS_ERROR(nRetCode);
break;
case MC_INVOKE:
nRetCode = ProcessInvoke(&fii, PT_PASS1);
OM_PROCESS_ERROR(nRetCode);
break;
case MC_EMBEDDEDASM:
nRetCode = ProcessEmbeddedAsm(&fii, PT_PASS1);
OM_PROCESS_ERROR(nRetCode);
break;
default:
nRetCode = m_VM->GetMnemonicLen(mt);
AddCodeLen(nRetCode);
break;
}
break; // terminate TOK_TOKEN to skip the steps follow
}
break; // TOK_TOKEN
case TOK_LABEL:
DeclareLabel(&fii, strTokenName.GetLength() + 1, strTokenName);
break;
case TOK_ERR:
Error(ERR_NOID, strTokenName, fii.FileName, fii.LineNum);
FatalError();
goto Exit0;
case TOK_EOF:
goto Exit1;
break;
}
}
Exit1:
nRetResult = 1;
Exit0:
--m_nFileListCount;
if (fp_in)
{
fclose(fp_in);
fp_in = NULL;
}
return nRetResult;
}
int CAssembler::IsRegister(
/* [size_is][in] */ const UINT unTokenNameSize,
/* [in] */ const char *szTokenName,
/* [out] */ REGISTERTYPE *RegType
)
{
ASSERT(szTokenName);
int i;
if ((strlen(szTokenName) + 1) != unTokenNameSize)
return 0;
for (i = 0; i < REGISTER_COUNTS; ++i)
{
if (0 == strcomp(szTokenName, m_VM->GetRegisterName(i)))
{
if (RegType)
*RegType = (REGISTERTYPE)i;
return 1;
}
}
return 0;
}
int CAssembler::IsMnemonic(
/* [size_is][in] */ const UINT unTokenNameSize,
/* [in] */ const char *szTokenName,
/* [out] */ MNEMONICTYPE *MnemonicType
) const
{
ASSERT(szTokenName);
int i;
if ((strlen(szTokenName) + 1) != unTokenNameSize)
return 0;
for (i = 0; i < MNEMONIC_COUNTS; ++i)
{
if (0 == strcomp(szTokenName, m_VM->GetMnemonicName(i)))
{
if (MnemonicType)
*MnemonicType = (MNEMONICTYPE)i;
return 1;
}
}
return 0;
}
void CAssembler::Error(
/* [in] */ const ERRTYPE ErrType,
/* [in] */ const char *szTokenName,
/* [in] */ const char *szFileName,
/* [in] */ const int nLineNum
)
{
// DO NOT ASSERT(strTokenName) here!!!
ASSERT(szFileName);
ERRINFO newei;
int nErrCount;
char szFullPathName[MAX_PATH];
nErrCount = m_pErrList->GetCount();
if (nErrCount > 10)
FatalError();
newei.ErrType = ErrType;
if (NULL == szTokenName)
newei.TokenName.Empty();
else
newei.TokenName = szTokenName;
GetFullPathName(szFileName, MAX_PATH, szFullPathName, NULL);
strcpy(newei.FileName, szFullPathName);
newei.LineNum = nLineNum;
m_pErrList->AddTail(newei);
}
void CAssembler::Warning(
/* [in] */ const WARNTYPE WarnType,
/* [in] */ const char *szTokenName,
/* [in] */ const char *szFileName,
/* [in] */ const int nLineNum
)
{
// DO NOT ASSERT(strTokenName) here!!!
ASSERT(szFileName);
WARNINFO newwi;
char szFullPathName[MAX_PATH];
newwi.WarnType = WarnType;
if (NULL == szTokenName)
newwi.TokenName.Empty();
else
newwi.TokenName = szTokenName;
GetFullPathName(szFileName, MAX_PATH, szFullPathName, NULL);
strcpy(newwi.FileName, szFullPathName);
newwi.LineNum = nLineNum;
m_pWarnList->AddTail(newwi);
}
int CAssembler::GetString(
/* [in][out] */ FILEINFO *fii,
/* [out] */ CString *strString
)
{
ASSERT(fii);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -