|
void main(void)
{
unsigned char code rst[]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32}; // 复位代码
(*((void (*)())(&rst)))(); // 执行上一行代码,将rst数组当函数调用
}
反汇编如下:
0000 020003 LJMP 0003H
0003 787F MOV R0,#7FH
0005 E4 CLR A
0006 F6 MOV @R0,A
0007 D8FD DJNZ R0,0006H
0009 758107 MOV SP,#07H
000C 02000F LJMP 000FH
000F 7A00 MOV R2,#00H
0011 7916 MOV R1,#16H
0013 02001C LJMP 001CH
0016 E4 CLR A
0017 C0E0 PUSH ACC
0019 C0E0 PUSH ACC
001B 32 RETI
001C 8A83 MOV DPH,R2
001E 8982 MOV DPL,R1
0020 E4 CLR A
0021 73 JMP @A+DPTR
0022 21FF AJMP 01FFH
0024 FF MOV R7,A
0025 FF MOV R7,A
我想说的是,对于上面的代码来说,JMp并不是跑到什么其他地方去了,我们可以看到A是0,DPTR的值就是0016,也就是对应E4的地方。
对于第2条语句,上面有人说的很清楚了,我就不重复了。
还想补充的是,上面的复位不完善,没有考虑中断和硬件方面的事情。 |
|