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

📄 debugcmd.cpp

📁 这是一个软件水平资格考试中使用的CASL汇编语言的编译器,实现文件中包括一个编译器,一个虚拟机,一个类似于Debug的调试器.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
      {
        goto Instruction_HeadedByP_Failed;
      }
    }
    else
    {
      goto Instruction_HeadedByP_Failed;
    }
    break;
  default:    //Other
    goto Instruction_HeadedByP_Failed;
    break;
  }
 
  return STATUS_OK;

//--------------错误处理部分----------------------------------------------------------
Instruction_HeadedByP_Failed:
  m_pVM->m_errorHandler.WriteErrorMessage("Unknown Instruction!");
  return STATUS_FAILED;
}

/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_HeadedByR
//函数功能:---------------------处理以字符R作为起始字符的指令----------------
//入口参数:无
//出口参数:无
//返回值:int-------------STATUS_OK表示操作成功,其他表示操作失败
//开发人员:杨军
//开发日期:2004-4-24
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CDebugCmd::Instruction_HeadedByR()
{
  //Handle Instruction RET ?
  switch (GetNextChar())
  {
  case 'E':   //RET ?
    //得到RET输入
    if ('T' == GetNextChar())
    {
      m_asmCode.instType = CASL_RET;
      PassBySpace();
      if (EOI != GetNextChar())
      {
        goto Instruction_HeadedByR_Failed;
      }
    }
    //不支持的输入
    else
    {
      goto Instruction_HeadedByR_Failed;
    }
    break;
  default:    //Other
    goto Instruction_HeadedByR_Failed;
    break;
  }
 
  return STATUS_OK;

//--------------错误处理部分----------------------------------------------------------
Instruction_HeadedByR_Failed:
  m_pVM->m_errorHandler.WriteErrorMessage("Unknown Instruction!");
  return STATUS_FAILED;
}

/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_HeadedByS
//函数功能:---------------------处理以字符S作为起始字符的指令----------------
//入口参数:无
//出口参数:无
//返回值:int-------------STATUS_OK表示操作成功,其他表示操作失败
//开发人员:杨军
//开发日期:2004-4-24
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CDebugCmd::Instruction_HeadedByS()
{
  //Handle Instructions ST, SUB, SLA, SRA, SLL, SRL
  switch (GetNextChar())
  {
  case 'T':   //ST
    m_asmCode.instType = CASL_ST;
    //处理操作数
    if (' ' == GetNextChar())
    {
      //略过多余的空格
      PassBySpace();
      if (STATUS_OK != HandleGRAndEA())
      {
        goto Instruction_HeadedByS_Failed;
      }
    }
    else
    {
      goto Instruction_HeadedByS_Failed;
    }
    break;
  case 'U':   //SUB ?
    if ('B' == GetNextChar())
    {
      m_asmCode.instType = CASL_SUB;
      //处理操作数
      if (' ' == GetNextChar())
      {
        //略过多余的空格
        PassBySpace();
        if (STATUS_OK != HandleGRAndEA())
        {
          goto Instruction_HeadedByS_Failed;
        }
      }
      else
      {
        goto Instruction_HeadedByS_Failed;
      }
    }
    break;
  case 'L':   //SLL OR SLA?
    switch (GetNextChar())
    {
    case 'L':   //SLL
      m_asmCode.instType = CASL_SLL;
      //处理操作数
      if (' ' == GetNextChar())
      {
        //略过多余的空格
        PassBySpace();
        if (STATUS_OK != HandleGRAndEA())
        {
          goto Instruction_HeadedByS_Failed;
        }
      }
      else
      {
        goto Instruction_HeadedByS_Failed;
      }
      break;
    case 'A':   //SLA
      m_asmCode.instType = CASL_SLA;
      //处理操作数
      if (' ' == GetNextChar())
      {
        //略过多余的空格
        PassBySpace();
        if (STATUS_OK != HandleGRAndEA())
        {
          goto Instruction_HeadedByS_Failed;
        }
      }
      else
      {
        goto Instruction_HeadedByS_Failed;
      }
      break;
    default:
      goto Instruction_HeadedByS_Failed;
      break;
    }
    break;
  case 'R':   //SRA OR SRL?
    switch (GetNextChar())
    {
    case 'L':   //SRL
      m_asmCode.instType = CASL_SRL;
      //处理操作数
      if (' ' == GetNextChar())
      {
        //略过多余的空格
        PassBySpace();
        if (STATUS_OK != HandleGRAndEA())
        {
          goto Instruction_HeadedByS_Failed;
        }
      }
      else
      {
        goto Instruction_HeadedByS_Failed;
      }
      break;
    case 'A':   //SRA
      m_asmCode.instType = CASL_SRA;
      //处理操作数
      if (' ' == GetNextChar())
      {
        //略过多余的空格
        PassBySpace();
        if (STATUS_OK != HandleGRAndEA())
        {
          goto Instruction_HeadedByS_Failed;
        }
      }
      else
      {
        goto Instruction_HeadedByS_Failed;
      }
      break;
    default:
      goto Instruction_HeadedByS_Failed;
      break;
    }
    break;
  default:    //Other
    goto Instruction_HeadedByS_Failed;
    break;
  }
 
  return STATUS_OK;

//--------------错误处理部分----------------------------------------------------------
Instruction_HeadedByS_Failed:
  m_pVM->m_errorHandler.WriteErrorMessage("Unknown Instruction!");
  return STATUS_FAILED;
}


/////////////////////////////////////////////////////////////////////////
//函数名称:PassBySpace
//函数功能:-----略过A命令中所获得用户输入的指令串中的多余的空格(包括制表符\t)------------------
//入口参数:无
//出口参数:无
//返回值:无
//开发人员:杨军
//开发日期:2004-4-24
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
void CDebugCmd::PassBySpace()
{
  char chCmd = GetNextChar();

  while ((' ' == chCmd || '\t' == chCmd) && EOI != chCmd)
  {
    chCmd = GetNextChar();
  }

  if (chCmd != EOI)
  {
    m_iPos--;
  }
}


/////////////////////////////////////////////////////////////////////////
//函数名称:HandleGRAndEA
//函数功能:-----处理A命令中所获得用户输入的指令串中的操作数中的GR与EA部分--------
//入口参数:无
//出口参数:无
//返回值:int-------------STATUS_OK表示操作成功,其他表示操作失败
//开发人员:杨军
//开发日期:2004-4-24
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CDebugCmd::HandleGRAndEA()
{

  if (STATUS_OK == HandleGR())
  {
    PassBySpace();
    if (GetNextChar() == ',')
    {
      HandleEA();
    }
    else
    {
      goto HandleGRAndEA_Failed;
    }
  }
  else
  {
    goto HandleGRAndEA_Failed;
  }

  return STATUS_OK;

HandleGRAndEA_Failed:
  m_pVM->m_errorHandler.WriteErrorMessage("Handle GR And EA Failed!");
  return STATUS_FAILED;
}

/////////////////////////////////////////////////////////////////////////
//函数名称:HandleEA
//函数功能:-----处理A命令中所获得用户输入的指令串中的操作数中的EA部分--------
//入口参数:无
//出口参数:无
//返回值:int-------------STATUS_OK表示操作成功,其他表示操作失败
//开发人员:杨军
//开发日期:2004-4-24
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CDebugCmd::HandleEA()
{
  //-----------------------变量定义部分 begins---------------------------
  S2   s2Address = 0;
  //-----------------------变量定义部分 ends-----------------------------

  //---------------先处理Address----------------------------------------
  //注意:这里与Debug下一样,将用户输入的数字默认为十六进制格式!!!
  //     以便于统一处理!!
  if (HandleAddress(s2Address) == STATUS_OK)
  {
    m_asmCode.bAddressUse = true;
    m_asmCode.s2Address = s2Address;
    //---------------     处理XR       -------------------------------------
    PassBySpace();

    switch (GetNextChar())
    {
    case ',':
      PassBySpace();
      if (GetNextChar() == 'G')
      {
        if (GetNextChar() == 'R')
        {
          m_asmCode.bXRUse = true;
          switch (GetNextChar())
          {
          case '0':           //XR = GR0
            m_asmCode.iXRNumber = 0;
            break;
          case '1':           //XR = GR1
            m_asmCode.iXRNumber = 1;
            break;
          case '2':           //XR = GR2
            m_asmCode.iXRNumber = 2;
            break;
          case '3':           //XR = GR3
            m_asmCode.iXRNumber = 3;
            break;
          case '4':           //XR = GR4
            m_asmCode.iXRNumber = 4;
            break;
          default:
            m_asmCode.bXRUse = true;
            goto HandleEA_Failed;
            break;
          }
          PassBySpace();
          if (GetNextChar() != EOI)
          {
            goto HandleEA_Failed;
          }
        }
        else
        {
          goto HandleEA_Failed;
        }
      }
      else
      {
        goto HandleEA_Failed;
      }
      break;
    case EOI:
      m_asmCode.bXRUse = false;
      break;
    default:
      goto HandleEA_Failed;
      break;
    }
  }
  else
  {
    goto HandleEA_Failed;
  }
  
  return STATUS_OK;

HandleEA_Failed:
  m_pVM->m_errorHandler.WriteErrorMessage("Handle EA Failed!");
  return STATUS_FAILED;
}


/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_HeadedByI
//函数功能:---------------------处理以字符I作为起始字符的指令----------------
//入口参数:无
//出口参数:无
//返回值:int-------------STATUS_OK表示操作成功,其他表示操作失败
//开发人员:杨军
//开发日期:2004-4-24
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CDebugCmd::Instruction_HeadedByI()
{
  //Handle Instruction IN
  switch (GetNextChar())
  {
  case 'N':   //IN
    //得到IN输入
    m_asmCode.instType = CASL_IN;
    //注意: 指令后必须跟至少一个空格才能再跟操作数!!
    //      否则视为不合法!!!
    if (' ' == GetNextChar())
    {
      //略过多余的空格
      PassBySpace();
      if (STATUS_OK != HandleALabelAndNLabel())
      {
        goto Instruction_HeadedByI_Failed;
      }
    }
    else
    {
      goto Instruction_HeadedByI_Failed;
    }

    break;
  default:    //Other
    goto Instruction_HeadedByI_Failed;
    break;
  }
 
  return STATUS_OK;

//--------------错误处理部分----------------------------------------------------------
Instruction_HeadedByI_Failed:
  m_pVM->m_errorHandler.WriteErrorMessage("Unknown Instruction!");
  return STATUS_FAILED;
}

/////////////////////////////////////////////////////////////////////////
//函数名称:HandleALabelAndNLabel
//函数功能:-----处理A命令中输入IN, OUT指令的操作数部分-----------------------
//入口参数:无
//出口参数:无
//返回值:int-------------STATUS_OK表示操作成功,其他表示操作失败
//开发人员:杨军
//开发日期:2004-4-24
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CDebugCmd::HandleALabelAndNLabel()
{
  //-----------------------变量定义部分 begins---------------------------
  S2   s2Address = 0;
  //-----------------------变量定义部分 ends-----------------------------

  //---------------先处理ALabelAddress----------------------------------------
  //注意:这里与Debug下一样,将用户输入的数字默认为十六进制格式!!!
  //     以便于统一处理!!
  if (STATUS_OK == HandleAddress(s2Address))
  {
    m_asmCode.bALabelAddress = true;
    m_asmCode.s2ALabelAddress = s2Address;
    PassBySpace();
    if (GetNextChar() == ',')
    {
      //---------------     处理NLabelAddress  -------------------------------------
      if (STATUS_OK == HandleAddress(s2Address))
      {
        m_asmCode.bNLabelAddress = true;
        m_asmCode.s2NLabelAddress = s2Address;
        PassBySpace();
        if (EOI != GetNextChar())
        {
          goto HandleALabelAndNLabel_Failed;
        }
      }
      else
      {
        goto HandleALabelAndNLabel_Failed;
      }

⌨️ 快捷键说明

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