【发布时间】:2020-09-24 16:37:22
【问题描述】:
我有以下 8051 微控制器的十六进制操作码序列
785679107A247BFD7C347D407E51745568F869F96AFA6BFB6CFC6DFD6EFE
我发现这个 repo 将十六进制转换为指令序列https://github.com/anarcheuz/8051-disassembler。
使用它,我能够获得以下组装说明
x00000000: 37 38 MOV 38 (R0,#immed)
0x00000002: 35 ANL A,@R0
0x00000004: 37 39 MOV 39 (R1,#immed)
0x00000006: 31 30 37 JBC 3037 (bit,offset)
0x00000008: 37 41 MOV 41 (R2,#immed)
0x0000000a: 32 34 ADD 34 (A,#immed)
0x0000000c: 37 42 MOV 42 (R3,#immed)
0x0000000e: 46 MOV R5,A
0x00000010: 37 43 MOV 43 (R4,#immed)
0x00000012: 33 34 ADDC 34 (A,#immed)
0x00000014: 37 44 MOV 44 (R5,#immed)
0x00000016: 34 30 JC 30 (offset)
0x00000018: 37 45 MOV 45 (R6,#immed)
0x0000001a: 35 31 ACALL 31 (addr11)
0x0000001c: 37 34 MOV 34 (A,#immed)
0x0000001e: 35 35 ANL 35 (A,direct)
0x00000020: 36 XRL A,R0
0x00000022: 46 MOV R0,A
0x00000024: 36 XRL A,R1
0x00000026: 46 MOV R1,A
0x00000028: 36 XRL A,R2
0x0000002a: 46 MOV R2,A
0x0000002c: 36 XRL A,R3
0x0000002e: 46 MOV R3,A
0x00000030: 36 XRL A,R4
0x00000032: 46 MOV R4,A
0x00000034: 36 XRL A,R5
0x00000036: 46 MOV R5,A
0x00000038: 36 XRL A,R6
0x0000003a: 46 MOV R6,A
在 wikipedia 上有一个解释 https://en.wikipedia.org/wiki/Intel_MCS-51 操作的含义,但由于我在难以理解之前没有使用过组装或微控制器。
有人知道工作流程是什么,最后不同寄存器中的值是什么吗?
【问题讨论】:
-
可变长度指令集的正确反汇编应该以非线性的执行顺序进行。
-
首先您需要将机器代码正确地转换为可读的东西(汇编语言),然后逐条执行指令并在纸上或指令集模拟器上执行该操作,但这个任务看起来会更容易手工。
-
如果您在查找文档中的每个操作码时不知道该指令的含义,您可以查找其功能。
标签: assembly reverse-engineering microcontroller disassembly 8051