//
************************************************************************
//
函数名: CalcSimulator
//
权 限: public
//
返回值: DWORD
//
参 数: IN CONTEXT * tagpContext
//
参 数: IN list<TCHAR * > * pTokenList
//
说 明: 表达式计算
//
合 格:
//
************************************************************************
DWORD CalcSimulator(IN CONTEXT *tagpContext, IN list<TCHAR*>* pTokenList)
{
int nCount = 0;
DWORD dwResult = 0;
//
前一个操作数
DWORD dwCurNum = 0;
if
(tagpContext == NULL || pTokenList == NULL)
{
return
-1;
}
if
(pTokenList->size() <= 1)
{
return
-1;
}
OPERATE_STATE em_OperReg;
OPERATE_STATE em_OperCst;
OPERATE_STATE em_OperSign;
OPERATE_STATE em_OperStart;
OPERATE_STATE em_OperEnd;
em_OperReg.e = OPERATE_STATE::STATE_OPER_REG;
em_OperCst.e = OPERATE_STATE::STATE_CONST_NUM;
em_OperSign.e = OPERATE_STATE::STATE_SIGN_TOKEN;
em_OperStart.e= OPERATE_STATE::STATE_SIGN_START;
em_OperEnd.e = OPERATE_STATE::STATE_SIGN_END;
pTokenList = CalcMulti(tagpContext, pTokenList);
//
先处理乘法
if
(pTokenList == (list<TCHAR*>*)-1)
{
return
-1;
}
nCount = pTokenList->size();
list<TCHAR*>::iterator it = pTokenList->begin();
for
( int i = 0 ; i < nCount ; i++ )
{
TCHAR *pResultBuf = NULL;
pResultBuf = *it;
if
(pResultBuf == NULL)
{
continue
;
}
if
(Is(em_OperStart, pResultBuf))
{
//
清空栈内容
while
(!g_WaitForCalcStack.empty())
{
g_WaitForCalcStack.pop();
}
}
if
(Is(em_OperEnd, pResultBuf))
{
//
处理完成,开始计算栈中的数据
int nSize = g_WaitForCalcStack.size();
for
(int i = 0; i < nSize; i ++)
{
dwResult += g_WaitForCalcStack.
top
();
g_WaitForCalcStack.pop();
}
break
;
}
if
(Is(em_OperReg, pResultBuf))
{
//
如果是寄存器,就保存寄存器中的内容
g_WaitForCalcStack.push(GetRegTokenValue(tagpContext, pResultBuf));
}
if
(Is(em_OperCst, pResultBuf))
{
//
如果是立即数,就保存其值
g_WaitForCalcStack.push(GetCstTokenValue(pResultBuf));
}
if
(Is(em_OperSign, pResultBuf))
{
if
(_tcsicmp(pResultBuf, _T(
"-"
)) == 0)
{
it++;
//
如果是减法,则需要将后面的数据取补保存
pResultBuf = *it;
if
(Is(em_OperReg, pResultBuf))
{
//
如果是寄存器,就保存寄存器中的内容
dwCurNum = GetRegTokenValue(tagpContext, pResultBuf);
g_WaitForCalcStack.push(dwCurNum);
}
if
(Is(em_OperCst, pResultBuf))
{
//
如果是立即数,就保存其值
dwCurNum = GetCstTokenValue(pResultBuf);
dwCurNum = (~dwCurNum)+1;
//
求补码
g_WaitForCalcStack.push(dwCurNum);
}
}
}
it++;
}
return
dwResult;