栈的基础知识-函数调用栈的过程图解

栈的基础知识

eip寄存器 存放的指针指向程序即将执行到的地址

esp(32位)/rsp(64位)寄存器 存放函数的栈顶指针

ebp/rbp寄存器 存放函数的栈底指针

函数调用栈
过程

•函数调用栈是指程序运行时内存一段连续的区域

•用来保存函数运行时的状态信息,包括函数参数与局部变量等

•称之为“栈”是因为发生函数调用时,调用函数(caller)的状态被保存在栈内,被调用函数(callee)的状态被压入调用栈的栈顶

•在函数调用结束时,栈顶的函数(callee)状态被弹出,栈顶恢复到调用函数(caller)的状态

•函数调用栈在内存中从高地址向低地址生长,所以栈顶对应的内存地址在压栈时变小,退栈时变大

在这里插入图片描述

栈帧

栈帧储存的是一个函数在栈中的信息,一般来说相邻的栈帧的关系是父函数与子函数之间的关系,子函数的栈底指针会保存父函数栈底指针的地址。

在这里插入图片描述

函数调用栈的工作方式(32位)

在这里插入图片描述

① 将ebp压入栈中

②将ebp指针指向esp指针指向的位置

③ 将esp向下增长0x10个字长(4字节)

④再向下开辟一段内存,用于存放向函数中传入的3 2 1 值,esp始终指向栈顶,所以向栈中压入数据时,esp会自动的向下移动位置

⑤eip指到了调用子函数的地址,所以eip紧接着就跳到了子函数开始的地址,此时esp也在栈中开辟了return adress(callee)空间,用于存放eip指向子函数之前的地址。

⑥ 同步骤①,同时还要在栈中开辟空间存放父函数的ebp指针指向的地址

⑦ 计算

⑧ 子函数的内容执行完毕,eip向下移动准备释放子函数的栈帧空间。

pop ebp :将栈顶esp指向的地址中的值弹到ebp中。

在该实例中的意思就是:将父函数的ebp指针的地址弹到ebp寄存器中,使得ebp指向父函数的栈底,为释放子函数的栈帧做铺垫。

⑨ ret操作之后子函数执行完毕,继续执行父函数(main),执行完毕以后进行操作->leave->ret

函数调用栈到此结束!!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

关于32位和64位程序中函数参数的补充

x86(32位)程序
使用栈来传递参数
使用 eax 存放返回值
amd64位程序
前6个参数依次存放于 rdi、rsi、rdx、rcx、r8、r9 寄存器中
第7个以后的参数存放于栈中

  • 26
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值