8051单片机反汇编指令集
Disassemble instruction set for 8051 microcontroller
我有以下用于 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
在维基百科上有关于这些操作的含义的解释 https://en.wikipedia.org/wiki/Intel_MCS-51,但由于我之前没有接触过汇编或微控制器,所以很难理解。
有人知道工作流程是什么以及最后不同寄存器中的值是什么吗?
这看起来像是 ASCII 字符串的反汇编,而不是它们所代表的二进制值!请注意,中间一列(机器代码)都是 0x30..46,即 '0'
到 'F'
.
的 ASCII 代码
例如您反汇编的前 2 个字节是 37 38
,它们是 '7'
和 '8'
的 ASCII 代码,但您想要的是单个 78
字节。
在将二进制文件提供给反汇编程序之前,您需要将其转储为二进制文件。
Easier/faster如果只是手工操作,请看一个8051指令集参考。
78 56 mov r0,#0x56
79 10 mov r1,#0x10
7A 24 mov r2,#0x24
7B FD mov r3,#0xFD
7C 34 mov r4,#0x34
7D 40 mov r5,#0x40
7E 51 mov r6,#0x51
74 55 A,#0x55
68 XRL A,R0
你可以再花五分钟完成剩下的。
输入radare2 (or its rizin fork, but you'll have to adjust the binary names).
$ rax2 -s 785679107A247BFD7C347D407E51745568F869F96AFA6BFB6CFC6DFD6EFE
xVyz${�|4}@~QtUh�i�j�k�l�m�n�
$ rasm2 -a 8051 -d 785679107A247BFD7C347D407E51745568F869F96AFA6BFB6CFC6DFD6EFE
mov r0, #0x56
mov r1, #0x10
mov r2, #0x24
mov r3, #0xfd
mov r4, #0x34
mov r5, #0x40
mov r6, #0x51
mov a, #0x55
xrl a, r0
mov r0, a
xrl a, r1
mov r1, a
xrl a, r2
mov r2, a
xrl a, r3
mov r3, a
xrl a, r4
mov r4, a
xrl a, r5
mov r5, a
xrl a, r6
mov r6, a
关于工作流程和最终的寄存器值,给定说明,笔和纸是学习的第一步。在这里有点矫枉过正,但是对于更大的代码,您可以转向仿真(似乎 unicorn 不支持 8051,搜索引擎会让您知道替代方案)。
我有以下用于 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
在维基百科上有关于这些操作的含义的解释 https://en.wikipedia.org/wiki/Intel_MCS-51,但由于我之前没有接触过汇编或微控制器,所以很难理解。
有人知道工作流程是什么以及最后不同寄存器中的值是什么吗?
这看起来像是 ASCII 字符串的反汇编,而不是它们所代表的二进制值!请注意,中间一列(机器代码)都是 0x30..46,即 '0'
到 'F'
.
例如您反汇编的前 2 个字节是 37 38
,它们是 '7'
和 '8'
的 ASCII 代码,但您想要的是单个 78
字节。
在将二进制文件提供给反汇编程序之前,您需要将其转储为二进制文件。
Easier/faster如果只是手工操作,请看一个8051指令集参考。
78 56 mov r0,#0x56
79 10 mov r1,#0x10
7A 24 mov r2,#0x24
7B FD mov r3,#0xFD
7C 34 mov r4,#0x34
7D 40 mov r5,#0x40
7E 51 mov r6,#0x51
74 55 A,#0x55
68 XRL A,R0
你可以再花五分钟完成剩下的。
输入radare2 (or its rizin fork, but you'll have to adjust the binary names).
$ rax2 -s 785679107A247BFD7C347D407E51745568F869F96AFA6BFB6CFC6DFD6EFE
xVyz${�|4}@~QtUh�i�j�k�l�m�n�
$ rasm2 -a 8051 -d 785679107A247BFD7C347D407E51745568F869F96AFA6BFB6CFC6DFD6EFE
mov r0, #0x56
mov r1, #0x10
mov r2, #0x24
mov r3, #0xfd
mov r4, #0x34
mov r5, #0x40
mov r6, #0x51
mov a, #0x55
xrl a, r0
mov r0, a
xrl a, r1
mov r1, a
xrl a, r2
mov r2, a
xrl a, r3
mov r3, a
xrl a, r4
mov r4, a
xrl a, r5
mov r5, a
xrl a, r6
mov r6, a
关于工作流程和最终的寄存器值,给定说明,笔和纸是学习的第一步。在这里有点矫枉过正,但是对于更大的代码,您可以转向仿真(似乎 unicorn 不支持 8051,搜索引擎会让您知道替代方案)。