📄 d51.cpp.bak
字号:
lCurLine |= (lCode & 0x00ff00) >> 8;
lCurLine |= (lLine & 0x00f800);
break;
case 0x00ff00:
lCurLine = (lCode & lMask) >> 8;
lCurLine += lLine;
break;
case 0x0000ff:
lCurLine = lCode & lMask;
lCurLine += lLine;
break;
default:
lCurLine = 0;
lCurLine += lLine;
printf("Format Error!\n");
break;
}
return lCurLine;
}
//=====================================================================================
// 行号,标号分析(要区分短跳转!和长跳转!)
//=====================================================================================
int RegistLabel(UINT64 lCode,UINT64 lLine)
{
//
// 16位为全地址,高5位为叶地址
// lLine 0000,0111,1111,1111
//
// lab16 = lcode.line
// lab11 = lLine & 0xf800 | lcode.line
// lab08 = lLine + lcode.line
//
UINT64 i = 0;
UINT64 lCount = sizeof(tblCode) / sizeof(DASM_TBL);
UINT64 lCurLine = 0;
UINT64 lMask = 0;
// 初始化
for( i = 0; i < lCount; i++ )
{
// 匹配指令集
if(((tblCode[i].CodeMask & lCode) == tblCode[i].CodeData))
{
// 含有标号
if(tblCode[i].LabsMask)
{
lMask = tblCode[i].LabsMask;
lCurLine = GetLabel(lCode,lLine,lMask);
// 登记标号
if(!FindLabel(lCurLine))
{
useLabels[posLabels] = lCurLine;
#ifdef _DEBUG
// printf("useLabels[%d] = %04x\n",posLabels,lCurLine);
#endif
posLabels++;
return 1;
}
}
}
}
return 0;
}
//=====================================================================================
// 是否登记行号
//=====================================================================================
int FindLabel(UINT64 lLine)
{
UINT64 i = 0;
for( i = 0; i < posLabels; i++ )
{
// 登记标号
if(useLabels[i] == lLine)
return 1;
}
return 0;
}
//=====================================================================================
// 取得寄存器名称!
//=====================================================================================
_TCHAR *GetRegname(UINT64 nReg)
{
int i = 0;
for(i = 0; i < (sizeof(arrRegs) / sizeof(arrRegs[0])); i++)
{
if(arrRegs[i].uAddr == nReg)
{
return arrRegs[i].pName;
}
}
sprintf(buff,_T("%02xH"),nReg);
return buff;
}
//=====================================================================================
// 代码分析
//=====================================================================================
int ParseCode(UINT64 lLine,UINT64 lCode,FILE *fpOut)
{
UINT64 i = 0;
UINT64 lCount = sizeof(tblCode) / sizeof(DASM_TBL);
_TCHAR buff1[64];
_TCHAR buff2[64];
_TCHAR buff3[64];
#ifdef _DEBUG
//printf("Code:%06x\n",lCode);
#endif
for( i = 0; i < lCount; i++ )
{
// 匹配指令集
if((tblCode[i].CodeMask & lCode) == tblCode[i].CodeData)
{
// 有需要的才标号,需要查表
if(FindLabel(lLine))
{
// 标号格式
fprintf(fpOut,_T("lab_%04x:\n"),lLine);
}
// 开始空点位置!
fprintf(fpOut,_T("\t\t"));
//-------------------------------------------------------------------------
// 类似:CJNE Rn,#data,Lab
//-------------------------------------------------------------------------
if(tblCode[i].RegsMask && tblCode[i].DataMask && tblCode[i].LabsMask)
{
if(tblCode[i].RegsMask == 0x010000)
sprintf(buff1,_T("@R%d"),(tblCode[i].RegsMask & lCode) >> 16);
else
sprintf(buff1,_T("R%d"),(tblCode[i].RegsMask & lCode) >> 16);
sprintf(buff2,_T("#%xH"),(tblCode[i].DataMask & lCode));
sprintf(buff3,_T("lab_%04x"),GetLabel(lCode,lLine,tblCode[i].LabsMask));
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1,buff2,buff3);
}
//-------------------------------------------------------------------------
// 类似:MOV Rn,#data
//-------------------------------------------------------------------------
else if(tblCode[i].RegsMask && tblCode[i].DataMask)
{
if(tblCode[i].RegsMask == 0x010000)
sprintf(buff1,_T("@R%d"),(tblCode[i].RegsMask & lCode) >> 16);
else
sprintf(buff1,_T("R%d"),(tblCode[i].RegsMask & lCode) >> 16);
sprintf(buff2,_T("#%xH"),(tblCode[i].DataMask & lCode));
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1,buff2);
}
//-------------------------------------------------------------------------
// 类似:MOV Rn,Ptr
//-------------------------------------------------------------------------
else if(tblCode[i].RegsMask && tblCode[i].PtrsMask)
{
if(tblCode[i].RegsMask == 0x010000)
sprintf(buff1,_T("@R%d"),(tblCode[i].RegsMask & lCode) >> 16);
else
sprintf(buff1,_T("R%d"),(tblCode[i].RegsMask & lCode) >> 16);
sprintf(buff2,_T("[%d]"),(tblCode[i].DataMask & lCode));
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1,buff2);
}
//-------------------------------------------------------------------------
// 类似:INC Rn,INC @R0
//-------------------------------------------------------------------------
else if(tblCode[i].RegsMask)
{
if(tblCode[i].RegsMask == 0x010000)
sprintf(buff1,_T("@R%d"),(tblCode[i].RegsMask & lCode) >> 16);
else
sprintf(buff1,_T("R%d"),(tblCode[i].RegsMask & lCode) >> 16);
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1);
}
//-------------------------------------------------------------------------
// 类似 JB Bit,Lab
//-------------------------------------------------------------------------
else if(tblCode[i].LabsMask && tblCode[i].BitsMask)
{
sprintf(buff1,_T("%02x"),lCode & tblCode[i].LabsMask);
sprintf(buff2,_T("lab_%04x"),GetLabel(lCode,lLine,tblCode[i].LabsMask));
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1,buff2);
}
//-------------------------------------------------------------------------
// 类似 CJNE A,#data,Lab
//-------------------------------------------------------------------------
else if(tblCode[i].LabsMask && tblCode[i].DataMask)
{
sprintf(buff1,_T("#%02xH"),lCode & tblCode[i].DataMask);
sprintf(buff2,_T("lab_%04x"),GetLabel(lCode,lLine,tblCode[i].LabsMask));
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1,buff2);
}
//-------------------------------------------------------------------------
// 类似 CJNE A,Ptr,Lab
//-------------------------------------------------------------------------
else if(tblCode[i].LabsMask && tblCode[i].PtrsMask)
{
sprintf(buff1,_T("#%02xH"),lCode & tblCode[i].DataMask);
sprintf(buff2,_T("lab_%04x"),GetLabel(lCode,lLine,tblCode[i].LabsMask));
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1,buff2);
}
//-------------------------------------------------------------------------
// 类似 STEB Bi
//-------------------------------------------------------------------------
else if(tblCode[i].BitsMask)
{
sprintf(buff1,_T("%04xH"),lCode & tblCode[i].BitsMask);
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1);
}
//-------------------------------------------------------------------------
// 类似 AJMP Lab
//-------------------------------------------------------------------------
else if(tblCode[i].LabsMask)
{
sprintf(buff1,_T("Lab_%04x"),GetLabel(lCode,lLine,tblCode[i].LabsMask));
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1);
}
//-------------------------------------------------------------------------
// 类似 MOV A,#data
//-------------------------------------------------------------------------
else if(tblCode[i].DataMask)
{
sprintf(buff1,_T("#%02xH"),lCode & tblCode[i].DataMask);
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1);
}
//-------------------------------------------------------------------------
// 类似 PUSH Ptr
//-------------------------------------------------------------------------
else if(tblCode[i].PtrsMask)
{
sprintf(buff1,_T("[%02xH]"),lCode & tblCode[i].DataMask);
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1);
}
//-------------------------------------------------------------------------
// 类似 WDTC,CLRA
//-------------------------------------------------------------------------
else if(!tblCode[i].DataMask && !tblCode[i].BitsMask && !tblCode[i].RegsMask && !tblCode[i].PtrsMask && !tblCode[i].LabsMask)
{
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt);
}
// 错误的匹配!
else
{
fprintf(fpOut,_T(";Error Code:%04x\n"), lCode);
printf(_T("Error Code:%04x\n"),lCode);
}
// 换行
fprintf(fpOut,_T("\n"));
break;
}
}
// 错误的指令
if(i >= lCount)
{
fprintf(fpOut,_T(";Unknow Code:%04x\n"),lCode);
printf(_T("Unknow Code:%04x\n"),lCode);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -