* OSECPUのバイトコードコンパイラを作る人へ
-(by [[K]], 2013.06.21)
** (0) はじめに
-省略
** (1) はじめの一歩
-まず何も考えずに、以下の9バイトのファイルを作ってほしい。とりあえずはバイナリエディタで作ればいいんじゃないかな?ファイル名はとりあえずtest.oseとでもしておこう。
 05 E1 00 02 00 12 34 56 78
-これの意味するところは・・・
--最初の2バイトはシグネチャ。
--次の1命令はNOP。・・・このNOP命令は重要で、これを省略するとフロントエンドコード用のトランスレータが走ってしまい、こちらの期待通りにならない。
---つまり最初の命令は必ずNOPにしなければいけない。
--そして次の1命令が R00 = 0x12345678;
-これができたら
 prompt>osecpu test.ose verbose:1
-として実行してみてほしい。verbose:1はレジスタ表示を出すためのオプションだ。
--ちゃんとR00の値が期待どおりになっているか確認してほしい。

~
-他にもいろいろな命令があるから[[page0032]]で確認しよう。

~
-つまりこういうバイナリファイルを出力できるプログラムさえ作れば、バイトコードコンパイラが作れたことになるわけだ。
** (2) フロントエンドコードを作る
-上記で作ったtest.oseに対して、以下のようにするとフロントエンドコードが得られる。
 prompt>osectols tool:appack in:test.ose out:minitest.ose
-おっとしまった、この例ではサイズが変わらないではないか! R00 = 0x12; くらいのコードであれば、ちゃんと小さくなるので心配はいらない。

~
-別にサイズなんてどうでもいいと思う気持ちは分かる。しかしそれでもこの手順をマスターする必要がある。なぜなら、一部の命令(というか文字列定数を含むAPIの呼び出し)は、一度フロントエンドコードに変換しないとまともに動作しないのだ。
--いろいろと手抜きしたせいです、ごめんなさい・・・
--ちなみにフロントエンドコードにしたものを、バックエンドコードに戻せば、それはちゃんと動くバックエンドコードになっています。
** (3) APIを呼んでみよう
-APIを呼ぶまでの手順を理解したいときは[[page0043]]を読むのが早道だと思います。

-(つづく)

* こめんと欄
-フロントエンドコードからバックエンドコードを生成するにはどうすればよいですか?。page0031を読んだのですが、どのように変換されているのかよく分からず困っています。 -- [[hikarupsp]] SIZE(10){2013-08-04 (日) 07:50:46}
-[[page0034]]の[Q0014]で回答しました。 -- ''K'' SIZE(10){2013-08-05 (月) 11:10:33}

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS