4

Windows 用の VS2012 および GCC (CodeBlocks) でプロジェクトをコンパイルしています。VS2012 では、すべてが完璧に機能します。GCC では、次のコンパイル エラーが発生します。

C:\Users\Piotrek\AppData\Local\Temp\ccfdl0Ye.s|164|Error: invalid use of register|
C:\Users\Piotrek\AppData\Local\Temp\ccfdl0Ye.s|166|Error: invalid use of register|
C:\Users\Piotrek\AppData\Local\Temp\ccfdl0Ye.s|221|Error: invalid use of register|
||=== Build finished: 3 errors, 14 warnings (0 minutes, 0 seconds) ===|

コンパイラ オプション -fpermissive を使用しています。エラーとは関係ありません。

Local Tempフォルダーの下の一時ファイルを指していて、間違ったレジスタを使用していると言っているのはなぜですか??

何が起こっているのか誰にも分かりませんか?

4

2 に答える 2

4

コンパイラでバグが発生したようです。エラー メッセージ (「ソース」ファイル名から判断) は、アセンブラからのものです。アセンブラがエラー メッセージを生成するのは、アセンブラに不正なものがある場合のみであり、C++ コンパイラは不正なアセンブラを生成するべきではありません。正当なアセンブラを生成できない場合は、エラー メッセージを出力して失敗するはずです。

この種のメッセージが表示された場合の本当の問題は、コード内の何がそれを引き起こしているのかを突き止めることです。g++ には、中間ファイルを削除しないように指示するオプションがあります。これを使用して、アセンバー ファイルのこれらの行で何が起こっているかを試してみてください。(アセンブラを出力するように g++ に依頼すると、対応するソースを見つけるのに役立つ適切なコメントが挿入されます。中間ファイルとしてアセンブラを生成するときにもこれを行うかどうかはわかりません。)そして、コードをカットしてみてください(さらに悪い場合はさらに悪いことに、バイナリ検索を使用して) 1 行または 2 行のプログラムのエラーが得られるまで。それらの何が特別なのかを推測し、同じことを別の方法で行うように変更してみてください。

そして、エラーを g++ に報告することを忘れないでください。

于 2013-02-25T12:35:51.137 に答える
1

James Kanzeの勧めのおかげで、一時ファイルを削除しないようにコンパイラーに指示することにしました。これはフラグによって行われます:

-save-temps

Jamesが言ったように、アセンブラは、C++コードのどの行がエラーをスローしているかを正確に通知するいくつかの素晴らしいコメントを生成します。私の場合、そのような指示を受け入れていないようです。

asm
(
    ".intel_syntax noprefix\n"
    "lock dec [DWORD PTR eax]\n"
    ".att_syntax \n"
    :
    : "a" (data)
    :
);

以前のGCCバージョンで動作していたため、なぜ彼がIntel構文を受け入れなくなったのかわかりませんが、更新したので、もう受け入れられません。

とにかく、そのような問題の解決策は、Jamesが述べたものです。中間ファイルを削除しないでください。そうすれば、何が問題なのかをアセンブリコードに直接スパイできます。

INTEL構文の問題について、なぜそれが機能しなくなったのか考えてみてください。

于 2013-02-26T13:18:34.517 に答える