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

📄 d51.cpp

📁 反汇编MSC-51系列单片机源码!目前支持BIN文件,要想支持HEX格式!大家可以自己下载去修改!目前版本没有识别DATA段功能!
💻 CPP
📖 第 1 页 / 共 3 页
字号:
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"));

	for(i = 0; i < (sizeof(arrRegs) / sizeof(arrRegs[0])); i++)
	{
		fprintf(fpOut,_T(";%s\t\tEQU\t0x%02x\n"),arrRegs[i].pName,arrRegs[i].uAddr);
	}

	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;
		}

		//lCodePos += iSize;
		//	登记标号
		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;
		}
	
		//lCodePos += iSize;

		//	代码生成
		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;
		lCurLine |= (lCode & 0x00ff00) >> 8;
		lCurLine |= (lLine & 0x00f800);
		break;

	//	相对短地址
	case 0x00ff00:
		lCurLine = (lCode & lMask) >> 8;
		lCurLine = lLine + (char)lCurLine + GetCodeSize(lCode);
		break;

	//	相对短地址
	case 0x0000ff:
		lCurLine = lCode & lMask;
		lCurLine = lLine + (char)lCurLine + GetCodeSize(lCode);
		break;

	//	其他格式报错
	default:
		lCurLine = 0;
		lCurLine += lLine;
		printf("Label Format Error!\n");

⌨️ 快捷键说明

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