インライン アセンブラ コードが壊れています。clobber リストに追加せずに EAX と EBX を直接使用することはできません。そうしないと、コンパイラはどのレジスタが変更されたかを認識できません。
変更したレジスタの 1 つに、後でセグメンテーション違反の原因となった非常に重要な何かが含まれている可能性が非常に高いです。
このコードは、1 つの要素を array1 から array2 にコピーします。
asm (
"movl (%0), %%eax \n\t" /* read first dword from array1 into eax */
"movl %%eax, (%1) \n\t" /* write dword into array2
: /* outputs */
: /* inputs */ "r"(array1),"r"(array2)
: /* clobber */ "eax", "memory"
);
適切なレジスタ制約を備えたより良いバージョンでは、次のようにハードコードされた EAX が削除されます。
int dummy;
asm (
"movl (%1), %0 \n\t"
"movl %0, (%2) \n\t"
: /* outputs, temps.. */ "=r" (dummy)
: /* inputs */ "r"(array1),"r"(array2)
: /* clobber */ "memory"
);
ところで - 一般的に、あなたはまだアセンブラに慣れていないように感じます。インライン アセンブラを記述することは、すべてのコンパイラ マジックにより、正しく行うのが少し難しくなります。アセンブラーでいくつかの単純な関数を書き始め、それらを最初に別の .S ファイルに入れることをお勧めします..その方がはるかに簡単です..