1

컨텍스트에서 AVM2 (ActionScript 가상 시스템 2) 바이트 코드/어셈블리의 디 컴파일러를 고급 ActionScript 3 코드로 작성하려고합니다. 내가 아는 한,이 같은 루프와 같은 구조를 추론하기 위해, 어셈블리를 분석하고이에서 제어 흐름 그래프를 결과로 생성하는 저를 필요로하고, 조건 분기 (/ 다른 경우). 컨트롤 흐름 그래프를 생성하는 알고리즘이 무엇어셈블리에서 제어 흐름 그래프를 생성하는 방법은 무엇입니까?

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 

:

과 같은 몇 가지 어셈블리를 감안할 때?

답변

5

나는 이것을 알아 냈다. 기본적으로 레이블 목록을 유지하십시오 (필자의 경우 배열의 지침에 대한 색인입니다). 레이블 사이의 각 명령어 목록은 블록 (그래프의 정점)입니다. (분기는 블록의 마지막 명령어가되도록, 당신이. 또는, 당신은 가장자리에 분기 유형에 태그를 할 수있다 가장자리의 종류를 알아낼 수 있습니다. 그런 식으로) 각 지점 후, 대상을 지시 라벨 각 지점의

레이블이 있으면 블록으로 분할하면됩니다. 레이블의 각 정렬 된 인덱스를 반복하고 마지막 블록의 마지막 명령이 분기 인 경우 해당 블록의 가장자리를 대상에 추가합니다. 그렇지 않은 경우, 현재 블록 (fall-through 노드)의 가장자리를 추가합니다.