Next: , Previous: , Up: Assembler and Code Words   [Contents][Index]


6.29.2 Common Assembler

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 定義の場合、 スタック・キャッシュ・レジスタは必ずスタックにフラッシュされるため、 メモリ内のスタックの先頭に確実にアクセスできます。