📄 d51.cpp
字号:
break;
}
return lCurLine;
}
//=====================================================================================
// 行号,标号分析(要区分短跳转!和长跳转!)
//=====================================================================================
int RegistLabel(UINT64 lCode,UINT64 lLine)
{
//
// 16位为全地址,高5位为页地址
// lLine->0000,0111,1111,1111
//
// lab16 = abs_address
// lab11 = lLine & 0xf800 | lcode.line
// lab08 = lLine + lcode.line
//
UINT64 i = 0;
UINT64 lCount = (sizeof(tblCode) / sizeof(tblCode[0]));
UINT64 lCurLine = 0;
// 初始化
for( i = 0; i < lCount; i++ )
{
// 匹配指令集
if(((tblCode[i].CodeMask & lCode) == tblCode[i].CodeData))
{
// 含有标号
if(tblCode[i].LabsMask)
{
// 取绝对地址
lCurLine = GetLabel(lCode,lLine,tblCode[i].LabsMask);
// 查看是否登记!否则登记
if(!FindLabel(lCurLine))
{
useLabels[posLabels] = lCurLine;
#ifdef _DEBUG
printf("Labels[%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,FMT_PTR,nReg);
return buff;
}
//=====================================================================================
// 代码分析
//=====================================================================================
int ParseCode(UINT64 lLine,UINT64 lCode,FILE *fpOut)
{
UINT64 i = 0;
UINT64 lCount = sizeof(tblCode) / sizeof(DASM_TBL);
UINT64 id = 0;
_TCHAR buff1[64];
_TCHAR buff2[64];
_TCHAR buff3[64];
UINT64 R,B,D,P,L;
R = B = D = P = L = 0;
#ifdef _DEBUG
//printf("Code:%06x\n",lCode);
#endif
for( i = 0; i < lCount; i++ )
{
id = tblCode[i].CodeMask & lCode;
// 匹配指令集
if( id == tblCode[i].CodeData)
{
// 有需要的才标号,需要查表
if(FindLabel(lLine))
{
// 标号格式
fprintf(fpOut,FMT_LABCR,lLine);
}
// 开始空点位置!
fprintf(fpOut,_T("\t\t"));
R = tblCode[i].RegsMask;
B = tblCode[i].BitsMask;
D = tblCode[i].DataMask;
P = tblCode[i].PtrsMask;
L = tblCode[i].LabsMask;
//-------------------------------------------------------------------------
// 类似:CJNE Rn,#data,Lab
//-------------------------------------------------------------------------
if( R && !B && D && !P && L)
{
if(tblCode[i].RegsMask == 0x010000)
sprintf(buff1,FMT_RI,(tblCode[i].RegsMask & lCode) >> 16);
else
sprintf(buff1,FMT_RN,(tblCode[i].RegsMask & lCode) >> 16);
sprintf(buff2,FMT_DAT, (tblCode[i].DataMask & lCode) >> 8);
sprintf(buff3,FMT_LAB, GetLabel(lCode,lLine,tblCode[i].LabsMask));
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1,buff2,buff3);
}
//-------------------------------------------------------------------------
// 类似:MOV Rn,#data
//-------------------------------------------------------------------------
else if( R && !B && D && !P && !L)
{
if(tblCode[i].RegsMask == 0x010000)
sprintf(buff1,FMT_RI,(tblCode[i].RegsMask & lCode) >> 16);
else
sprintf(buff1,FMT_RN,(tblCode[i].RegsMask & lCode) >> 16);
sprintf(buff2,FMT_DAT,(tblCode[i].DataMask & lCode) >> 8);
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1,buff2);
}
//-------------------------------------------------------------------------
// 类似:MOV Rn,Ptr(86-A6,88-A8是反的)
//-------------------------------------------------------------------------
else if( R && !B && !D && P && !L)
{
if(tblCode[i].RegsMask == 0x010000)
sprintf(buff1,FMT_RI,(R & lCode) >> 16);
else
sprintf(buff1,FMT_RN,(R & lCode) >> 16);
strcpy(buff2,GetRegName((tblCode[i].PtrsMask & lCode) >> 8));
if(id == 0x00a60000 || id == 0x00a80000)
{
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff2,buff1);
}
else
{
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1,buff2);
}
}
//-------------------------------------------------------------------------
// 类似:MOV Rn,Lab
//-------------------------------------------------------------------------
else if( R && !B && !D && !P && L)
{
if(tblCode[i].RegsMask == 0x010000)
sprintf(buff1,FMT_RI,(tblCode[i].RegsMask & lCode) >> 16);
else
sprintf(buff1,FMT_RN,(tblCode[i].RegsMask & lCode) >> 16);
sprintf(buff2,FMT_LAB,GetLabel(lCode,lLine,tblCode[i].LabsMask));
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1,buff2);
}
//-------------------------------------------------------------------------
// 类似:INC Rn
//-------------------------------------------------------------------------
else if( R && !B && !D && !P && !L)
{
if(tblCode[i].RegsMask == 0x010000)
sprintf(buff1,FMT_RI,(tblCode[i].RegsMask & lCode) >> 16);
else
sprintf(buff1,FMT_RN,(tblCode[i].RegsMask & lCode) >> 16);
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1);
}
//-------------------------------------------------------------------------
// 类似 JB Bit,Lab
//-------------------------------------------------------------------------
else if(!R && B && !D && !P && L)
{
strcpy(buff1,GetRegName((B & lCode) >> 8));
sprintf(buff2,FMT_LAB,GetLabel(lCode,lLine,tblCode[i].LabsMask));
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1,buff2);
}
//-------------------------------------------------------------------------
// 类似 CJNE A,#data,Lab (3BYTE)
//-------------------------------------------------------------------------
else if(!R && !B && D && !P && L)
{
sprintf(buff1,FMT_DAT,(lCode & tblCode[i].DataMask) >> 8);
sprintf(buff2,FMT_LAB,GetLabel(lCode,lLine,tblCode[i].LabsMask));
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1,buff2);
}
//-------------------------------------------------------------------------
// 类似 CJNE A,Ptr,Lab (3BYTE)
//-------------------------------------------------------------------------
else if(!R && !B && !D && P && L)
{
strcpy(buff1,GetRegName((P & lCode) >> 8));
sprintf(buff2,FMT_LAB,GetLabel(lCode,lLine,tblCode[i].LabsMask));
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1,buff2);
}
//-------------------------------------------------------------------------
// 类似 MOV Ptr,#data (3BYTE) //注意!在85,数据是指针,因为该代码为双指针!所以用数据位来存!
//-------------------------------------------------------------------------
else if(!R && !B && D && P && !L)
{
strcpy(buff1,GetRegName((P & lCode) >> 8));
// 特殊指令
if(id == 0x00850000)
strcpy(buff2,GetRegName((D & lCode)));
else
sprintf(buff2,FMT_DAT,(D & lCode));
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1,buff2);
}
//-------------------------------------------------------------------------
// 类似 STEB Bi ( 2 BYTE )
//-------------------------------------------------------------------------
else if(!R && B && !D && !P && !L)
{
strcpy(buff1,GetRegName((B & lCode) >> 8));
//sprintf(buff1,FMT_BIT,(lCode & tblCode[i].BitsMask) >> 8);
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1);
}
//-------------------------------------------------------------------------
// 类似 AJMP Lab (2~3BYTE)
//-------------------------------------------------------------------------
else if(!R && !B && !D && !P && L)
{
sprintf(buff1,FMT_LAB,GetLabel(lCode,lLine,tblCode[i].LabsMask));
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1);
}
//-------------------------------------------------------------------------
// 类似 MOV A,#data (2BYTE)
//-------------------------------------------------------------------------
else if(!R && !B && D && !P && !L)
{
sprintf(buff1,FMT_DAT,(lCode & tblCode[i].DataMask) >> 8);
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1);
}
//-------------------------------------------------------------------------
// 类似 PUSH [Ptr] (2BYTE)
//-------------------------------------------------------------------------
else if(!R && !B && !D && P && !L)
{
strcpy(buff1,GetRegName((tblCode[i].PtrsMask & lCode) >> 8));
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1);
}
//-------------------------------------------------------------------------
// 类似 WDTC,CLRA ( 1 BYTE)
//-------------------------------------------------------------------------
else if(!R && !B && !D && !P && !L)
{
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 + -