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

📄 debugcmd.cpp

📁 这是一个软件水平资格考试中使用的CASL汇编语言的编译器,实现文件中包括一个编译器,一个虚拟机,一个类似于Debug的调试器.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//开发日期:2004-4-28
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CDebugCmd::DbgCmd_Unassemble(U2 argStartAddress, U2 argEndAddress) 
{
  //--------------------变量定义部分 begins----------------------------
  ObjectCode objCode;
  string  strData;

  int iRegNumber = 0;

  U2 u2EAAddress = 0;
  U2 u2AddressNow = argStartAddress;
  
  char szTemp[20];
  //--------------------变量定义部分 ends   ----------------------------

  while (u2AddressNow <= argEndAddress)
  {
    sprintf(szTemp, "%0 4x:", u2AddressNow);
    //读出一条指令
    memcpy(&objCode, m_pVM->m_pVMMemoryBase + u2AddressNow, sizeof(ObjectCode) / sizeof(char));
    //---------对读出的指令进行反编译---------------------------------
    //处理操作码
    switch (objCode.instructionType)
    {
    case CASL_LD:
      strData = "LD";
      break;
    case CASL_LEA:
      strData = "LEA";
      break;
    case CASL_ST:
      strData = "ST";
      break;
    case CASL_ADD:
      strData= "ADD";
      break;
    case CASL_SUB:
      strData= "SUB";
      break;
    case CASL_AND:
      strData= "AND";
      break;
    case CASL_OR:
      strData= "OR";
      break;
    case CASL_EOR:
      strData= "EOR";
      break;
    case CASL_CPA:
      strData= "CPA";
      break;
    case CASL_CPL:
      strData= "CPL";
      break;
    case CASL_SLA:
      strData= "SLA";
      break;
    case CASL_SRA:
      strData= "SRA";
      break;
    case CASL_SLL:
      strData= "SLL";
      break;
    case CASL_SRL:
      strData= "SRL";
      break;
    case CASL_JMP:
      strData= "JMP";
      break;
    case CASL_JPZ:
      strData= "JPZ";
      break;
    case CASL_JMI:
      strData= "JMI";
      break;
    case CASL_JNZ:
      strData= "JNZ";
      break;
    case CASL_JZE:
      strData= "JZE";
      break;
    case CASL_PUSH:
      strData= "PUSH";
      break;
    case CASL_POP:
      strData= "POP";
      break;
    case CASL_CALL:
      strData= "CALL";
      break;
    case CASL_RET:
      strData= "RET";
      break;
    case CASL_IN:
      break;
    case CASL_OUT:
      break;
    case CASL_EXIT:
      strData= "EXIT";
      break;
    case CASL_SET_ALABEL:
      strData= "SET_ALABEL";
      break;
    case CASL_SET_NLABEL:
      strData= "NLABEL";
      break;
    case CASL_FUNC_IN:
      strData= "FUNC_IN";
      break;
    case CASL_FUNC_OUT:
      strData= "FUNC_OUT";
      break;
    default:   //未支持的指令类型
      strData= "????";
      break;    
    }
    //将地址字符串插入字符串首部
    strData.insert(0, szTemp);

    strData.append("  ");

    //处理操作数
    //POP指令只能有通用寄存器操作数
    if (CASL_POP == objCode.instructionType)
    {
      //处理通用寄存器操作数
      iRegNumber = (objCode.regNumber & 0x0f);
      if (REG_EMPTY != iRegNumber)
      {
        sprintf(szTemp, "GR%d", iRegNumber);
        strData.append(szTemp);
      }
    }
    else
    {
      //处理通用寄存器操作数
      iRegNumber = (objCode.regNumber & 0x0f);
      if (REG_EMPTY != iRegNumber)
      {
        sprintf(szTemp, "GR%d, ", iRegNumber);
        strData.append(szTemp);
      }
      //处理有效地址操作数
      u2EAAddress = *(U2*)objCode.address;
      sprintf(szTemp, "%0 4x, ", u2EAAddress);
      strData.append(szTemp);

      iRegNumber = ((objCode.regNumber >> 4 ) & 0x0f);
      if (REG_EMPTY != iRegNumber)
      {
        sprintf(szTemp, "GR%d", iRegNumber);
        strData.append(szTemp);
      }

    }

    //输出当前反汇编出的指令
    cout << strData << endl;
    //将内存指针加4(按字节计数)
    u2AddressNow += 4;
  }

  return STATUS_OK;
}

/////////////////////////////////////////////////////////////////////////
//函数名称:ShowRunContext
//函数功能:----显示当前运行上下文信息,包括寄存器,堆栈等信息-------------------
//入口参数:无
//出口参数:无
//返回值:int-------------STATUS_OK表示操作成功,其他表示操作失败
//开发人员:杨军
//开发日期:2004-4-29
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CDebugCmd::ShowRunContext()
{
  //保存以前的输出流格式状态
  long lFlag = cout.flags();

  cout << hex;
  cout << uppercase;

  cout << "GR0=";
  cout.width(4);
  cout.fill('0');
  cout << (U2)m_pVM->m_GR[0] << " ";

  cout << "GR1=";
  cout.width(4);
  cout.fill('0');
  cout << (U2)m_pVM->m_GR[1] << " ";

  cout << "GR2=";
  cout.width(4);
  cout.fill('0');
  cout << (U2)m_pVM->m_GR[2] << " ";

  cout << "GR3=";
  cout.width(4);
  cout.fill('0');
  cout << (U2)m_pVM->m_GR[3] << " ";

  cout << "GR4=";
  cout.width(4);
  cout.fill('0');
  cout << (U2)m_pVM->m_GR[4] << " ";

  cout << " PC=";
  cout.width(4);
  cout.fill('0');
  cout << hex;
  cout << (U2)m_pVM->m_PC << " ";

  cout << "FR=";
  cout.width(2);
  cout.fill('0');
  cout << hex;
  cout << (int)m_pVM->m_FR << " ";

  cout << endl;
  //恢复以前的输出流格式状态
  cout.flags(lFlag);
  return STATUS_OK;
}


/////////////////////////////////////////////////////////////////////////
//函数名称:UnassembleSingleInstruction
//函数功能:----将指定的一条目标指令反汇编成Casl源程序指令---------------------------
//入口参数:const ObjectCode& argObjCode-----需要反汇编的目标指令
//出口参数: string& argDataOut---------------反汇编的结果
//返回值:int-------------STATUS_OK表示操作成功,其他表示操作失败
//开发人员:杨军
//开发日期:2004-4-29
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CDebugCmd::UnassembleSingleInstruction(const ObjectCode& argObjCode, string& argDataOut)
{
  //----------------变量定义部分 begins-----------------------------
  int iRegNumber = 0;
  U2 u2EAAddress = 0;
  char szTemp[20];
  //----------------变量定义部分 ends-------------------------------
  //---------对读出的指令进行反编译---------------------------------
  //处理操作码
  switch (argObjCode.instructionType)
  {
  case CASL_LD:
    argDataOut = "LD";
    break;
  case CASL_LEA:
    argDataOut = "LEA";
    break;
  case CASL_ST:
    argDataOut = "ST";
    break;
  case CASL_ADD:
    argDataOut= "ADD";
    break;
  case CASL_SUB:
    argDataOut= "SUB";
    break;
  case CASL_AND:
    argDataOut= "AND";
    break;
  case CASL_OR:
    argDataOut= "OR";
    break;
  case CASL_EOR:
    argDataOut= "EOR";
    break;
  case CASL_CPA:
    argDataOut= "CPA";
    break;
  case CASL_CPL:
    argDataOut= "CPL";
    break;
  case CASL_SLA:
    argDataOut= "SLA";
    break;
  case CASL_SRA:
    argDataOut= "SRA";
    break;
  case CASL_SLL:
    argDataOut= "SLL";
    break;
  case CASL_SRL:
    argDataOut= "SRL";
    break;
  case CASL_JMP:
    argDataOut= "JMP";
    break;
  case CASL_JPZ:
    argDataOut= "JPZ";
    break;
  case CASL_JMI:
    argDataOut= "JMI";
    break;
  case CASL_JNZ:
    argDataOut= "JNZ";
    break;
  case CASL_JZE:
    argDataOut= "JZE";
    break;
  case CASL_PUSH:
    argDataOut= "PUSH";
    break;
  case CASL_POP:
    argDataOut= "POP";
    break;
  case CASL_CALL:
    argDataOut= "CALL";
    break;
  case CASL_RET:
    argDataOut= "RET";
    break;
  case CASL_IN:
    break;
  case CASL_OUT:
    break;
  case CASL_EXIT:
    argDataOut= "EXIT";
    break;
  case CASL_SET_ALABEL:
    argDataOut= "SET_ALABEL";
    break;
  case CASL_SET_NLABEL:
    argDataOut= "NLABEL";
    break;
  case CASL_FUNC_IN:
    argDataOut= "FUNC_IN";
    break;
  case CASL_FUNC_OUT:
    argDataOut= "FUNC_OUT";
    break;
  default:   //未支持的指令类型
    argDataOut= "????";
    break;    
  }

  argDataOut.append("  ");

  //处理操作数
  //POP指令只能有通用寄存器操作数
  if (CASL_POP == argObjCode.instructionType)
  {
    //处理通用寄存器操作数
    iRegNumber = (argObjCode.regNumber & 0x0f);
    if (REG_EMPTY != iRegNumber)
    {
      sprintf(szTemp, "GR%d", iRegNumber);
      argDataOut.append(szTemp);
    }
  }
  else
  {
    //处理通用寄存器操作数
    iRegNumber = (argObjCode.regNumber & 0x0f);
    if (REG_EMPTY != iRegNumber)
    {
      sprintf(szTemp, "GR%d, ", iRegNumber);
      argDataOut.append(szTemp);
    }
    //处理有效地址操作数
    u2EAAddress = *(U2*)argObjCode.address;
    sprintf(szTemp, "%0 4x, ", u2EAAddress);
    argDataOut.append(szTemp);

    iRegNumber = ((argObjCode.regNumber >> 4 ) & 0x0f);
    if (REG_EMPTY != iRegNumber)
    {
      sprintf(szTemp, "GR%d", iRegNumber);
      argDataOut.append(szTemp);
    }

  }  

  CaslUtil::MakeUpperCase(argDataOut);
  
  return STATUS_OK;
}


/////////////////////////////////////////////////////////////////////////
//函数名称:ShowNextInstruction
//函数功能:----显示下一条将要执行的指令,即PC指向的指令------------------------
//入口参数:无
//出口参数:无
//返回值:int-------------STATUS_OK表示操作成功,其他表示操作失败
//开发人员:杨军
//开发日期:2004-4-29
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CDebugCmd::ShowNextInstruction() 
{
  //--------------变量定义部分 begins-----------------------------------
  string strInstruction;
  char szAddress[10];
  //--------------变量定义部分 ends   ----------------------------------
  //读出PC指向的指令
  m_pVM->ReadInstruction();
  if (STATUS_OK == UnassembleSingleInstruction(m_pVM->m_objInstruction, strInstruction))
  {
    sprintf(szAddress, "%0 4x:", (m_pVM->m_PC << 1));
    strInstruction.insert(0, szAddress);
    cout << strInstruction << endl;
  }
  else
  {
    return STATUS_FAILED;
  }
  return STATUS_OK;
}

/////////////////////////////////////////////////////////////////////////
//函数名称:DbgCmd_Help
//函数功能:---------------------帮助功能的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int-------------STATUS_OK表示操作成功,其他表示操作失败
//开发人员:杨军
//开发日期:2004-4-29
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CDebugCmd::DbgCmd_Help() 
{
    /*
     *	assemble     A [address]
compare      C range address
dump         D [range]
enter        E address [list]
fill         F range list
go           G [=address] [addresses]
hex          H value1 value2
input        I port
load         L [address] [drive] [firstsector] [number]
move         M range address
name         N [pathname] [arglist]
output       O port byte
proceed      P [=address] [number]
quit         Q
register     R [register]
search       S range list
trace        T [=address] [value]
unassemble   U [range]
write        W [address] [drive] [firstsector] [number]
     */  
  
  cout << "assemble     A [address]" << endl;
  cout << "compare      C range address" << endl;
  cout << "dump         D [range]" << endl;
  cout << "go           G [=address] [addresses]" << endl;
  cout << "proceed      P [=address] [number]" << endl;
  cout << "quit         Q" << endl;
  cout << "trace        T [=address] [value]" << endl;
  cout << "unassemble   U [range]" << endl;


  return STATUS_OK;
}

⌨️ 快捷键说明

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