函数栈帧的创建和销毁(待写)

Posted 4nc414g0n

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数栈帧的创建和销毁(待写)相关的知识,希望对你有一定的参考价值。

函数栈帧的创建和销毁

main函数被调用的过程:

mainCRTStartup() 调用 _tmainCRTStartup() 再调用 main()

寄存器:
ebp(栈底指针),esp(栈顶指针)sp 是esp的低16位,esp是rsp的低32位,ss是16位堆栈段寄存器
了解更多:x86汇编学习历程7----从1加到100并显示(引入栈)

具体过程

C代码如下:

#include <stdio.h>
int Add(int x, int y)
{
	int z = x + y;
	return z;
}
int main()
{
	int a = 8;
	int b = 10;
	int c = 0;
	c= Add(a, b);
	return 0;
}

反汇编出的汇编代码如下
int main()
{

00171760 push ebp

00171761 mov ebp,esp

00171763 sub esp,0E4h

00171769 push ebx
0017176A push esi
0017176B push edi
0017176C lea edi,[ebp+FFFFFF1Ch]
00171772 mov ecx,39h
00171777 mov eax,0CCCCCCCCh
0017177C rep stos dword ptr es:[edi]

0017177E mov ecx,17C003h
00171783 call 00171208
int a = 8;
00171788 mov dword ptr [ebp-8],8
int b = 10;
0017178F mov dword ptr [ebp-14h],0Ah
int c = 0;
00171796 mov dword ptr [ebp-20h],0
c= Add(a, b);
0017179D mov eax,dword ptr [ebp-14h]
001717A0 push eax
001717A1 mov ecx,dword ptr [ebp-8]
001717A4 push ecx
001717A5 call 001711C2
001717AA add esp,8
001717AD mov dword ptr [ebp-20h],eax
return 0;
001717B0 xor eax,eax
}
001717B2 pop edi
001717B3 pop esi
001717B4 pop ebx
001717B5 add esp,0E4h
001717BB cmp ebp,esp
001717BD call 00171212
001717C2 mov esp,ebp
001717C4 pop ebp
001717C5 ret

以上是关于函数栈帧的创建和销毁(待写)的主要内容,如果未能解决你的问题,请参考以下文章

C语言进阶 顶级神功! 函数栈帧的创建和销毁

图解C/C++语言底层:函数调用过程之函数栈帧的创建和销毁(上)

图解C/C++语言底层:函数调用过程之函数栈帧的创建和销毁(上)

函数栈帧的创建与销毁,带你了解代码底层原理

函数栈帧的创建与销毁

函数栈帧的创建与销毁