2011-07-13 3 views
21

これは奇妙な要求ですが、可能性があります。 GCCのレジスタアロケータがでなく、であるように、コードの一部(C言語で書かれた部分)にプラグマやディレクティブを挿入することをお勧めします。この変数GCC:いくつかのレジスタの使用を禁止

register int var1 asm ("EBX") = 1984; 
register int var2 asm ("r9") = 101; 

のための問題は、私が直接(ハードウェアシミュレータ用)新しい命令を挿入してるということです私ははさておき、このレジスタを設定しているかもしれませんが、このような何かを行うことができますことを理解

とGCCとGASはまだこれらを認識していません。私の新しい命令は、既存の汎用レジスタを使用することができ、私はそれらのいくつか(r12 - > r15)が予約されていることを確認したい。

現在、モックアップ環境で作業しています。私はすぐに実験を行いたいと思います。将来はGASを追加し、GCCに組み込み関数を追加しますが、今すぐに修正を探しています。

ありがとうございます!

+1

いつも予約する必要がありますか、または特定のインラインasmブロックの一部を予約する必要がありますか? – bdonlan

+0

はい、これを指定したはずです。私は小さな機能の文脈で予約されているだけです。私はそれらをグローバルに予約することによって、パフォーマンスに悪影響を与える可能性があることを恐れています。 – hayesti

答えて

12

GCCインラインアセンブラを書くときに、インラインアセンブラコードによって上書きされる可能性のある "clobberリスト"を指定できます。 GCCは、インラインasmセグメントの過程で、それらのレジスタ内のデータを保存して復元するために必要な処理を行います(または最初の使用を避ける)。入力または出力レジスタをC変数にバインドすることもできます。例えば

inline unsigned long addone(unsigned long v) 
{ 
    unsigned long rv; 
    asm("mov $1, %%eax;" 
     "mov %0, %%ebx;" 
     "add %%eax, %%ebx" 
     : /* outputs */ "b" (rv) 
     : /* inputs */ "g" (v) /* select unused general purpose reg into %0 */ 
     : /* clobbers */ "eax" 
     ); 
} 

詳細については、GCC-Inline-Asm-HOWTOを参照してください。

+0

あなたの例の構文が間違っている点を除いて、+1を与えるでしょうか?制約コードではなく実際のレジスタ名が必要なので、 '' a "' 'ではなく' 'eax" ' –

+0

@Chris、 oops - fixed :) – bdonlan

+0

ありがとうございます。これはまた非常に役に立ちます。 :-) – hayesti

5

global explicit register variablesを使用すると、これらはコンパイル単位全体で予約され、他の目的でコンパイラでは使用されません(システムのライブラリで使用される可能性がありますので、 。ローカルレジスタ変数では、値が常にレジスタに格納されることは保証されませんが、コードまたはasmオペランドとして参照される場合に限ります。

+1

ありがとうございます。グローバルレジスタ変数がこれを保証していることに気付きませんでした。 – hayesti

+1

@Bob:このページも表示されているはずですが、いくつかの注意事項(シグナルなど)が含まれています。また、 '-ffixed-reg'が記述されています。グローバルレジスタ変数を追加する。 http://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Global-Reg-Vars.html#Global-Reg-Vars – Hasturkun

+0

私はこの-ffixed-regが完璧だと思います!私は、コード生成フラグなので、明示的にこれらの禁止されたレジスタを使用するインラインアセンブラであれば問題ありません。 – hayesti

5

新しい命令のためにインラインasmブロックを書く場合、そのブロックがどのレジスタをどのように使用しているかをGCCに知らせるコマンドがあります。 GCCはこれらのレジスタの使用を避けるか、少なくともその内容を保存してリロードします。

+0

ありがとうございました。この機能のドキュメンテーションへのリンクがあれば、それは素晴らしいでしょう。 – hayesti

+1

@Bob:http://gcc.gnuを参照してください。org/onlinedocs/gcc-4.6.1/gcc/Extended-Asm.html#Extended-Asmとhttp://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Constraints.html#Constraints – Hasturkun

+0

素晴らしい、ありがとうございました! – hayesti

関連する問題