2

我的 Win32,DirectX 游戏在操作向量和矩阵的代码中以发布模式崩溃。具体来说,崩溃发生在这条指令上:

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

RodinaRelease.exe 中 0x014E2752 处的第一次机会异常:0xC0000005:访问冲突读取位置 0xFFFFFFFF

我在深入研究汇编和寄存器方面没有太多经验,但似乎esp = 0x0043f31c这会使esp+3Ch = 0x0043f358

现在,根据thisthis,该unpcklps指令是一条 SSE 指令,需要对齐 16 个字节。0x0043f358不是 16 字节对齐的,对吗?我认为堆栈的对齐是导致我崩溃的原因是否正确?

如果是这样,我做了什么应得的????我没有在我的游戏中使用 SSE 指令,所以我可以忽略这样的对齐问题 - 这是幼稚/错误的吗?有什么办法可以关闭这种行为?

相关点:

  • 我最近升级到 Visual Studio 2013,我怀疑这个错误是在这个时候出现的。我发现了一个与我的问题类似的错误报告。

  • 我的游戏使用 XNAMath,特别是 XMMATRIX 和 XMVECTOR。通常这需要我对齐所有内容。但是,因为我不想遇到这样的问题,所以我使用 _XM_NO_INTRINSICS_ 标志进行编译,该标志应该关闭 XNAMath 对 SIMD 指令的使用。直到现在,这似乎从来都不是问题。我正在处理的具体崩溃是我自己的向量类型,但它与 XMMATRIX 代码足够接近,我相信它们都是通过优化混合在一起的。

  • 我的游戏是作为 Win32 应用程序构建的。切换到 x64 是一个可行的解决方案,或者这会是荒谬的矫枉过正吗?除了需要获得我使用的 64 位版本的库之外,我不知道会产生什么后果。

4

1 回答 1

1

有关更多详细信息,请参阅此答案

请记住,x86 的 VS 2013 默认使用/arch:SSE2,因此即使_XM_NO_INTRINSICS_已定义,编译器也将使用 SSE/SSE2。出于这个原因,您可能应该停止使用_XM_NO_INTRINSICS_并让您的代码正确使用 DirectXMath 或 XNAMath。

也就是说,您可以尝试构建/arch:IA32以强制 Visual Studio 使用老式旧版 x87 而不是 SSE/SSE2 ...

于 2015-06-04T01:43:35.877 回答