このセクションでは、 他のソフトウェアや他のコンピュータと通信する際に役立つメモリ・アクセスについて説明します。 これは、 アクセスが特定のビット幅であり(Gforth のセル幅とは独立)、 自然な並びでない可能性があり、 通常、 Gforth が実行されるシステムのネイティブなバイト順序(バイト・オーダー)とは異なる可能性がある特定のバイト順序を持つことを意味します。
私達は以下のプレフィックスを使います:
c
8ビット(文字;character)
w
16ビット
l
32ビット
x
64 ビットを 1 つのセルとして表現
xd
64 ビットを 2 つのセルとして表現
x
プレフィックスのワードは 32 ビット・システムでは正しく機能しないため、 32
ビット・システムに移植することを目的としたコードの場合は、 xd
プレフィックスのワードを使用する必要があります。 注意:
xd
プレフィックスのワードは 64 ビット・システムでも動作することに注意してください。 64 ビット・システムでは、
上位のセルは単なる 0 (符号なし値の場合)、 または下位のセルの符号拡張です。
以下のメモリー・アクセス・ワード群はすべて、 任意の(非)アライメントされたアドレスで動作します(一部のハードウェアでアライメントが必要な
@
や !
や f@
や f!
とは異なります)。
w@
( c-addr – u ) gforth-0.5 “w-fetch”
u は c_addr に格納されているゼロ拡張された 16 ビット値(zero-extended 16-bit value)です。
w!
( w c-addr – ) gforth-0.7 “w-store”
w の下位 16 ビットを c_addr に格納します。
l@
( c-addr – u ) gforth-0.7 “l-fetch”
u は、 c_addr に格納されているゼロ拡張された 32 ビット値(zero-extended 32-bit value)です。
l!
( w c-addr – ) gforth-0.7 “l-store”
w の下位 32 ビットを c_addr に格納します。
x@
( c-addr – u ) gforth-1.0 “x-fetch”
u は、 c_addr に格納されているゼロ拡張された 64 ビット値です。
x!
( w c-addr – ) gforth-1.0 “x-store”
w の下位 64 ビットを c_addr に格納します。
xd@
( c-addr – ud ) gforth-1.0 “x-d-fetch”
ud は、 c_addr に格納されているゼロ拡張された 64 ビット値です。
xd!
( ud c-addr – ) gforth-1.0 “x-d-store”
ud の下位 64 ビットを c_addr に格納します。
特定のバイト順序(byte order)でアクセスする場合は、 取得直後(符号拡張の前)、 または格納の直前にバイト順序調整を行う必要があります。 これらのバイト順調整ワードの結果は常にゼロ拡張(zero-extended)されます。
wbe
( u1 – u2 ) gforth-1.0 “wbe”
u1 の 16 ビット値をネイティブ・バイト順からビッグ・エンディアンに、 またはビッグ・エンディアンからネイティブ・バイト順に変換します(両方は同一の操作です)
wle
( u1 – u2 ) gforth-1.0 “wle”
u1 の 16 ビット値をネイティブ・バイト順からリトル・エンディアンに、 またはリトル・エンディアンからネイティブ・バイト順に変換します(両方の操作は同一の操作です)
lbe
( u1 – u2 ) gforth-1.0 “lbe”
u1 の 32 ビット値をネイティブ・バイト順からビッグ・エンディアンに、 またはビッグ・エンディアンからネイティブ・バイト順に変換します(両方は同一の操作です)
lle
( u1 – u2 ) gforth-1.0 “lle”
u1 の 32 ビット値をネイティブ・バイト順からリトル・エンディアンに、 またはリトル・エンディアンからネイティブ・バイト順に変換します(両方は同一の操作です)
xbe
( u1 – u2 ) gforth-1.0 “xbe”
u1 の 64 ビット値をネイティブ・バイト順からビッグ・エンディアンに、 またはビッグ・エンディアンからネイティブ・バイト順に変換します(両方は同一の操作です)
xle
( u1 – u2 ) gforth-1.0 “xle”
u1 の 64 ビット値をネイティブ・バイト順からリトル・エンディアンに、 またはリトル・エンディアンからネイティブ・バイト順に変換します(両方は同一の操作です)
xdbe
( ud1 – ud2 ) gforth-1.0 “xdbe”
ud1 の 64 ビット値をネイティブ・バイト順からビッグ・エンディアンに、 またはビッグ・エンディアンからネイティブ・バイト順に変換します(両方は同一の操作です)
xdle
( ud1 – ud2 ) gforth-1.0 “xdle”
ud1 の 64 ビット値をネイティブ・バイト順からリトル・エンディアンに、 またはリトル・エンディアンからネイティブ・バイト順に変換します(両方は同一の操作です)
特定のバイト順序での符号付きでの取得の場合、 符号なし取得とバイト順序修正の後に符号拡張ワードを実行する必要があります:
c>s
( x – n ) gforth-1.0 “c-to-s”
x の 8 ビット値をセル n に符号拡張します。
w>s
( x – n ) gforth-1.0 “w-to-s”
x の 16 ビット値をセル n に符号拡張します。
l>s
( x – n ) gforth-1.0 “l-to-s”
x の 32 ビット値をセル n に符号拡張します。
x>s
( x – n ) gforth-1.0 “x>s”
x の 64 ビット値をセル n に符号拡張します。
xd>s
( xd – d ) gforth-1.0 “xd>s”
xd の 64 ビット値を 2倍長セル d に符号拡張します。
これら全般を、 以下のような流れで使います:
w@ wbe w>s \ 16ビット 非アライメント 符号付き ビッグ・エンディアン を取得し、 >r lle r> l! \ 32-bit 非アライメント リトル・エンディアン として 格納