Flashで覚えるアセンブラ・スタックマシン入門(Flasm)(1) - Flashのアセンブラ Flasm を使ってみよう
- Flashのアセンブラ Flasm を使ってみよう
- swfmill と Flasm で簡単な Flashアセンブラを書いてみよう
Flasm という無料のアセンブラ+逆アセンブラがあります。Flasm を使うと、Flashファイル(SWFファイル)を作成することができます。Flashのスクリプトを実行する仮想マシンは、非常にオーソドックスなスタックマシンとなっています。そのため、アセンブラ・スタックマシンを学ぶのに最適な教材です。本稿では、これまで、アセンブラやスタックマシンに興味があったけれど、いまいちよく分からなくて足を踏み出せなかったという方や、ABC(ActionScript ByteCode)に興味がある方に向けて解説します。
Flash のバイトコードについて
Flash は、Webアニメーションの作成ツールからはじまり、現在では、RIA(リッチインターネットアプリケーション)作成のためのツールとして、確固たる地位を築いています。Flash では、ActionScript というスクリプト言語を用いてプログラムを埋め込むことができます。
Flashファイル(拡張子".SWF") には、ActionScript がソースコードのまま直接埋め込まれるのではなく、ActionScript Bytecode という中間表現形式で埋め込まれています。このバイトコードは、Java のバイトコードにも似ていますが、より単純で理解しやすいものになっています。そのため、Flash のバイトコードに慣れることで、Javaのバイトコードや、ひいてはアセンブラの学習にも役立つのではと思います。
Flasm とは?
Flasm は、Flash ファイルを対象したバイトコードの生成ができるアセンブラです。(Windows /Mac OS X / Linux で動作します。) また、SWFファイルから、Flasm形式のアセンブラを生成することができます。そのため、Flash でスクリプトを書いて、これがどんな形のバイトコードに変換されているのかを確かめるのにも非常に便利です。
Flashのプロジェクトファイル(拡張子".FLA")をなくした SWF ファイルに対して、スクリプトのコードを書き換えることもできます。iandeth.のブログでは、ある企業での活用例が載せられている。これによると、外注で作ってもらった Flash のリンク先を書きかえたいのだが、元のプロジェクトファイルがなくなってしまい、Flasm を使ってリンク先を書き換えたという実践活用例が面白いエピソードと共に紹介されています。
※ちなみに、Flasmが対応しているのは、Flash 8以前の形式です。
スタックマシンについて
Flash のスクリプト実行エンジンは、AVM(ActionScript Virtual Machine)と言って、ActionScript の仮想マシンです。この仮想マシンは、「スタックマシン」というメモリがスタックの形式になっている計算モデルで動作しています。
スタックとは、値を順に積んでいって、必要に応じて最後に積んだデータを取り出して利用するというデータ構造の一種です。
以下がスタックの基本を表した図です。スタックと言うのは、積み木で作る塔のようなイメージです。メモリに値を積むとき(PUSHするとき)は、積み木を机の上に積んでいくイメージです。そして、値を取り出すとき(POPするとき)は、塔を崩さないように、上から順に値を取り出します。
これを元に、スタックマシンを考えてみると、PUSHコマンドにより、値をスタックに積み、足し算コマンドADD などで計算を行う時に、スタックから値を取り出し、計算結果をスタックに積むという具合で動く仕組みのマシンのことです。
とにかく動かしてみよう
プログラミングというものは、頭で考えていてもよく解らないものです。実際にサンプルを動かしてみて結果を確認し、少し変更して実行して結果を確認するという繰り返しにより理解に結びついていきます。
Flasm の入手
それでは、Flasmをダウンロードしましょう。Flasm は以下より入手可能です。ここでは、Windows でのセットアップを例にしますが、他の環境でもほとんど同じでしょう。
Flasm のセットアップ (Windows)
Flasm のアーカイブを解凍したら、解凍したフォルダを「c:\flasm」にコピーします。そして、環境変数に Flasm の bin ディレクトリを追加します。環境変数の設定は、Windows Vista だと、[コントロールパネル - ユーザーアカウント - ユーザーアカウント] を開いて、エクスプローラーの左下にある[環境変数の変更]をクリックします。Windows XP なら、[コントロールパネル - システム - 詳細設定 - 環境変数]ボタンを選択します。
環境変数の中から、PATH を選んで、そこに「;c:\flasm」と追加します。これで、flasm コマンドを使えるようになりました。
後は、必要なら、Flash Player をダウンロードしてインストールします。
- Adobe Flash Player ダウンロードセンター
- http://www.adobe.com/shockwave/download/inde..
Flasm で SWF を逆アセンブルしてみよう
簡単に Flasm を使う例として、適当な Flash ファイルを逆アセンブルしてみようと思います。以下にテスト用の SWF ファイルがありますので、ダウンロードして、適当なディレクトリに配置してください。
- テスト用 swf ファイル
- http://aoikujira.com/demo/hakkaku/rc/test.swf
そして、次のようなバッチファイルを作成して、test.swf と同じディレクトリに「test.bat」の名前で保存します。
flasm test.swf
そして「test.bat」をダブルクリックすると、flasm で SWF ファイルを逆アクセンブリが実行され、test.flm というファイルが出力されます。(あるいは、バッチファイルを作らなくても、コマンドラインから上記のコマンドを入力することで実行できます。)
このファイルを開くと次のようなアセンブラが生成されているはずです。
movie 'test.swf' // flash 7, total frames: 1, frame rate: 12 fps, 550x400 px
frame 0
push 'main_txt'
getVariable
push 'text', 'Hello!'
setMember
end // of frame 0
end
簡単に内容を紹介すると、これは、Flash のステージ上に配置されているテキストフィールドの「main_txt」に「Hello!」というテキストを表示するプログラムです。Flash では、各フレーム毎にスクリプトを配置できるのですが、プログラムの2行目に「frame 0」とあり、ここでは、0フレーム目(最初のフレーム)の内容を定義しています。
これから、Flasmアセンブラでプログラムを組んでいくのですが、このプログラムを書き換えてコンパイルしていきます。
軽く書き換えてみよう
先ほど、逆アセンブルして生成した「test.flm」を見ると、’Hello!’ という文字があり、ここを書き換えることで、別の文字を表示することができそうです。ここでは、「Hello, Flasm!」と書き換えてみます。
movie 'test.swf'
frame 0
push 'main_txt'
getVariable
push 'text', 'Hello, Flasm!' // <---
setMember
end // of frame 0
end
そして、上記のよう要領でバッチファイルを作るか、コマンドラインから次のように実行します。
flasm -a test.flm
すると、以下のように、表示する文字を書き換えることができました。
実行できたことを確認したら、もう一度ソースコードを見てみましょう。少しずつ追っていきます。以下の「push」コマンドは、’main_txt’ をスタックに積みます。次の「getVariable」コマンドですが、これは、スタックから値を下ろして、変数「main_txt」への参照をスタックに積みます。
push 'main_txt' getVariable
次に、さらに、’text’と’Hello, Flasm!’をスタックに積みます。そして「setMember」コマンドを実行しますが、これは、オブジェクトのフィールドに、値を書き込むというものです。
push 'text', 'Hello, Flasm!' setMember
つまり、この4行を ActionScript で書くと、以下の1行のプログラムになります。たった一行のことをするのに面倒な手順を踏むものだと思うでしょうか。しかし、これが分かれば、他のオブジェクトもいろいろ操作できそうな気がするのではないでしょうか。
main_txt.text = 'Hello, Flasm!';
テキストの位置を動かすスクリプトを書く
それでは、オブジェクトを操作する例として、テキストの位置を移動させるプログラムを作ってみます。以下は、テキストの x 座標を200に移動する例です。ActionScript で言うと、以下の一行です。
main_txt._x = 200;
これを、Flasm で記述してみます。はじめの2行で、テキストフィールドの「main_txt」をスタックに積み、次の2行で、プロパティ「_x」に200を代入します。
movie 'test.swf'
frame 0
push 'main_txt'
getVariable
push '_x', 200
setMember
end // of frame 0
end
簡単な計算を行う
なんとなく、雰囲気が掴めてきたら、簡単な計算をさせてみましょう。(1 + 2) * 3 を計算してみます。以下が、Flasmのコードです。計算処理以外の部分は、上で見たプログラムと全く同じです。違うのは、(*1)から(*2)までの間です。ここに「(1+2)*3」の計算処理が入っています。
movie 'test.swf'
frame 0
push 'main_txt'
getVariable
push 'text'
//--- (*1)
push 1, 2
add
push 3
multiply
//--- (*2)
setMember
end // of frame 0
end
これをコマンドラインから「flasm -a test.flm」とコンパイルして、「test.swf」を実行すると以下のようなFlashが表示されます。
再度、計算処理の部分を見てみましょう。これは、1と2をスタックに積み、「add」でスタックからこの2つの値を下ろして足し算し、答えの3を再びスタックに積みます。次いで、3 をスタックに積み、次の「multiply」でスタックにのっている2つの数(3と3)をを掛けて答えの9をスタックに積みます。分かりやすく計算処理とスタックの様子を対比させて見てみましょう。
push 1, 2 // stack [1,2] add // [3] push 3 // [3,3] multiply // [9]
まとめ
以上、Flasm を使って、アセンブラとスタックマシンの基礎を紹介しました。Flasmのヘルプを見ると、利用できるコマンドについて解説が書いてあります。しかし、はじめはよく分からないこともあります。そんな時は、Flash で ActionScript を書いてみて、それを、逆アセンブルして確認してみると良いでしょう。SWFファイルを作るだけなら、Flasm を使うまでもなく、Flash を使うのが良いと思いますが、スタックマシンについて学ぶには、Flasm は良い教材です。ぜひ、Flasmで遊んでみてください。
このサイトについて
TrackBack URL :




