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

📄 d51.cpp.bak

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