动机:
前段时间看到论坛里的大神在搞STM8的反汇编工具(不过STM8没玩过),突然自己想搞一个8051的反汇编,虽然网上也是一堆堆的,不过我觉得还是自己动手加深一下理解吧。整理了一下MCS-51的指令集,一共111条指令,扩写之后在表格中占据了255个格子。
疑问来了,为什么A5指令是空的呢,缺了一个?缺的是干嘛的,保留的,还是特殊用途的?问了度娘,资料比较少,提到的也不多。
百科有一句话是这样写的:
引用: (8)利用MCS-51中A5指令加密,其实世界上所有资料,包括英文资料都没有讲这条指令,其实这是很好的加密指令,A5功能是二字节空操作指令加密方法在A5后加一个二字节或三字节操作码,因为所有反汇编软件都不会反汇编A5指令,造成正常程序反汇编乱套,执行程序无问题仿制者就不能改变你的源程序。
网上说是用来加密,A5指令是一个两字节的指令,没有什么其他功能只是改变PC的值,自增两次,A5后跟的数据也随意,因为没有任何意义。
那么就试一试吧,看看到底什么效果,是解不出来乱掉了,还是真的就是2字节的指令。
由于要加入A5指令,功能也比较简单,就直接二进制文件写机器码吧。
硬件环境:
MCU:STC90C516RD+的一块小开发板,USB串口线
软件环境:
下载工具:STC-ISP
软件上可以直接修改固件缓冲区功能还不错。修改了一个小固件,来验证一下A5是1字节还是2两字节指令。
思路就是,MCU上电复位初始化后PC指向0000H地址开始取指令操作,就从0000H地址开始存放固件,中断向量入口不用管,因为也用不到。
固件如下:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
000000 A5 02 00 06 00 80 74 0F 75 90 00 C5 90 02 00 0B
000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000070 00 00 00 00 00 00 00 00 00 00 00 74 F0 75 90 00
000080 C5 90 02 00 80 00 00 00 00 00 00 00 00 00 00 00
1:如果A5是1字节指令,那么02会被认为是指令,长跳转跳过00 80,执行过程是
-->020006: LJMP 0006H
-->740F : MOV A, #0FH
-->759000: MOV 90H, #00H
-->C590 : XCH A, 90H ;000BH
-->020008: LJMP 000BH
功能就是让P1口的低四位输出方波
2:如果A5是两字节指令,02会被认为是数据,而后边的00、06、00都单字节指令没有,80为相对跳转指令,执行过程是:
-->8074 : SJMP 74H ;007BH
-->74F0 : MOV A, #F0H
-->759000 : MOV 90H, #00H
-->C590 : XCH A, 90H ;0080H
-->020080 : LJMP 0080H
功能就是P1口的高四位输出方波
3:如果A5会使得CPU解析指令乱掉,状态应该不确定,或者即使解码错误(不认为是指令)也只是把A5当做一字节指令,因为取完0000H的指令之后,PC已经指向下一个地址了,A5解析完并没有当做指令,下一个地址的数据认为是指令,然后效果等同于1字节指令?猜测
实际下载运行一下,示波器抓一下结果就知道了。
测试结果:
确实如网上所说,A5是一个2字节指令!
高四位的P1口在输出方波。
如果将A5修改为00,当然结果就是低四位在输出方波,程序功能应该没有问题
方波频率可以计算得到:
11.0592MHz晶体
6时钟 / 指令周期
循环部分为6指令周期高,6指令周期低,波形周期是12指令周期,所以方波频率:
f = 11.0592MHz / 6 / 12 = 153.6KHz,与示波器测到的非常接近。
后续:
之前用CY的68013,内核也是8051的,不过是兼容标准的8051,有增强的部分,关于A5指令,CY将他定义为了和00(NOP)指令一样的一个1字节指令。程序稍作修改,就可以拿来验证。
经过验证,A5在68013上确实是一个1字节指令,等同于NOP
改进:
验证里面没有确认A5执行后,到底是有哪些寄存器变化了,是否是真的只是一个“陷阱”作用的指令,并没有改变什么。推断应该是除了PC自增了两次以外,其他并没有改变,否则程序就诡异了
手里就只有这两个8051核的片子,其他的类型的没有验证,这个指令应该和具体硬件有关。
讨论:
1、大家之前有用过这个指令么?起码我是第一次看到这个,感觉挺神奇。
2、反汇编工具是否真的没有对A5指令做解析么?没有深入研究过。
3、看了神奇的A5指令以后,大家有打算用么?拿来干坏事?
4、A5指令在8051上的这个特性,有多大意义?
我想,最大意义好像也就是在于其他厂商开发自己的8051产品可以自定义A5指令来干其他的事情,这个意义貌似要比没有什么卵 用的“加密”功能来的有意义的多。
5、如果要是用编译器编译的时候使用到保留的A5指令,要怎么设置呢?宏?
补充问一下:
在下载程序过程中,STC-ISP软件老是提示下载失败,什么鬼?我确定我是断电点击下载,然后上电的流程。
会出现很大几率下载失败,提示没有断电,还在供电等等,好久没用那块板子了,鬼知道出什么问题了
--END--
本帖最后由 wsmysyn 于 2017-10-5 23:39 编辑