今天有空,研究一下8051单片的的构造,写一个小案例,做逆向练习
这是需要烧录到单片机中的代码
```c
02 00 03 78 7F E4 F6 D8 FD 75 81 07 02 00 0F D2
90 A2 90 92 91 80 FA 00
通过查找单片机指令记录可以简单的得出上面指令的解析
020003 LJMP C:0003
c:0003 //这里是地址编号
787F MOV R0,#0X7F
E4 CLA A
c:0006 //这里是地址编号
F6 MOV @R0 A
D8FD DJNZ R0,C:0006
758107 MOV SP(0X81),#0X07
//上面是单片机的框架,下面才是程序的本身
//上面就是初始化程序需要用到的框架的数据
C:0F //这里是地址编号
D290 SETB 90(P1_0)
C:11 这里是地址编号
A290 MOV C,90(P1_0)
9291 MOV 0X90.1(P1_1),C
80FA SJMP C:11
//上面是代码的核心部分,不过是汇编的形式,如果转换为C语言的话,就是如下简单的几行代码
```c
```c
/*-----------------------------------------------------------------------------
定义 P1 (8 bits), P1.0, and P1.1.
-----------------------------------------------------------------------------*/
sfr P1 = 0x90; /* P1 */
sbit P1_0 = P1^0; /* P1.0 */
sbit P1_1 = P1^1; /* P1.1 */
void main (void)
{
P1_0 = 1; /* 置1输出 */
/*-----------------------------------------------
循环
-----------------------------------------------*/
while (1)
{
P1_1 = P1_0; /* 复制 P1.0 to P1.1 */
}
}
这里是手动,逆一个简单的程序, 如果是大型工程中的代码,远远比这工作量大,所以如果需要做这个工作,还需要编写工具,进行自动翻译成汇编,再从汇编到C,当然,如果对汇编比较熟悉的程序员,可能就不需要这一步了。
打开memory窗口,输入D:0xXX即可查看内部数据RAM内容,输入X:0xXXXX即可查看外部数据RAM内容,输入C:0xXXXX即可查看程序存储器内容。