[讨论] 研究一下8051的A5指令

wsmysyn   2017-10-5 22:06 楼主
动机: 前段时间看到论坛里的大神在搞STM8的反汇编工具(不过STM8没玩过),突然自己想搞一个8051的反汇编,虽然网上也是一堆堆的,不过我觉得还是自己动手加深一下理解吧。整理了一下MCS-51的指令集,一共111条指令,扩写之后在表格中占据了255个格子。 00.png 疑问来了,为什么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软件老是提示下载失败,什么鬼?我确定我是断电点击下载,然后上电的流程。 会出现很大几率下载失败,提示没有断电,还在供电等等,好久没用那块板子了,鬼知道出什么问题了 TIM截图20171005210251.png DS1Z_QuickPrint2.jpg --END-- 本帖最后由 wsmysyn 于 2017-10-5 23:39 编辑
坐而言不如起而行

回复评论 (6)

未定义的指令,产生的效果是不确定的。除非针对某一硬件测试过了,然后拿来干坏事?
ps, 楼主用的 DS1054Z ? DS1104Z?
点赞  2017-10-5 22:39
引用: cruelfox 发表于 2017-10-5 22:39
未定义的指令,产生的效果是不确定的。除非针对某一硬件测试过了,然后拿来干坏事?
ps, 楼主用的 DS1054Z ...

这个指令本身在原始的8051应该是未定义的,手上就只有两个是8051核的,拿来看一下,就不是一样的。起码68013文档说了A5是和00等效的,STC文档里没有看到,好奇试一下。
未定义,到底是什么情况,CPU会乱掉还是怎么样。。

示波器是1104Z,100MHz 4通道。
坐而言不如起而行
点赞  2017-10-5 23:29
楼主没必要直接拿实际的单片机进行验证的。
可以在keil上选各种51内核单片机,进行仿真运行。只需单步执行A5指令,然后观察PC增加情况及执行后跳转情况即可,非常方便。
点赞  2017-10-6 01:14
引用: joywyc 发表于 2017-10-6 01:14
楼主没必要直接拿实际的单片机进行验证的。
可以在keil上选各种51内核单片机,进行仿真运行。只需单步执行 ...

问题是并不一定和真实的效果一样。
另外编译器默认并不支持A5指令,编译不会生成A5指令的代码,所以再问如何要编译出来呢?
坐而言不如起而行
点赞  2017-10-6 08:24
首先A5(我觉得你应该是指的操作码0xA5)在8051指令集里面没有!其次是在设计单片机时候每个指令都会进行设计(这个表述可能有问题),所以一般设计单片机时候是不会随意添加这个操作码,如果添加了,就要在底层电路设计时候为这个指令的操作进行设计,并且还要确定编译器能够生成这个指令(我觉得编译器应该不会生成这个指令吧,毕竟不是指令集里面的,这个我就不太清楚)。最后就是如果真的人为设置执行到这个指令,但是单片机没有对这个指令进行操作(也就是设计单片机时候没有考虑到这个指令),那么一般都是会执行一个默认的操作,一般就是什么都不做(反正我设计电路时候就是这样),PC也会执行默认自加操作(51单片机pc不是自加1么?)。总的来说就是单片机没有设计这个指令操作,那么就会执行设计师设计的默认操作(啥都不执行,然后PC自加默认值)。
点赞  2017-11-21 17:58
在不同的公司设计的作用也不同,有一家做DEC DPTR单字节指令。指令表中没有这条。
点赞  2017-12-30 11:45
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复