完全转储中的英特尔寄存器是否因引发访问冲突而被覆盖



我们的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注意到这一点。

最新更新