📄 d51.cpp.bak
字号:
// 指令缓冲区
BYTE pCodeBuff[CODE_MAX_BYTES];
// 存储标号和函数地址
UINT64 useLabels[MAX_LABELS];
UINT64 posLabels = 0;
// 显示帮助
void ShowHelp();
// 寄存器名
_TCHAR *GetRegname(UINT64 nReg);
int GetCodeSize(UINT64 lCode);
// 登记标号
int RegistLabel(UINT64 lCode,UINT64 lLine);
// 代码分析
int ParseCode(UINT64 lLine,UINT64 lCode,FILE *fpOut);
// 查找已登记标号
int FindLabel(UINT64 lLine);
// 文件分析
int ParseFile(int iStart, FILE *pIn,FILE *pOut);
//=====================================================================================
// 开始函数
//=====================================================================================
int main(int argc, _TCHAR* argv[])
{
// 判断参数
if(argc < 2 || argc > 4)
{
ShowHelp();
#ifdef _DEBUG
getchar();
#endif
return -1;
}
// 默认指向第一个参数
idArgv = 1;
pStart = argv[idArgv];
// 是否有地址参数?
if(pStart[0] == '-')
{
iCodeStart = atoi(&pStart[1]);
idArgv ++;
}
if(argc > idArgv )
{
pBinFile = argv[idArgv ];
}
if(argc > idArgv + 1)
{
pSrcFile = argv[idArgv +1];
}
fpBin = fopen(pBinFile,"rb");
if(!fpBin)
{
printf("Can't open bin file: %s!\n",pBinFile);
#ifdef _DEBUG
getchar();
#endif
return -1;
}
fpSrc = fopen(pSrcFile,"w+a");
if(!fpSrc)
{
fclose(fpBin);
printf("Can open src file: %s!\n",pSrcFile);
#ifdef _DEBUG
getchar();
#endif
return -1;
}
// 显示抬头
printf(_T(" MCS-51 Disasm tools(C) Version 1.00\n"));
printf(_T("---------------------------------------------------------------\n"));
printf(_T(" Code start: %x.\n"),iCodeStart);
printf(_T(" Input file: %s.\n"),pBinFile);
printf(_T(" Output file: %s.\n"),pSrcFile);
printf(_T("---------------------------------------------------------------\n"));
printf(_T(" QQ:190376601,TEL:13751152175 --Aleck.Shi\n"));
// 分析文件
ParseFile(iCodeStart,fpBin,fpSrc);
fclose(fpBin);
fclose(fpSrc);
// 处理完毕!
printf(_T(" Processed done!\n"));
#ifdef _DEBUG
getchar();
#endif
return 0;
}
//=====================================================================================
// 显示帮助
//=====================================================================================
void ShowHelp()
{
printf(_T(" MCS-51 Disasm tools(C) Version:1.00\n"));
printf(_T("---------------------------------------------------------------\n"));
printf(_T(" usage:d51 [-code address] <bin file> [src file]\n"));
printf(_T(" exp:d51 rom.bin\n"));
printf(_T(" d51 -2 rom.bin\n"));
printf(_T(" d51 -10 rom.bin src.asm\n"));
printf(_T("---------------------------------------------------------------\n"));
printf(_T(" QQ:190376601,TEL:13751152175 ----Aleck.Shi\n"));
}
//=====================================================================================
// 文件分析
//=====================================================================================
int ParseFile(int iStart, FILE *fpIn,FILE *fpOut)
{
UINT64 lCodePos = 0;
UINT64 lCode = 0;
int iSize = 0;
int i = 0;
fprintf(fpOut,_T(";//=====================================================================================\n"));
fprintf(fpOut,_T(";//\n"));
fprintf(fpOut,_T(";// 模块: <模块名称>\n"));
fprintf(fpOut,_T(";//\n"));
fprintf(fpOut,_T(";// 版本: <版本号>\n"));
fprintf(fpOut,_T(";//\n"));
fprintf(fpOut,_T(";// 日期: <日期>\n"));
fprintf(fpOut,_T(";//\n"));
fprintf(fpOut,_T(";// 作者: <作者>\n"));
fprintf(fpOut,_T(";//\n"));
fprintf(fpOut,_T(";// 说明: <模块说明>\n"));
fprintf(fpOut,_T(";//\n"));
fprintf(fpOut,_T(";//=====================================================================================\n"));
fprintf(fpOut,_T("\n"));
fprintf(fpOut,_T(";//-------------------------------------------------------------------------------------\n"));
fprintf(fpOut,_T(";// 常量定义:\n"));
fprintf(fpOut,_T(";//-------------------------------------------------------------------------------------\n"));
fprintf(fpOut,_T("\n"));
fprintf(fpOut,_T(";//-------------------------------------------------------------------------------------\n"));
fprintf(fpOut,_T(";// 变量定义:\n"));
fprintf(fpOut,_T(";//-------------------------------------------------------------------------------------\n"));
fprintf(fpOut,_T("\n"));
fprintf(fpOut,_T(";//-------------------------------------------------------------------------------------\n"));
fprintf(fpOut,_T(";// 代码开始:\n"));
fprintf(fpOut,_T(";//-------------------------------------------------------------------------------------\n"));
fprintf(fpOut,_T("\t\tORG 0x00\n"));
// 查找起始地址
fseek(fpIn,iStart,SEEK_SET);
//----------------------------------------------------
// 登记标号!
//----------------------------------------------------
posLabels = 0;
lCodePos = 0;
while(!feof(fpIn))
{
fread(pCodeBuff,1,CODE_BYTES,fpIn);
lCode = pCodeBuff[0] << 16;
iSize = GetCodeSize(lCode);
if(iSize > 1)
{
for(i = 0;i < CODE_MAX_BYTES; i++)
pCodeBuff[i] = 0;
fread(pCodeBuff,(iSize - 1),CODE_BYTES,fpIn);
lCode |= pCodeBuff[0] << 8;
lCode |= pCodeBuff[1] << 0;
}
// 登记标号
RegistLabel(lCode,lCodePos);
lCodePos += iSize;
// 地址上限检查
if(lCodePos >= MAX_ADDRESS)
break;
}
//----------------------------------------------------
// 查找起始地址
//----------------------------------------------------
fseek(fpIn,iStart,SEEK_SET);
lCodePos = 0;
while(!feof(fpIn))
{
// 读取数据
fread(pCodeBuff,1,CODE_BYTES,fpIn);
lCode = pCodeBuff[0] << 16;
iSize = GetCodeSize(lCode);
if(iSize > 1)
{
for(i = 0;i < CODE_MAX_BYTES; i++)
pCodeBuff[i] = 0;
fread(pCodeBuff,(iSize - 1),CODE_BYTES,fpIn);
lCode |= pCodeBuff[0] << 8;
lCode |= pCodeBuff[1] << 0;
}
// 代码生成
ParseCode(lCodePos,lCode,fpOut);
// 代码大小
lCodePos += iSize;
// 地址上限检查
if(lCodePos >= MAX_ADDRESS)
break;
}
fprintf(fpOut,_T("\t\tEND\n"));
fprintf(fpOut,_T(";//=====================================================================================\n"));
fprintf(fpOut,_T(";// 文件结束. <END OF FILE> \n"));
fprintf(fpOut,_T(";//=====================================================================================\n"));
return 0;
}
//=====================================================================================
// 查询指令的字节数
//=====================================================================================
int GetCodeSize(UINT64 lCode)
{
UINT64 i = 0;
UINT64 lCount = sizeof(tblCode) / sizeof(tblCode[0]);
UINT64 lLine = 0;
// 初始化
for( i = 0; i < lCount; i++ )
{
// 匹配指令集,查找字节数
if(((tblCode[i].CodeMask & lCode) == tblCode[i].CodeData))
{
return tblCode[i].nBytes;
}
}
printf("Unknow Code's Size!\n");
return 1;
}
//=====================================================================================
// 换算行号
//=====================================================================================
UINT64 GetLabel(UINT64 lCode,UINT64 lLine,UINT64 lMask)
{
UINT64 lCurLine = 0;
// 不同的标号
switch(lMask)
{
case 0x00ffff:
lCurLine = lCode & lMask;
break;
case 0xe0ff00:
lCurLine = (lCode & 0xe00000) >> 21;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -