1.函数的调用过程即函数栈帧,是编译器要用来实现函数调用的一个过程。栈帧(stack frame),机器用栈来传递过程参数,存储返回信息,保存寄存器用于以后恢复,以及本地存储。为单个过程(函数调用)分配的那部分栈称为栈帧。栈帧其实是两个指针寄存器,寄存器%ebp为帧指针,而寄存器%esp为栈指针,当程序运行时,栈指针可以移动(大多数的信息的访问都是通过帧指针的)。总之简单一句话,栈帧的主要作用是用来控制和保存一个过程的所有信息的。下面我们就用一个简单的Add()函数分析函数栈帧的过程。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int Add(int x, int y)
{
int ret = 0;
ret = x + y;
return ret;
}
int main()
{
int a = 10;
int b = 20;
int ret=Add(a, b);
getchar();
return 0;
}
2此时我们转到反汇编,查看整个函数的调用过程。
int main()
{
011616D0 push ebp
011616D1 mov ebp,esp
011616D3 sub esp,0D8h
011616D9 push ebx
011616DA push esi
011616DB push edi
011616DC lea edi,[ebp-0D8h]
011616E2 mov ecx,36h
01161