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