【C语言】——函数栈帧的创建和销毁(重要)

【C语言】——函数栈帧的创建和销毁(重要)_第1张图片

用以下代码来观察函数栈帧的创建和销毁

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;
}

分析情况如下图:

【C语言】——函数栈帧的创建和销毁(重要)_第2张图片

 对应的汇编代码如下:

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

你可能感兴趣的:(C,c语言,c++,算法)