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

📄 dpic.cpp

📁 PIC16C5X反汇编源代码!只要建好表格,反汇编其实很简单!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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("W                            EQU     H'0000'\n"));
	fprintf(fpOut,_T("F                            EQU     H'0001'\n"));
	fprintf(fpOut,_T("\n"));
	fprintf(fpOut,_T(";----- Register Files -----------------------------------------------------\n"));
	fprintf(fpOut,_T("\n"));
	fprintf(fpOut,_T("INDF                         EQU     H'0000'\n"));
	fprintf(fpOut,_T("TMR0                         EQU     H'0001'\n"));
	fprintf(fpOut,_T("PCL                          EQU     H'0002'\n"));
	fprintf(fpOut,_T("STATUS                       EQU     H'0003'\n"));
	fprintf(fpOut,_T("FSR                          EQU     H'0004'\n"));
	fprintf(fpOut,_T("PORTA                        EQU     H'0005'\n"));
	fprintf(fpOut,_T("PORTB                        EQU     H'0006'\n"));
	fprintf(fpOut,_T("\n"));
	fprintf(fpOut,_T(";----- STATUS Bits --------------------------------------------------------\n"));
	fprintf(fpOut,_T("\n"));
	fprintf(fpOut,_T("PA2                          EQU     H'0007'\n"));
	fprintf(fpOut,_T("PA1                          EQU     H'0006'\n"));
	fprintf(fpOut,_T("PA0                          EQU     H'0005'\n"));
	fprintf(fpOut,_T("NOT_TO                       EQU     H'0004'\n"));
	fprintf(fpOut,_T("NOT_PD                       EQU     H'0003'\n"));
	fprintf(fpOut,_T("Z                            EQU     H'0002'\n"));
	fprintf(fpOut,_T("DC                           EQU     H'0001'\n"));
	fprintf(fpOut,_T("C                            EQU     H'0000'\n"));
	fprintf(fpOut,_T("\n"));
	fprintf(fpOut,_T(";----- OPTION Bits --------------------------------------------------------\n"));
	fprintf(fpOut,_T("\n"));
	fprintf(fpOut,_T("T0CS                         EQU     H'0005'\n"));
	fprintf(fpOut,_T("T0SE                         EQU     H'0004'\n"));
	fprintf(fpOut,_T("PSA                          EQU     H'0003'\n"));
	fprintf(fpOut,_T("PS2                          EQU     H'0002'\n"));
	fprintf(fpOut,_T("PS1                          EQU     H'0001'\n"));
	fprintf(fpOut,_T("PS0                          EQU     H'0000'\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];
		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("\t\tEND\n"));
	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].CodeData == CODE_CALL_ID)||(tblCode[i].CodeData == CODE_GOTO_ID))&&(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 < (sizeof(arrRegs) / sizeof(arrRegs[0])))
	{
		return arrRegs[nReg];
	}
	else
	{
		// reg name
		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)
			{
				strcpy(buff1,GetRegname(tblCode[i].RegsMask & lCode));

				//	状态寄存器 (STATUS == REG_STATUS_ID)
				if((tblCode[i].RegsMask & lCode) == REG_STATUS_ID)
				{
					strcpy(buff2,GetStatuName((tblCode[i].BitsMask & lCode) >> 6));
				}
				else
				{
					//	判断方向位
					if(tblCode[i].BitsMask == 0x0020)
					{
						if(tblCode[i].BitsMask & lCode)
							sprintf(buff2,_T("%s"),_T("F"));
						else
							sprintf(buff2,_T("%s"),_T("W"));
					}
					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)
			{
				//	寄存器名称
				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].CodeData == CODE_CALL_ID) || (tblCode[i].CodeData == CODE_GOTO_ID))
				{
					sprintf(buff1,_T("lab_%04x"),tblCode[i].DataMask & lCode);
				}
				else
				{
					//	立即数处理
					sprintf(buff1,_T("H'%04X'"),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 + -