我们的Windows应用程序因访问违规而不断崩溃。我们的系统设置为在崩溃发生时捕获应用程序状态的完整转储。我不是来解释车祸的。。。我想了解我看到的RAX寄存器在完全转储中的一个奇怪之处。
以下是汇编片段:
000000007B0D306A mov rax,qword ptr [rsp+68h]
000000007B0D306F movzx eax,byte ptr [rax+rcx]
000000007B0D3073 test eax,eax
000000007B0D3075 je 000000007B0D3117
000000007B0D307B mov ecx,dword ptr [rsp]
000000007B0D307E mov rax,qword ptr [rsp+58h] <<< CRASH
请注意,我们在代码片段的第一行和最后一行写入RAX。程序集的最后一行是访问冲突。因为崩溃发生了,我希望RAX仍然保持它之前从";rsp+68h";,但事实并非如此。rsp+68h是一个有效的内存地址,但在崩溃转储中,RAX的值为1。
我已经排除了对内存进行任何形式的重写,并且其他每个寄存器似乎都具有我希望它在代码中此时具有的值。
所以我的问题是:当抛出异常时,是否有什么东西会覆盖RAX寄存器作为异常的一部分?或者,为什么RAX不再有以前的价值,还有其他解释吗?
这个重写是可以解释的。重写";eax";重写之间的寄存器";rax";因为一个是另一个的子集。感谢用户@edm注意到这一点。