用以下代码来观察函数栈帧的创建和销毁
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", c);
return 0;
}
分析情况如下图:
对应的汇编代码如下:
main函数对应的汇编代码
int main()
{
001C18B0 push ebp
001C18B1 mov ebp,esp
001C18B3 sub esp,0E4h
001C18B9 push ebx
001C18BA push esi
001C18BB push edi
001C18BC lea edi,[ebp-24h]
001C18BF mov ecx,9
001C18C4 mov eax,0CCCCCCCCh
001C18C9 rep stos dword ptr es:[edi]
001C18CB mov ecx,1CC003h
001C18D0 call 001C131B
int a = 10;
001C18D5 mov dword ptr [ebp-8],0Ah
int b = 20;
001C18DC mov dword ptr [ebp-14h],14h
int c = 0;
001C18E3 mov dword ptr [ebp-20h],0
c = Add(a, b);
001C18EA mov eax,dword ptr [ebp-14h]
001C18ED push eax
001C18EE mov ecx,dword ptr [ebp-8]
001C18F1 push ecx
001C18F2 call 001C10B4
001C18F7 add esp,8
001C18FA mov dword ptr [ebp-20h],eax
printf("%d", c);
001C18FD mov eax,dword ptr [ebp-20h]
001C1900 push eax
001C1901 push 1C7B30h
001C1906 call 001C10D2
001C190B add esp,8
return 0;
001C190E xor eax,eax
}
001C1910 pop edi
001C1911 pop esi
001C1912 pop ebx
001C1913 add esp,0E4h
001C1919 cmp ebp,esp
001C191B call 001C1244
001C1920 mov esp,ebp
001C1922 pop ebp
001C1923 ret
Add函数对应的汇编代码
int Add(int x, int y)
{
001C1770 push ebp
001C1771 mov ebp,esp
001C1773 sub esp,0CCh
001C1779 push ebx
001C177A push esi
001C177B push edi
001C177C lea edi,[ebp-0Ch]
001C177F mov ecx,3
001C1784 mov eax,0CCCCCCCCh
001C1789 rep stos dword ptr es:[edi]
001C178B mov ecx,1CC003h
001C1790 call 001C131B
int z = 0;
001C1795 mov dword ptr [ebp-8],0
z = x + y;
001C179C mov eax,dword ptr [ebp+8]
001C179F add eax,dword ptr [ebp+0Ch]
001C17A2 mov dword ptr [ebp-8],eax
return z;
001C17A5 mov eax,dword ptr [ebp-8]
}
001C17A8 pop edi
001C17A9 pop esi
001C17AA pop ebx
001C17AB add esp,0CCh
001C17B1 cmp ebp,esp
001C17B3 call 001C1244
001C17B8 mov esp,ebp
001C17BA pop ebp
001C17BB ret