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

📄 d51.cpp

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