?? dpic.cpp
字號(hào):
//=====================================================================================
//
// 模塊: 反匯編PIC16C5X
//
// 版本: 1.00
//
// 日期: 2007-07-10
//
// 作者: 施探宇
//
// 說(shuō)明: dpic -n rom.bin src.asm
//
//=====================================================================================
#include "stdafx.h"
// 保存標(biāo)號(hào)個(gè)數(shù)
#define MAX_LABELS 256
// 代碼地址上限
#define MAX_ADDRESS 0x400
// 最長(zhǎng)代碼字節(jié)(字節(jié)對(duì)齊)
#define CODE_MAX_BYTES 4
// 普通代碼長(zhǎng)度(字節(jié)對(duì)齊)
#define CODE_BYTES 2
// 代碼位數(shù)(實(shí)際指令位數(shù))
#define CODE_BITS 12
// 專(zhuān)用指令識(shí)別碼
#define CODE_GOTO_ID 0x0a00
#define CODE_CALL_ID 0x0900
// 狀態(tài)寄存器地址
#define REG_STATUS_ID 0x03
// 長(zhǎng)整型,所有指令都要改長(zhǎng),這樣改成別語(yǔ)言就方便;
typedef unsigned long UINT64;
typedef unsigned int UINT32;
typedef unsigned short UINT16;
typedef unsigned char UINT8;
typedef unsigned char BYTE;
//-----------------------------------------------------------------------------------
// 列表
//-----------------------------------------------------------------------------------
typedef struct tagDASM
{
// 代碼值
UINT64 CodeData;
// 代碼位
UINT64 CodeMask;
// 寄存器位
UINT64 RegsMask;
// 比特位
UINT64 BitsMask;
// 數(shù)據(jù)位
UINT64 DataMask;
// 輸出格式
_TCHAR *pCodeFmt;
}DASM_TBL;
//-----------------------------------------------------------------------------------
// 代碼轉(zhuǎn)換有優(yōu)先順序:格式為 printf("CODE %S,%S,%S",REG,BIT,DAT)
//-----------------------------------------------------------------------------------
// PIC指令有方向指令,ADDWF 0x06,W,ADDWF 0x05,F
// 共32調(diào)指令.
DASM_TBL tblCode[]=
{
// CODE-ID CO-MASK RG-MASK BI-MASK DA-MASK FORMAT
// 沒(méi)有操作數(shù),(5)
{ 0x0000, 0x0fff, 0x0000, 0x0000, 0x0000, _T("NOP")},
{ 0x0002, 0x0fff, 0x0000, 0x0000, 0x0000, _T("OPTION")},
{ 0x0003, 0x0fff, 0x0000, 0x0000, 0x0000, _T("SLEEP")},
{ 0x0004, 0x0fff, 0x0000, 0x0000, 0x0000, _T("CLRWDT")},
{ 0x0040, 0x0fff, 0x0000, 0x0000, 0x0000, _T("CLRW")},
// 單操作數(shù),不指定方向(3)
{ 0x0000, 0x0ff8, 0x0007, 0x0000, 0x0007, _T("TRIS %s")},
{ 0x0020, 0x0fe0, 0x001f, 0x0000, 0x0000, _T("MOVWF %s")},
{ 0x0060, 0x0fe0, 0x001f, 0x0000, 0x0000, _T("CLRF %s")},
// 單操作數(shù),需指定方向(13)
{ 0x0080, 0x0fc0, 0x001f, 0x0020, 0x0000, _T("SUBWF %s,%s")},
{ 0x00c0, 0x0fc0, 0x001f, 0x0020, 0x0000, _T("DECF %s,%s")},
{ 0x0100, 0x0fc0, 0x001f, 0x0020, 0x0000, _T("IORWF %s,%s")},
{ 0x0140, 0x0fc0, 0x001f, 0x0020, 0x0000, _T("ANDWF %s,%s")},
{ 0x01c0, 0x0fc0, 0x001f, 0x0020, 0x0000, _T("ADDWF %s,%s")},
{ 0x0200, 0x0fc0, 0x001f, 0x0020, 0x0000, _T("MOVF %s,%s")},
{ 0x0260, 0x0fc0, 0x001f, 0x0020, 0x0000, _T("COMF %s,%s")},
{ 0x0280, 0x0fc0, 0x001f, 0x0020, 0x0000, _T("INCF %s,%s")},
{ 0x02c0, 0x0fc0, 0x001f, 0x0020, 0x0000, _T("DECFSZ %s,%s")},
{ 0x0300, 0x0fc0, 0x001f, 0x0020, 0x0000, _T("RRF %s,%s")},
{ 0x0340, 0x0fc0, 0x001f, 0x0020, 0x0000, _T("RLF %s,%s")},
{ 0x0380, 0x0fc0, 0x001f, 0x0020, 0x0000, _T("SWAPF %s,%s")},
{ 0x03c0, 0x0fc0, 0x001f, 0x0020, 0x0000, _T("INCFSZ %s,%s")},
// 位操作,雙操作數(shù)(4)
{ 0x0400, 0x0f00, 0x001f, 0x00e0, 0x0000, _T("BCF %s,%s")},
{ 0x0500, 0x0f00, 0x001f, 0x00e0, 0x0000, _T("BSF %s,%s")},
{ 0x0600, 0x0f00, 0x001f, 0x00e0, 0x0000, _T("BTFSC %s,%s")},
{ 0x0700, 0x0f00, 0x001f, 0x00e0, 0x0000, _T("BTFSS %s,%s")},
// 立即數(shù)操作,單操作數(shù)(7)
{ 0x0800, 0x0f00, 0x0000, 0x0000, 0x00ff, _T("RETLW %s")},
{ 0x0900, 0x0f00, 0x0000, 0x0000, 0x00ff, _T("CALL %s")},
{ 0x0a00, 0x0e00, 0x0000, 0x0000, 0x01ff, _T("GOTO %s")},
{ 0x0d00, 0x0f00, 0x0000, 0x0000, 0x00ff, _T("IORLW %s")},
{ 0x0c00, 0x0f00, 0x0000, 0x0000, 0x00ff, _T("MOVLW %s")},
{ 0x0e00, 0x0f00, 0x0000, 0x0000, 0x00ff, _T("ANDLW %s")},
{ 0x0f00, 0x0f00, 0x0000, 0x0000, 0x00ff, _T("XORLW %s")},
};
//-----------------------------------------------------------------------------------
// 寄存器名稱(chēng)
//-----------------------------------------------------------------------------------
_TCHAR *arrRegs[]=
{
/*0x00*/ _T("INDF"),
/*0x01*/ _T("TMR0"),
/*0x02*/ _T("PCL"),
/*0x03*/ _T("STATUS"),
/*0x04*/ _T("FSR"),
/*0x05*/ _T("PORTA"),
/*0x06*/ _T("PORTB"),
/*0x07*/ _T("PORTC"),
};
//-----------------------------------------------------------------------------------
// 狀態(tài)位
//-----------------------------------------------------------------------------------
_TCHAR *arrStatus[]=
{
/*0x00*/ _T("C"),
/*0x01*/ _T("DC"),
/*0x02*/ _T("Z"),
/*0x03*/ _T("P"),
/*0x04*/ _T("T"),
/*0x05*/ _T("GP0"),
/*0x06*/ _T("GP1"),
/*0x07*/ _T("RST"),
};
//-----------------------------------------------------------------------------------
// 默認(rèn)文件名稱(chēng)
//-----------------------------------------------------------------------------------
_TCHAR *pStart = _T("");
_TCHAR *pBinFile = _T("rom.bin");
_TCHAR *pSrcFile = _T("src.asm");
_TCHAR buff[]=_T("0x0000");
// 文件指針
FILE *fpBin;
FILE *fpSrc;
// 默認(rèn)起始地址:
int iCodeStart = 0;
// 參數(shù)序號(hào)
int idArgv = 1;
// 指令緩沖區(qū)
BYTE pCodeBuff[CODE_MAX_BYTES];
// 存儲(chǔ)標(biāo)號(hào)和函數(shù)地址
UINT64 useLabels[MAX_LABELS];
UINT64 posLabels = 0;
// 顯示幫助
void ShowHelp();
// 狀態(tài)名
_TCHAR *GetStatuName(UINT64 nBits);
// 寄存器名
_TCHAR *GetRegname(UINT64 nReg);
// 登記標(biāo)號(hào)
int Preparse(UINT64 lCode);
// 代碼分析
int ParseCode(UINT64 lLine,UINT64 lCode,FILE *fpOut);
// 查找已登記標(biāo)號(hào)
int FindLabel(UINT64 lLine);
// 文件分析
int ParseFile(int iStart, FILE *pIn,FILE *pOut);
//=====================================================================================
// 開(kāi)始函數(shù)
//=====================================================================================
int main(int argc, _TCHAR* argv[])
{
// 判斷參數(shù)
if(argc < 2 || argc > 4)
{
ShowHelp();
#ifdef _DEBUG
getchar();
#endif
return -1;
}
// 默認(rèn)指向第一個(gè)參數(shù)
idArgv = 1;
pStart = argv[idArgv];
// 是否有地址參數(shù)?
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(" PIC16C5X 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(" PIC16C5X DISASM TOOLS(C) Version:1.00\n"));
printf(_T("---------------------------------------------------------------\n"));
printf(_T(" usage:dpic [-code address] <bin file> [src file]\n"));
printf(_T(" exp:dpic rom.bin\n"));
printf(_T(" dpic -2 rom.bin\n"));
printf(_T(" dpic -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;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -