📄 caslutil.cpp
字号:
inFile >> objCode;
if (inFile.eof())
{
break;
}
vecObjCode.push_back(objCode);
}
cout << "可执行文件中的目标代码数量:" << vecObjCode.size() << endl;
for (i = 0; i < vecObjCode.size(); i++)
{
//输出指令名称
cout << g_szInstructionName[vecObjCode[i].instructionType] << " ";
//注意: 对于JMP, JNZ, JMI, JPZ, JZE, PUSH, POP只能有一个操作数
//而对于RET则没有操作数
//所以在这需要进行分支处理
//如果当前指令是单操作数指令的话
if (g_vecSingleOperandInstructionName.end() != find(g_vecSingleOperandInstructionName.begin(), g_vecSingleOperandInstructionName.end(), g_szInstructionName[vecObjCode[i].instructionType]))
{
//处理操作数1即可
//如果是POP指令的话,使用通用寄存器GR作为操作数
if (!strcmp(g_szInstructionName[vecObjCode[i].instructionType], "POP"))
{
//输出POP的操作数中的寄存器编号
cout << "操作数1(REG): " << (int)(vecObjCode[i].regNumber & 0x0f);
}
//如果是其他的单操作数指令的话
//输入其EA操作数
else
{
regNumber = vecObjCode[i].regNumber & 0xf0;
regNumber >>= 4;
cout << "操作数1(EA): XR--" << (int)regNumber << " Address----" << ConvertDByteToInt(vecObjCode[i].address);
}
//如果是其他的单操作数指令的话,使用期EA作为操作数
}
//如果当前指令是无操作数指令的庆
else if (g_vecNoOperandInstructionName.end() != find(g_vecNoOperandInstructionName.begin(), g_vecNoOperandInstructionName.end(), g_szInstructionName[vecObjCode[i].instructionType]))
{
//目前情况下不需要处理操作数
//以后考虑在目标指令中加入一个标识操作数为空的标志位
}
//是普通的双操作数指令的话
else
{
//在Casl中,对于双操作数指令来说,第一个操作数必然是通用寄存器
//第二个必然是EA,这就给我们的处理带来了很大的方便
//输出操作数1的数据(通用寄存器的编号)
cout << "操作数1(REG): " << (int)(vecObjCode[i].regNumber & 0x0f);
//输出操作数2的数据
regNumber = vecObjCode[i].regNumber & 0xf0;
regNumber >>= 4;
cout << "操作数2(EA): XR--" << (int)regNumber << " Address----" << ConvertDByteToInt(vecObjCode[i].address);
}
cout << endl;
}
//-----输出可视化调试信息------------------------------
cout << "----------------------------------output Visual Debug Info---------------" << endl;
uiSize = g_vecVisualDebugInfo.size();
cout << "size :" << uiSize << endl;
for (i = 0; i < uiSize; i++)
{
cout << "Source Code----" << g_vecVisualDebugInfo[i].u2SrcCodeLineNumber;
cout << " : ";
cout << "Object Code Serial Number" << g_vecVisualDebugInfo[i].u2InstructionNumber;
cout << endl;
}
//debug use --------------------------------------------ends
#endif
return CASL_UTIL_OP_OK;
}
//---------------------处理内存不足使用的函数--------------------------------
/////////////////////////////////////////////////////////////////////////
//函数名称:SetNewHandler
//函数功能:设置新的new handler
//入口参数:无
//出口参数:无
//返回值:无
//开发人员:杨军
//开发日期:2004-4-18
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
void SetNewHandler()
{
g_OldNewHandler = set_new_handler(NoEnoughMemory);
}
/////////////////////////////////////////////////////////////////////////
//函数名称:NoEnoughMemory
//函数功能:新的new handler----提示用户没有足够的内存执行new 操作
//入口参数:无
//出口参数:无
//返回值:无
//开发人员:杨军
//开发日期:2004-4-18
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
void NoEnoughMemory()
{
//-----------------向用户显示内存不足的信息--------------------
CXmlErrorHandler::ShowErrMsg("Sorry, No Enough Memory for New operation, please reboot the machine!!");
//-----------------直接退出当前程序----------------------------
exit(-1);
}
/////////////////////////////////////////////////////////////////////////
//函数名称:RestoreNewHandler
//函数功能:恢复以前的 new handler
//入口参数:无
//出口参数:无
//返回值:无
//开发人员:杨军
//开发日期:2004-4-18
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
void RestoreNewHandler()
{
set_new_handler(g_OldNewHandler);
}
/////////////////////////////////////////////////////////////////////////
//函数名称:Trim
//函数功能:清除字符串左右两端的空格
//入口参数:string& argData---------------------要被处理的字符串
//出口参数: string& argData---------------------存放处理后的结果
//返回值: int-----Status_OK表示操作成功, 其他表示操作失败
//开发人员:杨军
//开发日期:2004-4-23
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int Trim(string& argData)
{
//------------------------变量定义部分begins---------------------------
string::size_type sizeFirst = 0;
string::size_type sizeLast = 0;
const char * c_szData = argData.c_str();
//------------------------变量定义部分ends---------------------------
//去除空格的算法简介如下
sizeFirst = argData.find_first_not_of(' ', 0);
sizeLast = argData.find_last_not_of(' ', string::npos);
if (string::npos == sizeFirst || string::npos == sizeLast)
{
if (argData.length() > 0)
{
argData = "";
}
}
else
{
argData.assign(c_szData + sizeFirst, c_szData + sizeLast + 1);
}
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:LTrim
//函数功能:清除字符串左端的空格
//入口参数:string& argData---------------------要被处理的字符串
//出口参数: string& argData---------------------存放处理后的结果
//返回值: int-----Status_OK表示操作成功, 其他表示操作失败
//开发人员:杨军
//开发日期:2004-4-23
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int LTrim(string& argData)
{
//------------------------变量定义部分begins---------------------------
string::size_type sizeFirst = 0;
//------------------------变量定义部分ends---------------------------
//去除空格的算法简介如下
sizeFirst = argData.find_first_not_of(' ', 0);
if (string::npos == sizeFirst)
{
if (argData.length() > 0)
{
argData = "";
}
}
else
{
argData.assign(argData.begin() + sizeFirst, argData.end());
}
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:RTrim
//函数功能:清除字符串右的空格
//入口参数:string& argData---------------------要被处理的字符串
//出口参数: string& argData---------------------存放处理后的结果
//返回值: int-----Status_OK表示操作成功, 其他表示操作失败
//开发人员:杨军
//开发日期:2004-4-23
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int RTrim(string& argData)
{
//------------------------变量定义部分begins---------------------------
string::size_type sizeLast = 0;
//------------------------变量定义部分ends---------------------------
//去除空格的算法简介如下
sizeLast = argData.find_last_not_of(' ', argData.npos);
if (string::npos == sizeLast)
{
if (argData.length() > 0)
{
argData = "";
}
}
else
{
argData.assign(argData.begin(), argData.begin() + sizeLast + 1);
}
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:MakeUpperCase
//函数功能:将字符串转化为大写
//入口参数:string& argData---------被转化的字符串
//出口参数: string& argData---------转化后的结果
//返回值: int-----Status_OK表示操作成功, 其他表示操作失败
//开发人员:杨军
//开发日期:2004-4-27
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int MakeUpperCase(string& argData)
{
strupr(argData.begin());
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:MakeUpperCase
//函数功能:将字符串转化为小写
//入口参数:string& argData---------被转化的字符串
//出口参数: string& argData---------转化后的结果
//返回值: int-----Status_OK表示操作成功, 其他表示操作失败
//开发人员:杨军
//开发日期:2004-4-27
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int MakeLowerCase(string& argData)
{
strlwr(argData.begin());
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:MergeErrMsg
//函数功能:-------------------完成错误消息的合并-------------------------
//入口参数:vector<CompilingErrMsg>& argDetailMsg---------能够识别具体信息的错误vector
// const vector<CompilingErrMsg>& argUnknownMsg--------未能识别具体信息的错误vector
//出口参数:无
//返回值:无
//开发人员:杨军
//开发日期:2004-6-3
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
void MergeErrMsg(vector<CompilingErrMsg>& argDetailMsg, const vector<CompilingErrMsg>& argUnknownMsg)
{
//------------------变量定义部分 begins------------------------------
vector<CompilingErrMsg>::size_type uiUnknownMsgSize = argUnknownMsg.size();
vector<CompilingErrMsg>::size_type uiDetailMsgSize = argDetailMsg.size();
vector<CompilingErrMsg>::size_type i = 0;
vector<CompilingErrMsg>::size_type j = 0;
//------------------变量定义部分 ends--------------------------------
for (i = 0; i < uiUnknownMsgSize; i++)
{
//查看未识别具体信息的错误所在行是否已经在具体信息错误的vector中包含了
for (j = 0; j < uiDetailMsgSize; j++)
{
if (argDetailMsg[j].iLine == argUnknownMsg[i].iLine)
{
break;
}
}
//如果尚未包含,说明该消息的确是一条编译器未能捕捉到具体性质的错误信息
//将其加入详细信息vector中
if (j >= uiDetailMsgSize)
{
argDetailMsg.push_back(argUnknownMsg[i]);
}
}
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -