摘 要: 提出了一种读取P89C51RD2隐藏分区的方法, 并给出了1K Boot ROM 区以外分区的部分程序。通过分析这些程序, 找到了P89C51RD2隐藏的特殊功能寄存器, 并基于这些程序分析了其flash的底层操作。
1 引 言
P89C51RD2是PH ILIPS 公司的8位单片机产品。在保证80C51指令系统和硬件结构的大体框架的同时, 扩充了许多功能, 包括看门狗、ISP功能和F lash操作。值得一提的是, PH ILIPS的技术并非完全公开, 这就给单片机的使用带来了一定的困难。
比如说, 它的Boot ROM 区本来是4K 字节, 但在手册中只提及了1K 字节, 其他部分程序隐藏调用, 这就给程序设计带来了很大的麻烦。同时, 除了手册中提及的高位地址特殊寄存器区, P89C51RD2 还设计了一些特殊功能寄存器, 对这些寄存器的意外访问也有可能造成芯片的异常。因此, 有必要对这些功能区进行分析, 以找出其所有单片机资源。
2 Boo tROM 固件代码的读出
对于1K ( 地址FC00H ~ FFFFH ) Boot ROM 的flash代码读取方法, 参考文献已经有提及, 这里只是在此基础上进行进一步分析。下面来看PGM _MTP入口地址的部分代码。
PUSH 0E4H ; 保存E4H值
ORL 0E 4H, # 80H ; 置位E4H 最高位
PUSH PSW
ACALL 0F9ADH ; 调用看门狗服务程序
C JNE R1, # 00H, 0FF4FH
ACALL 0F9D9H ; 读生产批号子程序
通过这部分程序可以看出, Boo tROM 区调用了0F9ADH 地址中的子程序, 而从手册上, 只写出有FC00H ~ FFFFH 地址。所以, 这是一个需要特殊访问的flash区。同时, 程序还控制了E4H, 这个特殊功能寄存器也是手册里面没有提及的。鉴于P89C51RD2有专门的控制位来控制1K flash, 假设还有一个控制位, 位于E4H 的最高位, 也是通过置位方式, 能够得到flash切换的效果, 只要程序中首先置位了E 4H, 就可以通过movc 指令得到隐藏区的程序。实践证明这个假设是对的, 从F000H ~FFFFH 都读出了数据, 其中F000H ~ F7FFH 地址中全为0。而F800H ~ FBFFH中存在1K 可执行程序,并且这些程序就是PGM _MTP调用的隐藏子程序。
通过反汇编这一区间程序, 可以找到全部flash底层操作的程序。所以实际的P89C51RD2的f lash 空间分布应该如图1所示。
手册里面1K 字节的Boo t ROM 区, 实际上是由一个4K 的flash块构成的, 其中2K 字节的flash最终被填写进00H, 另外2K 用于实现Boot ROM 的实际操作。所以, 用户也可以将这2K 的地址空间, 作为用户的使用空间, 存放一些需要保留的重要数据。
3 部分子程序分析
P89C51RD2多余的1K 程序空间写满了程序。
这些程序都是由FFF0的子程序调用的。通过反汇编这一段子程序, 能够知道单片机的底层操作细节。
由于篇幅所限, 这里面仅列出flash写操作的部分程序, 有兴趣的读者可以依照上面的方法反汇编所有程序进行分析。以下是编程数据字节子程序的反汇编结果。
; 编程数据字节一级子程序
F9C9: 75 E4 91MOV 0E4H, # 91H ; E4H 未公开
F9CC: 31 D1 ACALL 0F9D1H ;
F9CE: 65 E5 XRL A, 0E5H ; 返回E5H 参数
F9D0: 22 RET
; 编程数据字节二级子程序
F9D1: F5 E5MOV 0E5H, A
F9D3: 31 25 ACALL 0F925H ; 多入口子程序,连续写和读E6H, flash操作
F9D5: 75 E4 80MOV 0E4H, # 80H
F9D8: 22 RET
; 编程数据字节三级子程序