DoActionからJava VMバイトコー       ドに変換する話     恵森 将太郎(@emorins)
何やるか     DoActionから  Java VMバイトコード        に変換
どうやってやるか        SWFの解析             ↓      DoActionタグの解析             ↓      Actionタグの解析             ↓     Actionタグから対応するJav...
最終的な目標・ActionScriptでJavaアプリの開発 ・swfからJavaアプリへの変換あるいは今回はJava VMですが、Dalvik VMバイトコードにして、・swfからAndroidアプリケーションへの変換・ActionScrip...
今日具体的にやること簡単な加算演算と変数への代入を変換
ActionScriptコードi = 4;i = 2 + 3;Flash lite 1.1 (swf v4)
DoActionタグのContents     009603000069009603     000034001d960300     0069009603000035     001d00
アクションActionPush値をスタックにpush ACTIONRECORDHEADER   オペコード:0x96   Length Type    0 = 文字列リテラル    1 = 浮動小数点数リテラル  値
アクションActionSetVariableスタックから値をpop、次に変数をpopし、変数に値をセット ACTIONRECORDHEADER   オペコード:0x1d
アクション0: ActionPush: i1: ActionPush: 42: ActionSetVariable:3: ActionPush: i4: ActionPush: 55: ActionSetVariable:
スタックの流れ   4        →         → 5            →    i                       i 0,1             2         3              4 i,4を...
Javaコードclass Main{   public static void main(String[] args){     int i = 4;     i = 2 + 3;   }}
演算しているところのバイト列     073C083CB1
Javaバイトコード% javap -c MainCompiled from "Main.java"class Main extends java.lang.Object{Main(); Code:  0: aload_0  1: invoke...
命令セットiconst_<i>int 定数をオペランド・スタックへpushオペコード:iconst_4=0x7, iconst_5=0x8istore_<n>オペランド・スタックの先頭から(int型)のvalueをpopし、ローカル変数nにセッ...
スタックの流れ          →             →            →   4                          5  0             1            2            3 4を...
評価器がスタックマシンでどっちも似てるね
変換する ActionPush: i はいらないね ActionPush: 4 はiconst_4に変換 ActionSetVariableで、istore_1あとはローカル変数テーブルとか用意しないと駄目だけど割愛
変換したバイトデータを.classで保存ちゃんとJava VMバイトコードに変換できているか確認% javap -c MainCompiled from "Main.java"class Main extends java.lang.Objec...
ご清聴ありがとうございました
Upcoming SlideShare
Loading in …5
×

DoActionからJava VMバイトコードに変換する話

4,199 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
4,199
On SlideShare
0
From Embeds
0
Number of Embeds
1,619
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

DoActionからJava VMバイトコードに変換する話

  1. 1. DoActionからJava VMバイトコー ドに変換する話 恵森 将太郎(@emorins)
  2. 2. 何やるか DoActionから Java VMバイトコード に変換
  3. 3. どうやってやるか SWFの解析 ↓ DoActionタグの解析 ↓ Actionタグの解析 ↓ Actionタグから対応するJavaVM バイトコードに変換 ↓ classファイルの生成 Java VMで実行
  4. 4. 最終的な目標・ActionScriptでJavaアプリの開発 ・swfからJavaアプリへの変換あるいは今回はJava VMですが、Dalvik VMバイトコードにして、・swfからAndroidアプリケーションへの変換・ActionScriptでAndroidアプリの開発など
  5. 5. 今日具体的にやること簡単な加算演算と変数への代入を変換
  6. 6. ActionScriptコードi = 4;i = 2 + 3;Flash lite 1.1 (swf v4)
  7. 7. DoActionタグのContents 009603000069009603 000034001d960300 0069009603000035 001d00
  8. 8. アクションActionPush値をスタックにpush ACTIONRECORDHEADER オペコード:0x96 Length Type 0 = 文字列リテラル 1 = 浮動小数点数リテラル  値
  9. 9. アクションActionSetVariableスタックから値をpop、次に変数をpopし、変数に値をセット ACTIONRECORDHEADER オペコード:0x1d
  10. 10. アクション0: ActionPush: i1: ActionPush: 42: ActionSetVariable:3: ActionPush: i4: ActionPush: 55: ActionSetVariable:
  11. 11. スタックの流れ 4 → → 5 → i i 0,1 2 3 4 i,4をpush 順に変数名、 i,5をpush 順に変数名、 値をpopし、 値をpopし、 セット セット
  12. 12. Javaコードclass Main{ public static void main(String[] args){ int i = 4; i = 2 + 3; }}
  13. 13. 演算しているところのバイト列 073C083CB1
  14. 14. Javaバイトコード% javap -c MainCompiled from "Main.java"class Main extends java.lang.Object{Main(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: returnpublic static void main(java.lang.String[]); Code: 0: iconst_4 1: istore_1 2: iconst_5 3: istore_1 4: return}
  15. 15. 命令セットiconst_<i>int 定数をオペランド・スタックへpushオペコード:iconst_4=0x7, iconst_5=0x8istore_<n>オペランド・スタックの先頭から(int型)のvalueをpopし、ローカル変数nにセットオペコード:iconst_1=0x3c
  16. 16. スタックの流れ → → → 4 5 0 1 2 3 4をpush 先頭からpop 5をpush 先頭からpop し変数に代入 し変数に代入
  17. 17. 評価器がスタックマシンでどっちも似てるね
  18. 18. 変換する ActionPush: i はいらないね ActionPush: 4 はiconst_4に変換 ActionSetVariableで、istore_1あとはローカル変数テーブルとか用意しないと駄目だけど割愛
  19. 19. 変換したバイトデータを.classで保存ちゃんとJava VMバイトコードに変換できているか確認% javap -c MainCompiled from "Main.java"class Main extends java.lang.Object{Main(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: returnpublic static void main(java.lang.String[]); Code: 0: iconst_4 1: istore_1 2: iconst_5 3: istore_1 4: return}
  20. 20. ご清聴ありがとうございました

×