2

ベクトルと行列を操作しているコード内で、Win32、DirectX ゲームがリリース モードでクラッシュします。具体的には、次の命令でクラッシュが発生します。

014E2752 unpcklps xmm1,xmmword ptr [esp+3Ch]

RodinaRelease.exe の 0x014E2752 での初回例外: 0xC0000005: アクセス違反の読み取り場所 0xFFFFFFFF

私はアセンブリとレジスタを掘り下げることにあまり経験がありませんが、esp = 0x0043f31cそれはesp+3Ch = 0x0043f358

さて、これこれによると、unpcklps命令は16バイトのアラインメントを必要とするSSE命令です。0x0043f358は 16 バイトでアラインされていません。正しいですか? スタックの配置がクラッシュの原因であると考えるのは正しいですか?

もしそうなら、これに値するために私は何をしましたか???? 私は自分のゲームで SSE 命令を使用していないので、このようなアライメントの問題を無視できます - それはナイーブ/間違っていますか? この動作をオフにする方法はありますか?

関連するポイント:

  • 私は最近 Visual Studio 2013 にアップグレードしましたが、このバグがこの頃に発生したのではないかと疑っています。私の問題に似たバグレポートを見つけました。

  • 私のゲームでは、XNAMath、特に XMMATRIX と XMVECTOR を使用しています。通常、これにはすべてを調整する必要があります。ただし、このような問題に遭遇したくなかったので、XNAMath による SIMD 命令の使用をオフにすることになっている _XM_NO_INTRINSICS_ フラグを使用してコンパイルしています。それが今まで問題になったことは一度もありません。私が対処している特定のクラッシュは、私自身のベクター型によるものですが、XMMATRIX コードに十分に近いため、最適化によってすべてが混ざり合っていると考えられます。

  • 私のゲームは Win32 アプリケーションとしてビルドされています。x64 への切り替えはこれに対する実行可能な解決策ですか、それともばかげたやり過ぎでしょうか? 私が使用するライブラリの 64 ビット バージョンを取得する必要がある以外に、どのような結果が生じるかはわかりません。

4

1 に答える 1

1

詳細については、この回答を参照してください。

VS 2013 for x86 はデフォルトで使用/arch:SSE2することに注意してください。定義されていても_XM_NO_INTRINSICS_、コンパイラは SSE/SSE2 を使用します。そのため、使用_XM_NO_INTRINSICS_をやめて、コードで DirectXMath または XNAMath を正しく使用できるようにする必要があります。

/arch:IA32そうは言っても、 Visual Studio で SSE/SSE2 の代わりに古い学校のレガシー x87 を使用するように強制的にビルドすることができます...

于 2015-06-04T01:43:35.877 に答える