首先esp是堆栈指针...........ebp是基址指针...........
.C文件
int Func(int a,int b,int c,int e);
void main()
{
int d = Func(1,2,3,4);
getchar();
}
int Func(int a,int b,int c,int e)
{
return (a+b+c+e);
}
在调试的时候调用函数一般会看到如下形式:
012213B0 push ebp ;把ebp入栈用来保存调用函数前的基址指针用于 返回用
012213B1 mov ebp,esp ;esp赋给ebp 保存调用函数前的堆栈指针012213B3 sub esp,0CCh
012213B9 push ebx
012213BA push esi
012213BB push edi
012213BC lea edi,[ebp-0CCh]
012213C2 mov ecx,33h ;计数器
012213C7 mov eax,0CCCCCCCCh ;
012213CC rep stos dword ptr es:[edi] ;用eax寄存器的内容 填充以edi地址开头,以ecx寄存器内容为个数,的内存
;-------------------------------整个的意思就是把堆栈用cc填充--------------------------------------------------
int d = Func(1,2,3,4);012213CE push 4
012213D0 push 3
012213D2 push 2
012213D4 push 1
012213D6 call @ILT+325(_Func) (122114Ah)
012213DB add esp,10h
012213DE mov dword ptr [d],eax
...................
01221420 push ebp
01221421 mov ebp,esp
01221423 sub esp,0C0h
01221429 push ebx
0122142A push esi
0122142B push edi
0122142C lea edi,[ebp-0C0h]
01221432 mov ecx,30h
01221437 mov eax,0CCCCCCCCh
0122143C rep stos dword ptr es:[edi]
return (a+b+c+e);
0122143E mov eax,dword ptr [a]
01221441 add eax,dword ptr [b]
01221444 add eax,dword ptr [c]
01221447 add eax,dword ptr [e]
}
0122144A pop edi
0122144B pop esi
0122144C pop ebx
0122144D mov esp,ebp
0122144F pop ebp
01221450 ret