http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.htmlでインライン アセンブリの例を試してい ます。
- clobber の動作について clobbering
は基本的に、指定されたレジスタ/メモリの値を信頼しないように GCC に指示します。「ええと、GCC が前後のレジスタで何をしているかを正確に知ることができる場合、最適化するときに本当に役立ちます....(x+1) をレジスタに入れるように指示した場合、GCC はそれを知るのに十分スマートです。 、それを上書きせず、後で C コードが (x+1) を参照し、そのレジスタを解放しておくことができた場合、計算が再利用されます。
クロバー リストに関するチュートリアルにはいくつかの矛盾があり
ます。入力/出力リストで指定されたレジスタについては、GCC が認識しているようにクロバー リストに入れる必要はありません。ただし、rep_movsl (または rep_stosl) に関する例では:asm ("cld\n\t" "rep\n\t" "stosl" : /* 出力レジスタなし */ : "c" (count), "a" (fill_value), "D" (dest) : " %ecx", "%edi" );
「S、D、c」は出力オペランドにありますが、再び上書きされたものとしてリストされます。Cで簡単なスニペットを試しました:
#include<stdio.h>
int main()
{
int a[] = {2, 4, 6};
int b[3];
int n = 3;
int v = 12;
asm ("cld\n\t"
"rep\n\t"
"movsl"
:
: "S" (a), "D" (b), "c" (n)
: );
// : "%ecx", "%esi", "%edi" );
printf("%d\n", b[1]);
}
コメント付きの clobber リストを使用すると、GCC は次のように文句を言います。
ac:8:3: エラー: 'asm' のリロード中にクラス 'CREG' でレジスタが見つかりません ac:8:3: エラー: 'asm' オペランドに不可能な制約があります
空の clobber リストを使用すると、コンパイルされ、出力は 4 になります。