farポインター

読み:ファーポインター
外語:far pointer 英語
品詞:名詞

x86系プロセッサーの16ビット環境でのプログラミングで使われるポインターの一つ。

目次

x86のアドレッシングの特徴でもある、「セグメント:オフセット」の形式で20ビットのアドレスをCで表現することができる。

即値代入やキャストも可能だが、概ねトラブルの元である。

実装により様々だが、内部的には32ビット変数のように振る舞い、上位16ビットがセグメント、下位16ビットがオフセットとして機能することが多かった。この場合、sizeofすると4という結果が得られるはずである。

使用例

MS-DOSWin16Cでは、ポインター変数の定義にあたり、near/far/hugeという3つの予約語が用いられた。

これらはCの標準仕様には存在しないものであったが、これなくしてプログラミングが出来なかったため、やむを得ず利用された。

unsigned char near *np;

unsigned char far *fp;

unsigned char huge *hp;

farポインターは、このうちfarを指定したときに使われるポインターである。

なお、nearやfarを省略した場合、Cコンパイラーが自動的に判断するので必ずしも指定する必要は無いが、ポインターの種類を決め打ちしたい場合に必要となる。

代入

farポインターへのキャストが可能。

unsigned char near *np;

unsigned char far *fp;

fp = (unsigned char far *)np;

この場合の動作は実装依存であり、結果については未定義である。殆どのCコンパイラーはセグメント拡張するが、しない可能性もある。

farポインターへの即値代入も可能だが、実装依存である。以下は一例。

unsigned char far *fp;

fp = (unsigned char far *)0xabcd0123;

この場合、abcd:0123 というアドレスに対するfarポインターとなる。このポインターを使えば、このアドレスに対して何かを書き込むことができる。

*fp = 0x00;

整数型変数へのキャスト

farポインターを整数型変数にキャストすることもできる。

unsigned char far *fp;

unsigned long l;

l = (unsigned long)fp;

この場合の動作は実装依存であり、結果については未定義である。

演算

farポインターへの演算も可能だが、これも実装依存度が高いと見込まれる。

unsigned char far *fp;

fp = (unsigned char far *)0xaaaa0000; // fp = aaaa:0000

--fp; // fp = aaaa:ffff

加減算はオフセット部分のみに実施される可能性が高い。演算におけるオーバーフロー/アンダーフロー時にセグメント部分に影響を与えない可能性が高い。(実装依存)

用語の所属
x86
IA-16
FP
関連する用語
nearポインター
hugeポインター

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club