23

変なお願いですが、出来る気がします。GCC のレジスタ アロケータがそれらを使用しないように、いくつかのプラグマまたはディレクティブをコード (C で記述) の領域に挿入したいと考えています。

このようなことができることを理解しています。これにより、この変数用にこのレジスタが確保される可能性があります

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

問題は、新しい命令 (ハードウェア シミュレータ用) を直接挿入していて、GCC と GAS がまだこれらを認識していないことです。新しい命令は既存の汎用レジスタを使用できますが、それらのいくつか (つまり、r12->r15) を確保したいと考えています。

現在、私はモックアップ環境で作業しており、実験を迅速に行いたいと考えています。将来的には、GAS を追加し、組み込み関数を GCC に追加しますが、今は簡単な修正を探しています。

ありがとう!

4

4 に答える 4

18

GCC インライン アセンブラを記述する場合、「クロバー リスト」を指定できます。これは、インライン アセンブラ コードによって上書きされる可能性があるレジスタのリストです。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を参照してください。

于 2011-07-13T17:41:42.070 に答える
5

グローバル明示レジスタ変数を使用する場合、これらはコンパイル単位全体で予約され、コンパイラによって他の目的で使用されることはありません (システムのライブラリによって引き続き使用される可能性があるため、それらによって復元されるものを選択してください)。ローカル レジスタ変数は、値が常にレジスタにあることを保証するものではなく、コードまたはasmオペランドとして参照される場合に限ります。

于 2011-07-13T17:12:27.123 に答える
5

新しい命令のインライン asm ブロックを作成する場合、そのブロックで使用されるレジスタとその使用方法を GCC に通知するコマンドがあります。その後、GCC はこれらのレジスタの使用を回避するか、少なくともその内容を保存して再読み込みします。

于 2011-07-13T17:13:22.153 に答える