为什么编译器会生成此代码?

Meh*_*dad 11 c assembly disassembly visual-c++

我反汇编了一个目标文件(很可能是使用Visual C++编译器生成的)DumpBin并看到了以下代码:

...         ...
mov         dword ptr [ebp-4],eax       // Why save EAX?
push        dword ptr [ebp+14h]
push        dword ptr [ebp+10h]
push        dword ptr [ebp+0Ch]
push        dword ptr [ebp+8]
mov         eax,dword ptr [ebp-4]       // Why restore EAX? Did it change at all?
call        <function>
...         ...
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么EAX寄存器被保存并通过这4 push条指令恢复?

Mat*_*lia 10

此外,也许它是在发布模式下编译的,但是该变量已经被标记为volatile,它告诉编译器这个变量可能在它不知道的情况下发生变化,因此它被迫在堆栈上/从堆栈中连续写入/恢复它


Cra*_*rks 6

这是内置调试模式吗?如果是这样,编译器会将每个局部变量存储在堆栈中,以便调试器可以以一致的方式找到它们.

这种不必要的存储和重新加载的省略是构成"释放"模式的优化之一.