对于上下文,我正在尝试编写一个从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
什么是生成控制流图的算法?
发布于 2013-07-27 18:59:25
我想通了。基本上,保留一个标签列表(在我的例子中,标签是数组中指令的索引)。标签之间的每个指令列表都是块(它们是图中的顶点)。在每个分支之后标记指令(这样分支就是块的最后一条指令,这样你就可以知道它是哪种边了。或者,您可以将分支类型标记到边缘。),以及每个分支的目标。
一旦你有了标签,就把它们分成块。我循环遍历标签中的每个排序索引,如果最后一个块的最后一条指令是分支,则向目标添加一条边。如果没有,我会将它的一条边添加到当前块中(作为落差节点)。
https://stackoverflow.com/questions/17715147
复制相似问题