⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 caslutil.cpp

📁 这是一个软件水平资格考试中使用的CASL汇编语言的编译器,实现文件中包括一个编译器,一个虚拟机,一个类似于Debug的调试器.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
      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 + -