1# Disassembler反汇编工具
2
3## 简介
4
5Disassembler是ArkTS反汇编工具,如果开发者需要分析方舟字节码文件(\*.abc)相关问题,可使用Disassembler将字节数据反汇编成可阅读的汇编指令。
6
7工具随DevEco Studio SDK发布,以windows平台为例,Disassembler工具位置为:[DevEco Studio安装目录]\sdk\[SDK版本]\openharmony\toolchains\ark_disasm.exe8
9## 命令行说明
10
11反汇编命令:
12
13```
14ark_disasm.exe [options] input_file output_file
15```
16
17参数说明:
18
19| 参数 | 是否可缺省 | 描述 |
20| -------- | -------- | -------- |
21| [options] | 可缺省 | 命令选项,详见下文options选项说明。 |
22| input_file | 不可缺省 | 待反汇编的方舟字节码文件路径。 |
23| output_file | 不可缺省 | 反汇编内容的输出文件路径。 |
24
25options选项说明:
26
27| 选项 | 是否可缺省 | 是否存在入参 | 描述 |
28| -------- | -------- | -------- | -------- |
29| --debug | 可缺省 | 不带参数 | 使能输出调试信息,默认输出到屏幕。 |
30| --debug-file | 可缺省 | 带参数 | 如果使能了--debug,指定调试信息的输出文件。 |
31| --help | 可缺省 | 不带参数 | 打印帮助提示。 |
32| --skip-string-literals | 可缺省 | 不带参数 | 跳过对字符串字面量的反汇编。 |
33| --quiet | 可缺省 | 不带参数 | 使能所有'--skip-'开头的选项。 |
34| --verbose | 可缺省 | 不带参数 | 使能输出额外信息(字节位置、方舟字节码格式、操作码)。 |
35| --version | 可缺省 | 不带参数 | 显示配套方舟字节码文件版本号以及最低支持的方舟字节码文件版本。 |
36
37## 使用示例
38
39假设已存在方舟字节码文件:test.abc,其源代码如下:
40
41```
42let i = 99;
43function show(){return i;}
44show();
45```
46
47
48执行如下命令,就能生成反汇编文件:test.txt。生成的反汇编文件内带有操作码及格式等信息。
49
50```
51ark_disasm.exe test.abc test.txt
52```
53
54查看反汇编文件的内容。
55
56
57```
58cat test.txt
59```
60
61内容如下
62
63```
64# source binary: test.abc                                                    // 反汇编的方舟字节码文件
65
66.language ECMAScript
67
68# ====================
69# LITERALS                                                                   // 字面量数据
70
710 0x203 { 0 [
72	MODULE_REQUEST_ARRAY: {
73	};
74]}
75
76# ====================
77# RECORDS                                                                    // 模块定义数据
78
79.record _ESConcurrentModuleRequestsAnnotation {                              // _开头这些都是固定的模块数据
80}
81
82.record test {                                                               // 一个js文件对应一个模块数据,包含了模块的相关信息(在方舟字节码文件中的位置,是否是commonjs ...)
83	u8 isCommonjs = 0x0
84	u32 moduleRecordIdx = 0x203
85	......
86}
87
88# ====================
89# METHODS                                                                    // 方法定义数据
90
91L_ESSlotNumberAnnotation:
92	u32 slotNumberIdx { 0x0 }
93.function any test.#*#show(any a0, any a1, any a2) <static> {                // 此方法源码中的show方法,同时这里也说明了,它属于test模块
94	ldlexvar 0x0, 0x0
95	......
96}
97
98L_ESSlotNumberAnnotation:
99	u32 slotNumberIdx { 0x3 }
100.function any test.func_main_0(any a0, any a1, any a2) <static> {            // 此方法是自动生成的,可以理解成整个js文件就是一个方法,方法名为func_main_0
101	newlexenv 0x1
102	......
103}
104
105# ====================
106# STRING                                                                     // 符号表信息
107
108[offset:0x88, name_value:i]
109```
110
111使用参数--verbose,可打印偏移量等更多详细信息。
112
113
114```
115ark_disasm.exe --verbose test.abc test.txt
116```
117
118此处列出部分示例。
119
120```
121.record _ESSlotNumberAnnotation { # offset: 0x00cd, size: 0x0026 (38)                                  // 这里打印了模块在方舟字节码文件中具体的位置和大小
122}
123
124.record test { # offset: 0x00f3, size: 0x0098 (152)                                                    // 这里打印了模块在方舟字节码文件中具体的位置
125	u32 moduleRecordIdx = 0x203 # offset: 0x0144                                                   // 这里打印了模块信息的位置
126}
127......
128.function any test.#*#show(any a0, any a1, any a2) <static> { # offset: 0x0153, code offset: 0x0245    // 这里打印了方法信息具体的位置和方法中指令的具体位置
129#   CODE:
130	ldlexvar 0x0, 0x0 # offset: 0x0249, [IMM4_IMM4].........[0x3c 0x00]                            // 这里打印了每条指令的具体位置
131	......
132}
133```
134