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

理解C函数在Windows上使用__cdecl调用prolog,第1张

概述在调试模式下使用MSVC2008编译这个简单的函数: int __cdecl sum(int a, int b){ return a + b;} 我得到以下反汇编列表: int __cdecl sum(int a, int b){004113B0 push ebp 004113B1 mov ebp,esp 004113B3 sub 在调试模式下使用MSVC2008编译这个简单的函数:
int __cdecl sum(int a,int b){    return a + b;}

我得到以下反汇编列表:

int __cdecl sum(int a,int b){004113B0  push        ebp  004113B1  mov         ebp,esp 004113B3  sub         esp,0C0h 004113B9  push        ebx  004113BA  push        esi  004113BB  push        edi  004113BC  lea         edi,[ebp-0C0h] 004113C2  mov         ecx,30h 004113C7  mov         eax,0CCCCCCCCh 004113CC  rep stos    DWord ptr es:[edi]     return a + b;004113CE  mov         eax,DWord ptr [a] 004113D1  add         eax,DWord ptr [b] }004113D4  pop         edi  004113D5  pop         esi  004113D6  pop         ebx  004113D7  mov         esp,ebp 004113D9  pop         ebp  004113DA  ret

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

004113BC  lea         edi,0CCCCCCCCh 004113CC  rep stos    DWord ptr es:[edi]

为什么需要这个?

编辑:

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

int __cdecl sum(int a,int b){00411270  push        ebp  00411271  mov         ebp,esp 00411273  sub         esp,40h 00411276  push        ebx  00411277  push        esi  00411278  push        edi      return a + b;00411279  mov         eax,DWord ptr [a] 0041127C  add         eax,DWord ptr [b] }

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

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

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

总结

以上是内存溢出为你收集整理的理解C函数在Windows上使用__cdecl调用prolog全部内容,希望文章能够帮你解决理解C函数在Windows上使用__cdecl调用prolog所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1236894.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存