1,寄存器:eax , ebx , ecx , edx , ebp , esp
ebp,esp 这两个寄存器中存放的是地址
这两个地址是用来维护函数栈帧的
每一个函数调用,都要在栈区开辟空
int Add(int x,int y)
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int a =10;
int b = 20;
int c = 0;
c = Add(a , b);
printf("%d\n",c);
return 0;
}
2,过程
起步处理
1)压栈
push esp
2)移动ebp
mov ebp,esp
3)减esp
sub esp,0E4h(十六进制值)
4)压栈ebx esi edi
push ebx
push esi
oush edi
5)初始化CCCC
lea__load effective address加载有效地址
lea edi,[ebp-0E4h]
mov ecx,39h
mov eax,0CCCCCCCCh
rep stos dword ptr es:[edi]
push 压栈:给栈顶放一个元素
pop 出栈:从栈顶删除一个元素
main函数执行
1)int a =10;
mov dword ptr [ebp-8],0Ah
2)int b = 20;
mov dword ptr [ebp-14h],14h
3)int c = 0;
mov dword ptr [ebp-20h],0
调用Add函数
mov eax,dword ptr [ebp-14h]
push eax
mov exc,dword ptr [ebp-8]
push ecx
call 00C210E1
add esp,8
mov dword ptr [ebp-20h],eax
生成Add函数栈帧
Add函数执行
注:形参用的是eax,ecx 即实参拷贝
返回值到eax