作者:王靖 blog地址:http://blog.csdn.net/wang_jing_2008
实验环境:
实验平台:visual studio 2010 + Win 7(x64)
说明:编译器运行在Debug模式 Win32模式下。见图1:
实验调试源码:
#include "stdafx.h"
#include <iostream>
#include <cstdio>
using namespace std;
int sum (int a,int b,int c)
{
returna+b+c;
}
int main()
{
int i=3;
int j=4;
int k=5;
int m;
m=sum(i,j,k);
return 0;
}
反汇编代码:
Main函数:
int main()
{
01131580 push ebp
01131581 mov ebp,esp
01131583 sub esp,0F0h
01131589 push ebx
0113158A push esi
0113158B push edi
0113158C lea edi,[ebp-0F0h]
01131592 mov ecx,3Ch
01131597 mov eax,0CCCCCCCCh
0113159C rep stos dword ptr es:[edi]
inti=3;
0113159E mov dword ptr [i],3
intj=4;
011315A5 mov dword ptr [j],4
intk=5;
011315AC mov dword ptr [k],5
intm;
m=sum(i,j,k);
011315B3 mov eax,dword ptr [k]
011315B6 push eax
011315B7 mov ecx,dword ptr [j]
011315BA push ecx
011315BB mov edx,dword ptr [i]
011315BE push edx
011315BF call sum (1131258h)
011315C4 add esp,0Ch
011315C7 mov dword ptr [m],eax
return 0;
011315CA xor eax,eax
}
011315CC pop edi
011315CD pop esi
011315CE pop ebx
011315CF add esp,0F0h
011315D5 cmp ebp,esp
011315D7 call @ILT+405(__RTC_CheckEsp) (113119Ah)
011315DC mov esp,ebp
011315DE pop ebp
011315DF ret
Sum函数:
int sum (int a,intb,int c)
{
011314E0 push ebp
011314E1 mov ebp,esp
011314E3 sub esp,0C0h
011314E9 push ebx
011314EA push esi
011314EB push edi
011314EC lea edi,[ebp-0C0h]
011314F2 mov ecx,30h
011314F7 mov eax,0CCCCCCCCh
011314FC rep stos dword ptr es:[edi]
return a+b+c;
011314FE mov eax,dword ptr [a]
01131501 add eax,dword ptr [b]
01131504 add eax,dword ptr [c]
}
01131507 pop edi
01131508 pop esi
01131509 pop ebx
0113150A mov esp,ebp
0113150C pop ebp
0113150D ret
运行栈分析:
接下来我们分析main函数调用sum函数过程。
前面main函数退栈部分:
函数运行栈的情况:
自己看到一篇文章,不过我没阅读。放着给大家参考:http://blog.csdn.net/happylife1527/article/details/7915387