一、函数的堆栈调用
以简单求和代码为例具体分析:
#include<iostream>
int Sum(int a ,int b)
{
int tmp=0;
tmp=a+b;
return tmp;
}
int main()
{
int a=10;
int b=20;
rt=Sum(a,b);
return 0;
}
首先明确一下指令:
1.移动数据:mov , dword ptr[ebp-4],0ah 即:int a=10;
2.移动地址:lea ,eax,ebp-4
3.压栈:push 0ah
4.出栈:pop eax 即:eax=pop()
5.加:add eax,0ah 即:eax+=0a
6.减:sub eax,0ah 即:eax-=0a
7.调用函数:call
8.返回值:ret
9.寄存器:eax、ebx、ecx、edx
10.ebp:栈底指针寄存器(存放调用方栈底指针地址)
11.esp:栈顶指针寄存器
12.PC:下一行指令寄存器
简单总结堆栈调用过程如下:
1.形参初始化
2.压入下一行指令地址
3.压入调用方的栈底指针寄存器的值
4.移动ebp到调用方栈底
5.开辟局部变量活动所需要的栈空间,并初始化为CCCC CCCC