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

📄 debugcmd.h

📁 这是一个软件水平资格考试中使用的CASL汇编语言的编译器,实现文件中包括一个编译器,一个虚拟机,一个类似于Debug的调试器.
💻 H
字号:
// DebugCmd.h: interface for the CDebugCmd class.
///////////////////////////////////////////////////////////////////////
//文件功能:实现调试器的功能,主要是将原先虚拟机中实现的调试器的功能
//         分离到这个类中以便于维护
//开发人员:杨军
//开发日期:2004-4-24
//修改人员:
//修改日期:
///////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_DEBUGCMD_H__A50EE760_E74C_47AC_B691_E9BCB5178AC4__INCLUDED_)
#define AFX_DEBUGCMD_H__A50EE760_E74C_47AC_B691_E9BCB5178AC4__INCLUDED_

#define EOI     0x00              //标识A命令中输入的汇编指令已经读到末尾

#include "PreInclude.h"
#include "CometVM.h"

class CDebugCmd  
{

public:
  //--------------对应的中间代码结构,用于生成目标代码---------------------
  typedef struct tagAssembleCode  {
    InstructionType  instType;  //指令类型 
    int iGRNumber;  //通用寄存器的编号
    int iXRNumber;  //变址寄存器的编号
    S2  s2ALabelAddress;   //IN, OUT指令中的ALabel的偏移量
    S2  s2NLabelAddress;   //IN, OUT指令中的NLabel的偏移量
    S2  s2Address;  //有效地址的偏移量
    bool bGRUse;    //标识是否使用了通用寄存器
    bool bXRUse;    //标识是否使用了变址寄存器
    bool bAddressUse; //标识是否使用了地址偏移量
    bool bALabelAddress;  //标识是否使用了ALabel的偏移量
    bool bNLabelAddress;  //标识是否使用了NLabel的偏移量
  } AssembleCode; 


public:
	CDebugCmd(CCometVM * argVM = NULL);
  virtual ~CDebugCmd()
  {
  }

  //-------------设置当前活动的虚拟机----------------------------------
  void SetActiveVM(CCometVM * argVM);
  //---------------------调试器的功能实现begins------------------------
  //---------------------帮助功能的执行函数----------------------------
  int DbgCmd_Help();
  //---------------------Assemple功能的执行函数------------------------
  int DbgCmd_Assemple(U2 argAddress);
  //---------------------Dump    功能的执行函数------------------------
  int DbgCmd_Dump(U2 argStartAddress, U2 argEndAddress);
  //---------------------Go    功能的执行函数------------------------
  int DbgCmd_Go(U2 argStartAddress, U2 argEndAddress);
  //---------------------Proceed 功能的执行函数------------------------
  int DbgCmd_Proceed(U2 argStartAddress, U2 argInstNumber);
  //---------------------Trace 功能的执行函数------------------------
  int DbgCmd_Trace(U2 argStartAddress, U2 argInstNumber);
  //---------------------Unassemble 功能的执行函数------------------------
  int DbgCmd_Unassemble(U2 argStartAddress, U2 argEndAddress);
  //---------------------产生一条源程序指令的中间代码,为生成目标代码
  //                     进行准备----------------------------------
  int PrepareSingleCaslStmt();
  //---------------------检测用户输入的一条Casl源程序------------------
  //                     是否符合Casl语言的文法标准--------------------
  int CheckSingleCaslStmt();
  //---------------------处理以字符A作为起始字符的指令----------------
  int Instruction_HeadedByA();
  //---------------------处理以字符C作为起始字符的指令----------------
  int Instruction_HeadedByC();
  //---------------------处理以字符E作为起始字符的指令----------------
  int Instruction_HeadedByE();
  //---------------------处理以字符I作为起始字符的指令----------------
  int Instruction_HeadedByI();
  //---------------------处理以字符J作为起始字符的指令----------------
  int Instruction_HeadedByJ();
  //---------------------处理以字符L作为起始字符的指令----------------
  int Instruction_HeadedByL();
  //---------------------处理以字符O作为起始字符的指令----------------
  int Instruction_HeadedByO(); 
  //---------------------处理以字符P作为起始字符的指令----------------
  int Instruction_HeadedByP(); 
  //---------------------处理以字符R作为起始字符的指令----------------
  int Instruction_HeadedByR(); 
  //---------------------处理以字符S作为起始字符的指令----------------
  int Instruction_HeadedByS();
  //-----用于A命令中获得用户输入的指令串的下一个字符,并改变索引指针-------
  char GetNextChar();
  //-----略过A命令中所获得用户输入的指令串中的多余的空格(包括制表符\t)------------------
  void PassBySpace();
  //-----处理A命令中所获得用户输入的指令串中的操作数中的GR与EA部分--------
  int HandleGRAndEA();
  //-----处理A命令中所获得用户输入的指令串中的操作数中的GR部分--------
  int HandleGR();
  //-----处理A命令中所获得用户输入的指令串中的操作数中的EA部分--------
  int HandleEA();
  //-----处理A命令中所获得用户输入的指令串中的操作数中的地址偏移部分---
  int HandleAddress(S2& argDataOut);
  //-----处理A命令中输入IN, OUT指令的操作数部分-----------------------
  int HandleALabelAndNLabel();
  //----显示当前运行上下文信息,包括寄存器,堆栈等信息-------------------
  int ShowRunContext();
  //----显示下一条将要执行的指令,即PC指向的指令------------------------
  int ShowNextInstruction();
  //----将指定的一条目标指令反汇编成Casl源程序指令---------------------------
  int UnassembleSingleInstruction(const ObjectCode& argObjCode, string& argDataOut);
  //---------------------调试器的功能实现ends  ------------------------
private:
  //---------------当前活动的虚拟机的指针------------------------------
  CCometVM * m_pVM;
  //-----------------------用于作为分界符的空格字符串---------------------
  char m_szSpace[10];
  //-----------------------存放用户在调试器的A命令中输入的汇编指令--------
  const char * m_cszInstruction; 
  //-----------------------处理A命令中的输入汇编指令时的长度--------------
  int m_iLen;
  //-----------------------处理A命令中的汇编指令时标识当前处理的字符指针--
  int  m_iPos;
  //-----------------------A命令中为了生成目标代码而使用的中间代码结构----
  AssembleCode  m_asmCode;
};

#endif // !defined(AFX_DEBUGCMD_H__A50EE760_E74C_47AC_B691_E9BCB5178AC4__INCLUDED_)

⌨️ 快捷键说明

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