データをコンパイルする

変数に値を格納すれば、それは辞書内の対応する部分に値を書き込むことになります。しかしそれは、変数に値を格納することによって起こる間接的効果ともいえます。ここで扱うのは、変数領域であるかどうかを問わず、辞書のデータ領域に直接データを書き込むワードです。バイト幅に応じて3種類あります。

"C, ( c -- )"は、トップスタック上にある数値を、辞書のデータ領域の空き領域の先頭(HERE)から始まる1バイトに、1バイト数値としてコンパイル(書き込み)し、空き領域の開始値(DP)を1バイト先に進めます。

"W, ( n -- )"は上の"1バイト"が"2バイト"に変わるだけで同じ、", ( n -- )"は、"4バイト"に変わるだけでおなじです。

さらに特殊なものとして、N, ( addr len -- )は、addrから始まるメモリー上のlenバイト分のデータを、"HERE"以下にコピーし、DPを"len"バイト分先に進めます。

これらは非常に低レベルの操作ですが、局面によっては非常に便利です。

ただし、メモリーのアラインメントのことを考えなければなりません。PPCのメモリは4バイトずつ単位(セル)になっています。例えば中途半端なところから始まった4バイト数は、4バイト数として直ちに取り出すことができません。","以外のワードでデータを書き込んだときには、区切りのところでALIGN(またはALIGN4)を実行しておきましょう。半端な部分に適当に詰め物(0)が入り、DPが4の倍数に揃います。

下は,","を三回続けて実行した場合の模式図です。
スタック , , , Mops辞書データ領域
n1 n2 n3 xxx ... ... ... ... ...
↓状態変化 コンパイル ↓状態変化
... ... ... xxx n3 n2 n1 ... ...

"..."は空っぽのセルを表しています。右側の、空所との境目(色の境目)がDP=HEREになります。


関連項目:






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