6

インラインアセンブラをCのような言語の関数に挿入する場合、スクラッチに使用できるレジスタについての規則は何ですか?asmブロックに入る前に保存する必要のあるすべてのレジスタの値を保存するのはコンパイラの責任ですか?これらのレジスタの値をどこかに格納し、asmブロックを終了する前にそれらを復元するのはプログラマーの責任ですか?典型的な規則はありますか、それともこれは非常に実装固有ですか?

4

3 に答える 3

9

インラインアセンブリは、定義上、コンパイラ固有です。

インラインアセンブリをサポートするほとんどのコンパイラには、アセンブリによって変更されるレジスタを示すことができる構文があります。その後、コンパイラーは、必要に応じてこれらのレジスターを保存および復元できます。

于 2009-10-24T05:21:58.477 に答える
7

これは非常にコンパイラ固有です。ただし、現実的な例として、x86でgccを使用してみましょう。形式は次のとおりです。

asm ( assembler template
    : output operands               (optional)
    : input operands                (optional)
    : list of clobbered registers       (optional)
    );  

「破壊されたレジスタのリスト」とは、コードが使用しているレジスタをコンパイラに通知することです。

簡単なメモリコピーコードは次のとおりです。

asm ("movl $count, %%ecx;
      up: lodsl;    
      stosl;
      loop up;"
    :           /* no output */
    :"S"(src), "D"(dst) /* input */
    :"%ecx", "%eax" );  /* clobbered list */    

これらの指示を考えると、gccはブロック内の他のものにeaxとecxを使用しません。

詳細はこちら

于 2009-10-24T05:52:19.943 に答える
2

ここでいくつかの呼び出し規約でレジスタの使用法を読むことができます。

于 2009-10-24T05:37:15.163 に答える