dar*_*rkf 1 assembly computer-science decompiling control-flow control-flow-graph
对于上下文,我试图将AVM2(ActionScript虚拟机2)字节码/汇编中的反编译器编写为高级ActionScript 3代码.据我所知,这需要我分析程序集并从中生成结果控制流图,以便推导出诸如循环和条件分支(if/else)之类的结构.
鉴于一些组装如下:
0 getlocal0
1 pushscope
2 findpropstrict {, private, }::trace
4 pushstring "one"
6 callproperty {, private, }::trace (1)
9 pop
10 pushbyte 5
12 pushbyte 3
14 ifngt L1
18 findpropstrict {, private, }::trace
20 pushstring "two"
22 callproperty {, private, }::trace (1)
25 pop
L1:
26 findpropstrict {, private, }::trace
28 pushstring "three"
30 callproperty {, private, }::trace (1)
33 coerce_a
34 setlocal1
35 getlocal1
36 returnvalue
37 kill 1
Run Code Online (Sandbox Code Playgroud)
什么是生成控制流图的算法?
我想通了.基本上,保留一个标签列表(在我的例子中,它是数组中指令的索引).标签之间的每个指令列表是块(图中的顶点).在每个分支之后标记指令(以便分支是块的最后一条指令,这样你就可以弄清楚它是什么类型的边缘.或者,你可以在分支类型上标记边缘.)和目标每个分支.
获得标签后,只需将它们分成块即可.我循环遍历标签中的每个排序索引,如果最后一个块的最后一条指令是分支,我将其边缘添加到目标.如果没有,我将其边缘添加到当前块(作为一个直通节点).