由一个.cpp/.c文件到达一个可执行文件分为以下几部分
预编译阶段:进行宏替换,删除注释,展开头文件,添加行号等
编译阶段:进行词法,语法,语义分析,和代码优化,生成汇编指令
汇编:翻译指令
连接阶段:合并段和符号表,符号解析
运行阶段:建立虚拟地址和物理映射,加载指令和数据,程序入口地址写入寄存器中
c++内存分布
c++函数调用参数传递(编译器为vs2013)
执行一个简单的函数
#include
using namespace std;
void fun(int a, int b)
{
int tmp = a + b;
}
int main()
{
int a=10;
int b = 20;
fun(a, b);
}
main函数栈开辟完成后对ab进行赋值其中esp栈顶指针,ebp栈底指针
调用fun函数之前,main函数首先开辟空间初始化形参
通过两次push将实参压入,形参初始化
从汇编可以看出形参是通过从右向左赋值
然后跳转到fun函数地址执行
CALL指令会将下一条汇编指令入栈,然后跳转
esp中的值为0X005DF750,根据call指令则在栈顶应为call的下一条指令地址
查看内存:
此时函数栈应为:
fun函数首先将ebp寄存器中值压入栈中,这样可以回退到main函数中,然后在跳转到fun函数栈上
此时栈为:
开辟空间并初始化为0cccccccch
执行完成,清除空间并返回ebp值,ret用栈中的值修改ip值,此时栈应为:
在main函数中执行
清理为形参开辟的空间
从这调用可以看出在c语言默认的调用约定下有调用者开辟形参空间,并且由调用者释放空间
c++函数堆栈调用
最新推荐文章于 2024-06-11 12:31:36 发布