在调试模式下使用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需要?这就像是为局部变量分配了地方,尽管没有.为什么编译器会这样做?还有另一面旗帜吗?