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

📄 dasm153.cpp

📁 EM78P153反汇编源码!反编译的代码文件可以直接编译,看了你就知道!原来反编译怎么这么简单!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//=====================================================================================
void ShowHelp()
{
	printf(_T(" EM78P153 DISASM TOOLS(C) Version:1.00\n"));
	printf(_T("---------------------------------------------------------------\n"));
	printf(_T(" usage:dasm153 [-code address] <bin file> [src file]\n"));
	printf(_T("   exp:dasm153 rom.bin\n"));
	printf(_T("       dasm153 -2 rom.bin\n"));
	printf(_T("       dasm153 -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;

	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("R0     == 0X00\n"));
	fprintf(fpOut,_T("TCC    == 0x01\n"));
	fprintf(fpOut,_T("PC     == 0x02\n"));
	fprintf(fpOut,_T("STATUS == 0x03\n"));
	fprintf(fpOut,_T("RSR    == 0x04\n"));
	fprintf(fpOut,_T("P5     == 0x05\n"));
	fprintf(fpOut,_T("P6     == 0x06\n"));
	fprintf(fpOut,_T("IOCB   == 0x0B\n"));
	fprintf(fpOut,_T("IOCC   == 0x0C\n"));
	fprintf(fpOut,_T("IOCD   == 0x0D\n"));
	fprintf(fpOut,_T("WTD    == 0x0E\n"));
	fprintf(fpOut,_T("RF     == 0x0F\n"));

	fprintf(fpOut,_T("\n"));
	fprintf(fpOut,_T("C      == 0x00\n"));
	fprintf(fpOut,_T("DC     == 0x01\n"));
	fprintf(fpOut,_T("Z      == 0x02\n"));
	fprintf(fpOut,_T("P      == 0x03\n"));
	fprintf(fpOut,_T("T      == 0x04\n"));
	fprintf(fpOut,_T("GP0    == 0x05\n"));
	fprintf(fpOut,_T("GP1    == 0x06\n"));
	fprintf(fpOut,_T("RST    == 0x07\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];
		lCode |= pCodeBuff[1] << 8;

		//	登记标号
		Preparse(lCode);

		lCodePos ++;
		//	地址上限检查
		if(lCodePos >= MAX_ADDRESS)
			break;
	}

	//	查找起始地址
	fseek(fpIn,iStart,SEEK_SET);
	lCodePos = 0;
	while(!feof(fpIn))
	{
		//	读取数据
		fread(pCodeBuff,1,CODE_BYTES,fpIn);

		//	转换代码
		lCode = pCodeBuff[0];
		lCode |= pCodeBuff[1] << 8;

		//	代码生成
		ParseCode(lCodePos,lCode,fpOut);
		lCodePos ++;

		//	地址上限检查
		if(lCodePos >= MAX_ADDRESS)
			break;
	}

	fprintf(fpOut,_T(";//=====================================================================================\n"));
	fprintf(fpOut,_T(";// 文件结束. <END OF FILE> \n"));
	fprintf(fpOut,_T(";//=====================================================================================\n"));
	return 0;
}

//=====================================================================================
//	行号,标号分析
//=====================================================================================
int Preparse(UINT64 lCode)
{
	UINT64 i = 0;	
	UINT64 lCount =  sizeof(tblCode) / sizeof(DASM_TBL);
	UINT64 lLine = 0;
	
	//	初始化
	for( i = 0; i < lCount; i++ )
	{
		//	寻找跳转: JMP k,CALL k
		if((tblCode[i].DataMask == 0x03ff) && (posLabels < MAX_LABELS))
		{
			//	匹配指令集
			if((tblCode[i].CodeMask & lCode) == tblCode[i].CodeData)
			{
				//	行号
				lLine = lCode & tblCode[i].DataMask;
				//	登记标号
				if(!FindLabel(lLine))
				{
					useLabels[posLabels] = lLine;
#ifdef _DEBUG
					printf("useLabels[%d] = %04x\n",posLabels,lLine);
#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)
{
	if(nReg < 16)
	{
		return arrRegs[nReg];
	}
	else
	{
		sprintf(buff,_T("0x%02x"),nReg);
	}
	return buff;
}

//=====================================================================================
//	取得状态位名称
//=====================================================================================
_TCHAR *GetStatuName(UINT64 nBits)
{
	if(nBits < 8)
	{
		return arrStatus[nBits];
	}
	return NULL;
}

//=====================================================================================
//	代码分析
//=====================================================================================
int ParseCode(UINT64 lLine,UINT64 lCode,FILE *fpOut)
{
	UINT64 i = 0;	
	UINT64 lCount =  sizeof(tblCode) / sizeof(DASM_TBL);

	_TCHAR buff1[64];
	_TCHAR buff2[64];
	
	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"));

			// 类似:BC r,b
			if(tblCode[i].RegsMask && tblCode[i].BitsMask)
			{
				//sprintf(buff1,_T("0x%02x"),tblCode[i].RegsMask & lCode);
				strcpy(buff1,GetRegname(tblCode[i].RegsMask & lCode));

				//sprintf(buff2,_T("%d"),(tblCode[i].BitsMask & lCode) >> 6);
				//	状态寄存器
				if((tblCode[i].RegsMask & lCode) == 3)
				{
					strcpy(buff2,GetStatuName((tblCode[i].BitsMask & lCode) >> 6));
				}
				else
				{
					sprintf(buff2,_T("%d"),(tblCode[i].BitsMask & lCode) >> 6);
				}
				fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1,buff2);
			}
			// 类似:INC r
			else if(tblCode[i].RegsMask)
			{
				//sprintf(buff1,_T("0x%02x"),tblCode[i].RegsMask & lCode);
				strcpy(buff1,GetRegname(tblCode[i].RegsMask & lCode));
				fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1);
			}
			//	类似 JMP k,CALL k
			else if(tblCode[i].DataMask)
			{
				//	函数位置
				if(tblCode[i].DataMask == 0x03ff)
				{
					sprintf(buff1,_T("lab_%04x"),tblCode[i].DataMask & lCode);
				}
				else
				{
					//	立即数处理
					sprintf(buff1,_T("@0x%02x"),tblCode[i].DataMask & lCode);
				}
				fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1);
			}
			//	类似 WDTC,CLRA
			else if(!tblCode[i].DataMask && !tblCode[i].BitsMask && !tblCode[i].RegsMask)
			{
				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 + -