11

以下は、 GCC マニュアルの Extended Asm docsからの抜粋で、asmキーワードを使用して C にアセンブリ命令を埋め込む方法について説明しています。

1 つの出力パラメーター ( a ) がレジスター制約を許可し、別の出力パラメーター ( b ) がメモリー制約を許可する場合、同じ問題が発生する可能性があります。bのメモリ アドレスにアクセスするために GCC によって生成されたコードには、 a によって共有される可能性のあるレジスタが含まれている場合があり、GCC はそれらのレジスタを asm への入力と見なします。上記のように、GCC は、出力が書き込まれる前にそのような入力レジスタが消費されることを想定しています。この仮定により、asm ステートメントが b を使用する前に a に書き込むと、正しくない動作になる可能性があります。「&」を組み合わせる aのレジスタ制約を伴う修飾子により、aの変更がbによって参照されるアドレスに影響しないことが保証されます。. それ以外の場合、 bを使用する前にaが変更された場合、 bの場所は未定義です 。

aイタリック体の文は、 asm ステートメントが を使用する前に書き込むと、「不正な動作」が発生する可能性があることを示していbます。

このような「誤った動作」がどのように発生したのかわかりません。そのため、この段落を深く理解できるように、「誤った動作」を示す具体的な asm コードの例が必要です。

このような 2 つの asm コードが並行して実行されている場合に問題を認識できますが、上記の段落ではマルチプロセッシング シナリオについて言及していません。

1 つのコアに 1 つの CPU しかない場合、そのような誤った動作を引き起こす可能性のある asm コードを示していただけaますbb

私がよく知っているアセンブリ言語は Intel x86 アセンブリだけなので、そのプラットフォームをターゲットにした例を作成してください。

4

2 に答える 2