我的 Win32,DirectX 游戏在操作向量和矩阵的代码中以发布模式崩溃。具体来说,崩溃发生在这条指令上:
014E2752 unpcklps xmm1,xmmword ptr [esp+3Ch]
RodinaRelease.exe 中 0x014E2752 处的第一次机会异常:0xC0000005:访问冲突读取位置 0xFFFFFFFF
我在深入研究汇编和寄存器方面没有太多经验,但似乎esp = 0x0043f31c
这会使esp+3Ch = 0x0043f358
现在,根据this和this,该unpcklps
指令是一条 SSE 指令,需要对齐 16 个字节。0x0043f358
不是 16 字节对齐的,对吗?我认为堆栈的对齐是导致我崩溃的原因是否正确?
如果是这样,我做了什么应得的????我没有在我的游戏中使用 SSE 指令,所以我可以忽略这样的对齐问题 - 这是幼稚/错误的吗?有什么办法可以关闭这种行为?
相关点:
我最近升级到 Visual Studio 2013,我怀疑这个错误是在这个时候出现的。我发现了一个与我的问题类似的错误报告。
我的游戏使用 XNAMath,特别是 XMMATRIX 和 XMVECTOR。通常这需要我对齐所有内容。但是,因为我不想遇到这样的问题,所以我使用 _XM_NO_INTRINSICS_ 标志进行编译,该标志应该关闭 XNAMath 对 SIMD 指令的使用。直到现在,这似乎从来都不是问题。我正在处理的具体崩溃是我自己的向量类型,但它与 XMMATRIX 代码足够接近,我相信它们都是通过优化混合在一起的。
我的游戏是作为 Win32 应用程序构建的。切换到 x64 是一个可行的解决方案,或者这会是荒谬的矫枉过正吗?除了需要获得我使用的 64 位版本的库之外,我不知道会产生什么后果。