Gforth のアセンブラーは通常、 後置構文(postfix syntax)を使用します。 つまり、命令名がオペランドの後に続きます。
オペランドは通常の順序(アーキテクチャーのマニュアルで使用されている順序と同じ)で渡されます。 これらはすべて Forth ワードであるため、 スペースで区切る必要があります。 Forth ワードを使用してオペランドを計算することもできます。
通常、 命令名は ,
で終わります。 これにより、 複数の命令を 1 行に配置した場合に、 命令を視覚的に分離しやすくなります。 また、
他の Forth ワード (例: and
) が隠されてしまう(shadowing)のも回避します。
レジスターは通常、 番号で指定します。 たとえば、 (10 進数の) 11
は、 Alpha アーキテクチャー上のレジスター R11
および F11 を指定します(どちらかは命令によって異なります)。 通常の名前も使用できます(例: Alpha の R11 の s2
)。
制御フローは、 通常の Forth コード(see Arbitrary control structures)と同様に、 if,
,
ahead,
, then,
, begin,
, until,
, again,
,
cs-roll
, cs-pick
, else,
, while,
, repeat,
で指定します。 条件は各アセンブラーに固有の方法で指定されます。
このセクションの残りの部分は、 (移植性の高い abi-code
ワードではなく、)主に code
ワードを定義したい人にとって興味深いものです。
注意: Gforth エンジンのレジスター割り当ては、 Gforth バージョン間、 または同じ Gforth
バージョンの異なるコンパイル間でも変更される可能性があることに注意してください(たとえば、 異なる GCC バージョンを使用する場合)。
ABI-CODE
の代わりに CODE
を使用していて、 Gforth のレジスター (スタック・ポインターや TOS
など) を参照したい場合は、 これらのレジスターを参照するための独自のワードを定義して使用することをお勧めします。 そうすれば、
変更されたレジスター割り当てに適応できます。
これらのレジスターの最も一般的な使用法は、 code
定義を次のワードへのディスパッチ(next
ルーチン)で終了することです。 これを行う移植可能な方法は、' noop >code-address
にジャンプすることです(もちろん、
これは next
コードを統合して適切にスケジュールするほど効率的ではありません)。 ABI-CODE
を使用する場合は、
通常のサブルーチンの戻り値をアセンブルするだけです(ただし、 必ずデータ・スタック・ポインターを返すようにしてください)。
Gforth バージョン間のもう 1 つの違いは、 ほとんどのプラットフォームではスタックの最上位が gforth
のメモリーに保持され、
gforth-fast
ではレジスタに保持されることです。 ABI-CODE
定義の場合、
スタック・キャッシュ・レジスターは必ずスタックにフラッシュされるため、 メモリー内のスタックの先頭に確実にアクセスできます。