[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.34.2 ローカル変数にレジスタを指定するには

ローカルのレジスタ変数を、以下のようにレジスタを指定して定義することが できる。

 
register int *foo asm ("a5");

ここで a5 は使われるべきレジスタ名である。 この書き方は、グローバルレジスタ変数を定義する場合と同じだが、 ローカル変数の場合は関数内に現れることに注意。

普通、レジスタ名は CPU に依存するが、これは問題ではない。 特定のレジスタは明示的なアセンブラ命令で役に立つことが多いからである (see section C の式をオペランドとするアセンブラ命令)。これらのどちらも一般に CPU 型に応じて プログラムを条件節で場合分けする必要がある。

さらに、一つの CPU タイプで動作するオペレーティングシステムが 複数ある場合は、レジスタの指定法が違う可能性がある。 例えば、幾つかの 68000 上のオペレーティングシステムでは、上記の レジスタを %a5 と読んでいる。

レジスタ変数をこのように定義しても、指定されたレジスタを予約することは ない。フロー制御によりこのレジスタ変数の値が生きていないと 分かった場所で、他の目的に使うことは依然として可能である。 だが、これらのレジスタはリロードパスで利用できなくなる。 この機能を使い過ぎると、コンパイラが関数をコンパイルするのに使える レジスタが足りなくなってしまう。

このオプションは、このレジスタ変数が、ユーザが指定したレジスタに いつでも入るようなコードを GNU CC が生成することを保証するものではない。 asm 文でこのレジスタを明示的に参照するコードを書いて、 それが常にこの変数を指すと仮定してはいけない。

局所レジスタ変数への格納は、データ流解析に従うと死んでいるようであれば、 削除される可能性がある。局所レジスタ変数への参照は、削除されたり、 移動されたり、単純化される可能性がある。


This document was generated using texi2html 1.78.