コードをコンパイルする

ワードをコンパイルすれば、対応するマシン語がMops辞書のコード領域に書き込まれます。ここでの話は、このような間接的効果としてではなくて、直接にコード領域に書き込む方法です。

CODE, ( n -- )

PPCのマシン語は32ビット(4バイト)です。ですから、マシン語がわかれば、それを直接辞書に書き込むということもできます。この場合、当然、4バイト幅の数値として書き込みます。このためのワードは、CODE, ( n -- )です。このワードはトップスタックの値を、辞書のコード領域の空き部分の頭(CDP)からの4バイト幅に、4バイト数としてコンパイルし、CDPを4バイト先に進めます。これを使って、例えば、
$ 7C641B78 CODE,  \ or r4,r3,r3 // "レジスタ3の値をレジスタ4にコピー"をコンパイル(PPCマシンインストラクション)
などとやることもできますが、よほどのことがない限りこんなことはやりませんし、普通、やりたくもありません。

実際には、辞書のコード領域は、実行可能なコードを書き込まなければならない場所という意味ではなく、読み出しのみ(Read-Only)のデータを書き込む場所、と考えるのが適切です。Read-Onlyということは、いったん書き込んだなら、変更できないということを意味します。この性質をつかって、OSは検索の効率化を図っているのです。ですから、後で変更の必要がないことがわかっているデータなら、コード領域に書き込んでおいて検索効率を上げる(最適化する)という使い方もあり得るわけです。

そのため、マシンインストラクションに対応する32ビット数値だけではなくて、データ領域へのコンパイルとちょうど対応する、いくつかのコードコンパイル用ワードが準備されています。

CODEC, ( c -- )

CDPから1バイトに、1バイト数としてトップスタック値をコンパイルし、CDPを1バイト進めます。

CODEW, ( n -- )

上の"1バイト"を"2バイト"に読み替えれば、全く同じです。

CODEN, ( addr len -- )

メモリーアドレス"addr"から始まる"len"バイトのデータを、CDP以降にコピーした上で、CDPを"len"バイトだけ進めます。

メモリーは4バイトセルを一つの単位にしており、セルによってきちんと区切られていないと、コードを識別できません。ですから、"CODE,"以外のワードでコード領域にコンパイルした結果、境界線が半端になりそうなときには、実行コードのコンパイル前に"Code_Align"を実行しましょう。適当な分量の詰め物(0)によってCDPが4の倍数に揃います。


関連項目:






最終更新:2020年04月19日 17:05