📄 debugcmd.cpp
字号:
//开发日期: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 + -