/*********************************************************/
/* Name: C51disassembler.c */
/* Copyright: NULL */
/* Author: Chongchi */
/* Date: 2015-3-17 15:00 */
/* Description: C51反汇编源码,仅限反汇编bin文件 */
/* 对于C51 Hex文件需要使用Hex2Bin转换为bin文件 */
/* compiler: Dev-C++ 5.6.3 */
/*********************************************************/
#include <stdlib.h>
#include <stdio.h>
#define ADDR_16 3
#define ADDR_11 2
#define DATA_08 1
#define DATA_00 0
typedef struct MCS51
{
int instructions;
char len;
char arg_flag;
char *p;
}MCS51;
// Article 256 the assembly instructions
MCS51 CmdSet[]={
{0x00,1,DATA_00,"NOP"}, // 空指令 PC+1->PC
{0x01,2,ADDR_11,"AJMP %#06X"}, // 无条件跳转指令之一,叫做绝对跳转,11bit地址范围为正负2K单元
{0x02,3,ADDR_16,"LJMP %#06X"}, // 长转移指令,16bit地址
{0x03,1,DATA_00,"RR A"}, // ACC 右移一位
{0x04,1,DATA_00,"INC A"}, // ACC 加1
{0x05,2,DATA_08,"INC [%#04X]"}, // direct地址指向的内容加1
{0x06,1,DATA_00,"INC @R0"},
{0x07,1,DATA_00,"INC @R1"}, //Rn存储地址,该地址指向的内容加1
{0x08,1,DATA_00,"INC R0"},
{0x09,1,DATA_00,"INC R1"},
{0x0A,1,DATA_00,"INC R2"},
{0x0B,1,DATA_00,"INC R3"},
{0x0C,1,DATA_00,"INC R4"},
{0x0D,1,DATA_00,"INC R5"},
{0x0E,1,DATA_00,"INC R6"},
{0x0F,1,DATA_00,"INC R7"}, // Rn 内容加1
{0x10,3,DATA_08,"JBC %#04X,%#04X"}, // 判断Bit位 Bit==0,PC<-(PC)+3,否则PC<-(PC)+3+rel。清Bit位
{0x11,2,ADDR_11,"ACALL %#06X"}, // bit[0-7] + bit[8-10]
{0x12,3,ADDR_16,"LCALL %#06X"},
{0x13,1,DATA_00,"RRC A"},
{0x14,1,DATA_00,"DEC A"},
{0x15,2,DATA_08,"DEC [%#04X]"},
{0x16,1,DATA_00,"DEC @R0"},
{0x17,1,DATA_00,"DEC @R1"}, //Rn存储地址,该地址指向的内容减1
{0x18,1,DATA_00,"DEC R0"},
{0x19,1,DATA_00,"DEC R1"},
{0x1A,1,DATA_00,"DEC R2"},
{0x1B,1,DATA_00,"DEC R3"},
{0x1C,1,DATA_00,"DEC R4"},
{0x1D,1,DATA_00,"DEC R5"},
{0x1E,1,DATA_00,"DEC R6"},
{0x1F,1,DATA_00,"DEC R7"}, // Rn 内容减1
{0x20,3,DATA_08,"JB %#04X,%#04X"}, // 判断Bit位 Bit==0,PC<-(PC)+3,否则PC<-(PC)+3+rel
{0x21,2,ADDR_11,"AJMP %#06X"},
{0x22,1,DATA_00,"RET"},
{0x23,1,DATA_00,"RL A"},
{0x24,2,DATA_08,"ADD A,%#04X"},
{0x25,2,DATA_08,"ADD A,[%#04X]"},
{0x26,1,DATA_00,"ADD A,@R0"},
{0x27,1,DATA_00,"ADD A,@R1"},
{0x28,1,DATA_00,"ADD A,R0"},
{0x29,1,DATA_00,"ADD A,R1"},
{0x2A,1,DATA_00,"ADD A,R2"},
{0x2B,1,DATA_00,"ADD A,R3"},
{0x2C,1,DATA_00,"ADD A,R4"},
{0x2D,1,DATA_00,"ADD A,R5"},
{0x2E,1,DATA_00,"ADD A,R6"},
{0x2F,1,DATA_00,"ADD A,R7"},
{0x30,3,DATA_08,"JNB %#04X,%#04X"}, // 判断Bit位 Bit==0,PC<-(PC)+3+rel,否则PC<-(PC)+3
{0x31,2,ADDR_11,"ACALL %#06X"},
{0x32,1,DATA_00,"RETI"},
{0x33,1,DATA_00,"RLC A"},
{0x34,2,DATA_08,"ADDC A,%#04X"},
{0x35,2,DATA_08,"ADDC A,[%#04X]"},
{0x36,1,DATA_00,"ADDC A,@R0"},
{0x37,1,DATA_00,"ADDC A,@R1"},
{0x38,1,DATA_00,"ADDC A,R0"},
{0x39,1,DATA_00,"ADDC A,R1"},
{0x3A,1,DATA_00,"ADDC A,R2"},
{0x3B,1,DATA_00,"ADDC A,R3"},
{0x3C,1,DATA_00,"ADDC A,R4"},
{0x3D,1,DATA_00,"ADDC A,R5"},
{0x3E,1,DATA_00,"ADDC A,R6"},
{0x3F,1,DATA_00,"ADDC A,R7"},
{0x40,2,DATA_08,"JC %#04X"}, // 判断位累加器C C==0,PC<-(PC)+3,否则PC<-(PC)+3+rel
{0x41,2,ADDR_11,"AJMP %#06X"},
{0x42,2,DATA_08,"ORL [%#04X], A"},
{0x43,3,DATA_08,"ORL [%#04X],%#06X"},
{0x44,2,DATA_08,"ORL A,%#04X"},
{0x45,2,DATA_08,"ORL A,[%#04X]"},
{0x46,1,DATA_00,"ORL A,@R0"},
{0x47,1,DATA_00,"ORL A,@R1"},
{0x48,1,DATA_00,"ORL A,R0"},
{0x49,1,DATA_00,"ORL A,R1"},
{0x4A,1,DATA_00,"ORL A,R2"},
{0x4B,1,DATA_00,"ORL A,R3"},
{0x4C,1,DATA_00,"ORL A,R4"},
{0x4D,1,DATA_00,"ORL A,R5"},
{0x4E,1,DATA_00,"ORL A,R6"},
{0x4F,1,DATA_00,"ORL A,R7"},
{0x50,2,DATA_08,"JNC %#04X"}, // 判断位累加器C C==0,PC<-(PC)+3+rel,否则PC<-(PC)+3
{0x51,2,ADDR_11,"ACALL %#06X"},
{0x52,2,DATA_08,"ANL [%#04X],A"},
{0x53,3,DATA_08,"ANL [%#04X],%#06X"},
{0x54,2,DATA_08,"ANL A,%#04X"},
{0x55,2,DATA_08,"ANL A,[%#04X]"},
{0x56,1,DATA_00,"ANL A,@R0"},
{0x57,1,DATA_00,"ANL A,@R1"},
{0x58,1,DATA_00,"ANL A,R0"},
{0x59,1,DATA_00,"ANL A,R1"},
{0x5A,1,DATA_00,"ANL A,R2"},
{0x5B,1,DATA_00,"ANL A,R3"},
{0x5C,1,DATA_00,"ANL A,R4"},
{0x5D,1,DATA_00,"ANL A,R5"},
{0x5E,1,DATA_00,"ANL A,R6"},
{0x5F,1,DATA_00,"ANL A,R7"},
{0x60,2,DATA_08,"JZ %#04X"}, //PC+2->PC,A=0顺序执行,否则PC+rel->PC
{0x61,2,ADDR_11,"AJMP %#06X"},
{0x62,2,DATA_08,"XRL [%#04X],A"},
{0x63,3,DATA_08,"XRL [%#04X],%#04X"},
{0x64,2,DATA_08,"XRL A,%#06X"},
{0x65,2,DATA_08,"XRL A,[%#06X]"},
{0x66,1,DATA_00,"XRL A,@R0"},
{0x67,1,DATA_00,"XRL A,@R1"},
{0x68,1,DATA_00,"XRL A,R0"},
{0x69,1,DATA_00,"XRL A,R1"},
{0x6A,1,DATA_00,"XRL A,R2"},
{0x6B,1,DATA_00,"XRL A,R3"},
{0x6C,1,DATA_00,"XRL A,R4"},
{0x6D,1,DATA_00,"XRL A,R5"},
{0x6E,1,DATA_00,"XRL A,R6"},
{0x6F,1,DATA_00,"XRL A,R7"},
{0x70,2,DATA_08,"JNZ %#04X"}, //PC+2->PC,A=0顺序执行,否则PC+rel->PC
{0x71,2,ADDR_11,"ACALL %#06X"},
{0x72,2,DATA_08,"ORL C,%#04X"},
{0x73,1,DATA_00,"JMP @A+DPTR"},
{0x74,2,DATA_08,"MOV A,%#04X"}, //MOV A,#data
{0x75,3,DATA_08,"MOV [%#04X],%#04X"},
{0x76,2,DATA_08,"MOV @R0,%#04X"},
{0x77,2,DATA_08,"MOV @R1,%#04X"},
{0x78,2,DATA_08,"MOV R0,%#04X"},
{0x79,2,DATA_08,"MOV R1,%#04X"},
{0x7A,2,DATA_08,"MOV R2,%#04X"},
{0x7B,2,DATA_08,"MOV R3,%#04X"},
{0x7C,2,DATA_08,"MOV R4,%#04X"},
{0x7D,2,DATA_08,"MOV R5,%#04X"},
{0x7E,2,DATA_08,"MOV R6,%#04X"},
{0x7F,2,DATA_08,"MOV R7,%#04X"}, //MOV Rn, #data
{0x80,2,DATA_08,"SJMP %#04X"}, // 短转移指令,PC+2+rel->PC
{0x81,2,ADDR_11,"AJMP %#06X"},
{0x82,2,DATA_08,"ANL C,[%#04X]"},
{0x83,1,DATA_00,"MOVC A,@A+PC"},
{0x84,1,DATA_00,"DIV AB"},
{0x85,3,DATA_08,"MOV [%#04X],[%#04X]"},
{0x86,2,DATA_08,"MOV [%#04X],@R0"},
{0x87,2,DATA_08,"MOV [%#04X],@R1"},
{0x88,2,DATA_08,"MOV [%#04X],R0"},
{0x89,2,DATA_08,"MOV [%#04X],R1"},
{0x8A,2,DATA_08,"MOV [%#04X],R2"},
{0x8B,2,DATA_08,"MOV [%#04X],R3"},
{0x8C,2,DATA_08,"MOV [%#04X],R4"},
{0x8D,2,DATA_08,"MOV [%#04X],R5"},
{0x8E,2,DATA_08,"MOV [%#04X],R6"},
{0x8F,2,DATA_08,"MOV [%#04X],R7"},
{0x90,3,ADDR_16,"MOV DPTR,%#06X"}, //addr16
{0x91,2,ADDR_11,"ACALL %#06X"},
{0x92,2,DATA_08,"MOV [%#04X],C"},
{0x93,1,DATA_00,"MOVC A,@A+DPTR"},
{0x94,2,DATA_08,"SUBB A,%#04X"},
{0x95,2,DATA_08,"SUBB A,[%#04X]"},
{0x96,1,DATA_00,"SUBB A,@R0"},
{0x97,1,DATA_00,"SUBB A,@R1"},
{0x98,1,DATA_00,"SUBB A,R0"},
{0x99,1,DATA_00,"SUBB A,R1"},
{0x9A,1,DATA_00,"SUBB A,R2"},
{0x9B,1,DATA_00,"SUBB A,R3"},
{0x9C,1,DATA_00,"SUBB A,R4"},
{0x9D,1,DATA_00,"SUBB A,R5"},
{0x9E,1,DATA_00,"SUBB A,R6"},
{0x9F,1,DATA_00,"SUBB A,R7"},
{0xA0,2,DATA_08,"ORL C,[%#04X]"},
{0xA1,2,ADDR_11,"AJMP %#06X"},
{0xA2,2,DATA_08,"MOV C,%#04X"}, // C CF标志位
{0xA3,1,DATA_00,"INC DPTR"},
{0xA4,1,DATA_00,"MUL AB"},
{0xA5,1,DATA_00,"NULL"},
{0xA6,2,DATA_08,"MOV @R0,[%#04X]"},
{0xA7,2,DATA_08,"MOV @R1,[%#04X]"},
{0xA8,2,DATA_08,"MOV R0,[%#04X]"},
{0xA9,2,DATA_08,"MOV R1,[%#04X]"},
{0xAA,2,DATA_08,"MOV R2,[%#04X]"},
{0xAB,2,DATA_08,"MOV R3,[%#04X]"},
{0xAC,2,DATA_08,"MOV R4,[%#04X]"},
{0xAD,2,DATA_08,"MOV R5,[%#04X]"},
{0xAE,2,DATA_08,"MOV R6,[%#04X]"},
{0xAF,2,DATA_08,"MOV R7,[%#04X]"}, //MOV Rn, DirectAddr
{0xB0,2,DATA_08,"ANL C,[%#04X]"},
{0xB1,2,ADDR_11,"ACALL %#06X"},
{0xB2,2,DATA_08,"CPL [%#04X]"},
{0xB3,1,DATA_00,"CPL C"},
{0xB4,3,DATA_08,"CJNE A,%#04X,%#04X"}, //PC+3->PC,A==#data 顺序执行,否则PC+rel->PC
{0xB5,3,DATA_08,"CJNE A,[%#04X],%#04X"}, //PC+3->PC,A==[direct]顺序执行,否则PC+rel->PC
{0xB6,3,DATA_08,"CJNE @R0,%#04X,%#04X"}, //PC+3->PC,@R0==#data 顺序执行,否则PC+rel->PC
{0xB7,3,DATA_08,"CJNE @R1,%#04X,%#04X"},
{0xB8,3,DATA_08,"CJNE