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

📄 cometvm.cpp

📁 这是一个软件水平资格考试中使用的CASL汇编语言的编译器,实现文件中包括一个编译器,一个虚拟机,一个类似于Debug的调试器.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  
  //------------ 将通用寄存器中现有的数据 ^ 取出的数据 然后将结果赋给通用寄存器----
  if (iRegNumber >= 0 && iRegNumber <= 4)
  {
    m_GR[iRegNumber] = m_GR[iRegNumber] & *(short*)(m_pVMMemoryBase + s2EA * 2);

    if (STATUS_OK != AdjustFR(iRegNumber))
    {
      m_errorHandler.WriteErrorMessage("Update FR failed");
      return STATUS_FAILED;
    }
  }
  //目的寄存器的编号不合法(在0 到 4之外)
  else
  {
    m_errorHandler.WriteErrorMessage("AND指令的目的寄器不合法");
    return STATUS_FAILED;
  }
  
  m_errorHandler.WriteErrorMessage("Execute Instruction AND: Ends OK !");
  return STATUS_OK;
}


/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_OR
//函数功能:---------------------OR指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_OR()
{
  //---------------OR指令的功能描述 begins-------------------------------
  //格式: OR GR, ADR[,XR]
  //功能: 将 (GR) OR (E) ----> GR  (E = ADR [ + XR] (mod 2 ^ 16)
  //---------------OR指令的功能描述 ends----------------------------------
  
  //---------------变量定义部分 begins----------------------------------
  S2 s2EA = 0;
  int iRegNumber = 0;
  //---------------变量定义部分 ends------------------------------------

  m_errorHandler.WriteErrorMessage("Execute Instruction OR: begins");

  //--------------计算出有效地址E-----------------------------------------
  //获得变址寄存器的编号
  iRegNumber = (m_objInstruction.regNumber & 0xf0) >> 4;
  //如果变址寄存器的编号合法的话(GR0---GR4)
  //则有效地址 = Addr + XR
  if (0 <= iRegNumber && iRegNumber <= 4)
  {
    //memcpy(&s2EA, m_objInstruction.address, sizeof(s2EA) / sizeof(char));
    s2EA = (*(S2*)m_objInstruction.address) + m_GR[iRegNumber];
  }
  //否则 有效地址 = Addr
  else
  {
    //如果变址寄存器值为空的话
    if (REG_EMPTY == iRegNumber)
    {
      s2EA = *(short*)m_objInstruction.address;
    }
    //如果变址寄存器引用一个非法的编号的话
    else
    {
      m_errorHandler.WriteErrorMessage("unsupported XR number");
      return STATUS_FAILED;
    }
  }
  //检查有效地址是否合法
  if (!IsAddressValid(s2EA << 1))
  { 
    return STATUS_FAILED;
  }

  //获得目的寄存器编号
  iRegNumber = m_objInstruction.regNumber & 0x0f;
  
  //------------ 将通用寄存器中现有的数据 OR 取出的数据 然后将结果赋给通用寄存器----
  if (iRegNumber >= 0 && iRegNumber <= 4)
  {
    m_GR[iRegNumber] = m_GR[iRegNumber] | *(short*)(m_pVMMemoryBase + s2EA * 2);

    if (STATUS_OK != AdjustFR(iRegNumber))
    {
      m_errorHandler.WriteErrorMessage("Update FR failed");
      return STATUS_FAILED;
    }
  }
  //目的寄存器的编号不合法(在0 到 4之外)
  else
  {
    m_errorHandler.WriteErrorMessage("OR指令的目的寄器不合法");
    return STATUS_FAILED;
  }
  
  m_errorHandler.WriteErrorMessage("Execute Instruction OR: Ends OK !");
  return STATUS_OK;
}


/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_EOR
//函数功能:---------------------EOR指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_EOR()
{
  //---------------EOR指令的功能描述 begins-------------------------------
  //格式: EOR GR, ADR[,XR]
  //功能: 将 (GR) EOR (E) ----> GR  (E = ADR [ + XR] (mod 2 ^ 16)
  //---------------EOR指令的功能描述 ends----------------------------------
  
  //---------------变量定义部分 begins----------------------------------
  S2 s2EA = 0;
  int iRegNumber = 0;
  //---------------变量定义部分 ends------------------------------------

  m_errorHandler.WriteErrorMessage("Execute Instruction EOR: begins");

  //--------------计算出有效地址E-----------------------------------------
  //获得变址寄存器的编号
  iRegNumber = (m_objInstruction.regNumber & 0xf0) >> 4;
  //如果变址寄存器的编号合法的话(GR0---GR4)
  //则有效地址 = Addr + XR
  if (0 <= iRegNumber && iRegNumber <= 4)
  {
    //memcpy(&s2EA, m_objInstruction.address, sizeof(s2EA) / sizeof(char));
    s2EA = (*(S2*)m_objInstruction.address) + m_GR[iRegNumber];
  }
  //否则 有效地址 = Addr
  else
  {
    //如果变址寄存器值为空的话
    if (REG_EMPTY == iRegNumber)
    {
      s2EA = *(short*)m_objInstruction.address;
    }
    //如果变址寄存器引用一个非法的编号的话
    else
    {
      m_errorHandler.WriteErrorMessage(" unsupported XR number");
      return STATUS_FAILED;
    }
  }

  //检查有效地址是否合法
  if (!IsAddressValid(s2EA << 1))
  { 
    return STATUS_FAILED;
  }  
  //获得目的寄存器编号
  iRegNumber = m_objInstruction.regNumber & 0x0f;
  
  //------------ 将通用寄存器中现有的数据 EOR 取出的数据 然后将结果赋给通用寄存器----
  if (iRegNumber >= 0 && iRegNumber <= 4)
  {
    m_GR[iRegNumber] = m_GR[iRegNumber] ^ *(short*)(m_pVMMemoryBase + s2EA * 2);

    if (STATUS_OK != AdjustFR(iRegNumber))
    {
      m_errorHandler.WriteErrorMessage("Update FR failed");
      return STATUS_FAILED;
    }
  }
  //目的寄存器的编号不合法(在0 到 4之外)
  else
  {
    m_errorHandler.WriteErrorMessage("EOR指令的目的寄器不合法");
    return STATUS_FAILED;
  }
  
  m_errorHandler.WriteErrorMessage("Execute Instruction EOR: Ends OK !");
  return STATUS_OK;
}


/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_CPA
//函数功能:---------------------CPA指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_CPA()
{
  //---------------CPA指令的功能描述 begins-------------------------------
  //格式: CPA GR, ADR[,XR]
  //功能: E = ADR [ + XR] (mod 2 ^ 16)
  //      视 (GR) 和 (E) 为补码表示的带符号的二进制整数
  //      若 (GR) > (E) ,则 00--->FR
  //      若 (GR) = (E) ,则 01--->FR
  //      若 (GR) < (E) ,则 10--->FR
  //---------------CPA指令的功能描述 ends----------------------------------
  
  //---------------变量定义部分 begins----------------------------------
  S2 s2EA = 0;
  int iRegNumber = 0;
  //---------------变量定义部分 ends------------------------------------

  m_errorHandler.WriteErrorMessage("Execute Instruction CPA: begins");

  //--------------计算出有效地址E-----------------------------------------
  //获得变址寄存器的编号
  iRegNumber = (m_objInstruction.regNumber & 0xf0) >> 4;
  //如果变址寄存器的编号合法的话(GR0---GR4)
  //则有效地址 = Addr + XR
  if (0 <= iRegNumber && iRegNumber <= 4)
  {
    //memcpy(&s2EA, m_objInstruction.address, sizeof(s2EA) / sizeof(char));
    s2EA = (*(S2*)m_objInstruction.address) + m_GR[iRegNumber];
  }
  //否则 有效地址 = Addr
  else
  {
    //如果变址寄存器值为空的话
    if (REG_EMPTY == iRegNumber)
    {
      s2EA = *(short*)m_objInstruction.address;
    }
    //如果变址寄存器引用一个非法的编号的话
    else
    {
      m_errorHandler.WriteErrorMessage("unsupported XR number");
      return STATUS_FAILED;
    }
  }

  //检查有效地址是否合法
  if (!IsAddressValid(s2EA << 1))
  { 
    return STATUS_FAILED;
  }

  //获得目的寄存器编号
  iRegNumber = m_objInstruction.regNumber & 0x0f;
  
  //------------ 将通用寄存器中现有的数据 - 取出的数据 然后将结果赋给通用寄存器----
  if (iRegNumber >= 0 && iRegNumber <= 4)
  {
    if (m_GR[iRegNumber] > *(short*)(m_pVMMemoryBase + s2EA * 2))
    {
      m_FR = 0x00;
    }
    else if (m_GR[iRegNumber] < *(short*)(m_pVMMemoryBase + s2EA * 2))
    {
      m_FR = 0x02;
    }
    else if (m_GR[iRegNumber] == *(short*)(m_pVMMemoryBase + s2EA * 2))
    {
      m_FR = 0x01;
    }
  }
  //目的寄存器的编号不合法(在0 到 4之外)
  else
  {
    m_errorHandler.WriteErrorMessage("CPA指令的目的寄器不合法");
    return STATUS_FAILED;
  }
  
  m_errorHandler.WriteErrorMessage("Execute Instruction CPA: Ends OK !");
  return STATUS_OK;
}


/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_CPL
//函数功能:---------------------CPL指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_CPL()
{
  //---------------CPL指令的功能描述 begins-------------------------------
  //格式: CPL GR, ADR[,XR]
  //功能: E = ADR [ + XR] (mod 2 ^ 16)
  //      视 (GR) 和 (E) 为无符号的二进制非负数
  //      若 (GR) > (E) ,则 00--->FR
  //      若 (GR) = (E) ,则 01--->FR
  //      若 (GR) < (E) ,则 10--->FR
  //---------------CPL指令的功能描述 ends----------------------------------
  
  //---------------变量定义部分 begins----------------------------------
  S2 s2EA = 0;
  int iRegNumber = 0;
  //---------------变量定义部分 ends------------------------------------

  m_errorHandler.WriteErrorMessage("Execute Instruction CPL: begins");

  //--------------计算出有效地址E-----------------------------------------
  //获得变址寄存器的编号
  iRegNumber = (m_objInstruction.regNumber & 0xf0) >> 4;
  //如果变址寄存器的编号合法的话(GR0---GR4)
  //则有效地址 = Addr + XR
  if (0 <= iRegNumber && iRegNumber <= 4)
  {
    //memcpy(&s2EA, m_objInstruction.address, sizeof(s2EA) / sizeof(char));
    s2EA = (*(S2*)m_objInstruction.address) + m_GR[iRegNumber];
  }
  //否则 有效地址 = Addr
  else
  {
    //如果变址寄存器值为空的话
    if (REG_EMPTY == iRegNumber)
    {
      s2EA = *(short*)m_objInstruction.address;
    }
    //如果变址寄存器引用一个非法的编号的话
    else
    {
      m_errorHandler.WriteErrorMessage("unsupported XR number");
      return STATUS_FAILED;
    }
  }

  //检查有效地址是否合法
  if (!IsAddressValid(s2EA << 1))
  { 
    return STATUS_FAILED;
  }

  //获得目的寄存器编号
  iRegNumber = m_objInstruction.regNumber & 0x0f;
  
  //------------ 将通用寄存器中现有的数据 - 取出的数据 然后将结果赋给通用寄存器----
  if (iRegNumber >= 0 && iRegNumber <= 4)
  {
    if ((U2)m_GR[iRegNumber] > (U2)*(short*)(m_pVMMemoryBase + s2EA * 2))
    {
      m_FR = 0x00;
    }
    else if ((U2)m_GR[iRegNumber] < (U2)*(short*)(m_pVMMemoryBase + s2EA * 2))
    {
      m_FR = 0x02;
    }
    else if ((U2)m_GR[iRegNumber] == (U2)*(short*)(m_pVMMemoryBase + s2EA * 2))
    {
      m_FR = 0x01;
    }
  }
  //目的寄存器的编号不合法(在0 到 4之外)
  else
  {
    m_errorHandler.WriteErrorMessage("CPL指令的目的寄器不合法");
    return STATUS_FAILED;
  }
  
  m_errorHandler.WriteErrorMessage("Execute Instruction CPL: Ends OK !");
  return STATUS_OK;
}


/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_SLA
//函数功能:---------------------SLA指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_SLA()
{
  //---------------SLA指令的功能描述 begins-------------------------------
  //格式: SLA GR, ADR[,XR]
  //功能: E = ADR [ + XR] (mod 2 ^ 16)
  //      将 (GR)向左算术移动 E 位(即符号位不变,左移时空出的位置0)
  //---------------SLA指令的功能描述 ends----------------------------------
  
  //---------------变量定义部分 begins----------------------------------
  S2 s2EA = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -