理解C函数在Windows上使用__cdecl调用prolog

前端之家收集整理的这篇文章主要介绍了理解C函数在Windows上使用__cdecl调用prolog前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在调试模式下使用MSVC2008编译这个简单的函数
  1. int __cdecl sum(int a,int b)
  2. {
  3. return a + b;
  4. }

我得到以下反汇编列表:

  1. int __cdecl sum(int a,int b)
  2. {
  3. 004113B0 push ebp
  4. 004113B1 mov ebp,esp
  5. 004113B3 sub esp,0C0h
  6. 004113B9 push ebx
  7. 004113BA push esi
  8. 004113BB push edi
  9. 004113BC lea edi,[ebp-0C0h]
  10. 004113C2 mov ecx,30h
  11. 004113C7 mov eax,0CCCCCCCCh
  12. 004113CC rep stos dword ptr es:[edi]
  13. return a + b;
  14. 004113CE mov eax,dword ptr [a]
  15. 004113D1 add eax,dword ptr [b]
  16. }
  17. 004113D4 pop edi
  18. 004113D5 pop esi
  19. 004113D6 pop ebx
  20. 004113D7 mov esp,ebp
  21. 004113D9 pop ebp
  22. 004113DA ret

我不明白这些序言的一些部分:

  1. 004113BC lea edi,0CCCCCCCCh
  2. 004113CC rep stos dword ptr es:[edi]

为什么需要这个?

编辑:

删除/ RTC编译器选项后,正如所建议的那样,大部分代码确实消失了.剩下的是:

  1. int __cdecl sum(int a,int b)
  2. {
  3. 00411270 push ebp
  4. 00411271 mov ebp,esp
  5. 00411273 sub esp,40h
  6. 00411276 push ebx
  7. 00411277 push esi
  8. 00411278 push edi
  9. return a + b;
  10. 00411279 mov eax,dword ptr [a]
  11. 0041127C add eax,dword ptr [b]
  12. }

现在,为什么:sub esp,40h需要?这就像是为局部变量分配了地方,尽管没有.为什么编译器会这样做?还有另一面旗帜吗?

解决方法

代码由于 /RTC compile option而发出.它将函数中的所有局部变量初始化为极有可能产生访问冲突或导致异常输出值的位模式.这有助于您了解何时忘记初始化变量.

您看到分配的堆栈框架中的额外空间用于支持“编辑继续”功能.在调试时编辑函数添加更多局部变量时,将使用此空间.将/ ZI选项更改为/ Zi以禁用它.

猜你在找的C&C++相关文章