栈帧的基本概念和函数调用约定_逆向之旅011

本文介绍了栈帧的基本概念,阐述了函数调用时内存需求的原因,并详细讲解了函数调用约定,包括cdecl、stdcall和fastcall三种约定,讨论了它们在参数位置和栈清理责任上的区别。
摘要由CSDN通过智能技术生成


前言

本文将介绍栈帧的基本概念以及对函数调用约定进行总结。

一、栈帧的基本概念

1.函数调用时需要内存。为啥需要内存?

  1. 函数的调用方需要给被调用函数传递参数,这些参数需要找个地方存放;

  2. 函数在执行过程中,会需要临时的存储空间,例如函数内部会定义一些局部变量。

回答完上述问题后,就引出了栈帧这个概念。栈帧就是为了程序员不用操心自己亲手去设计 函数参数和局部变量进行分配和释放内存的过程 。(这一过程对程序员透明)
接下来是调用一个函数时的详细操作步骤。

  1. 调用方将被调用函数需要的参数放入到指定的位置。(谁指定的? 答: 由函数调用约定来指定这些位置
  2. 调用方将程序的控制权交给被调用的函数,(call指令或者MIPS中的 JAl指令执行交接权力这一过程。)然后返回地址会保存在程序栈或者寄存器中。
  3. 如有必要,被调用的函数会配置一个栈指针,并保存调用方希望保持不变的任何寄存器值。
  4. 被调用函数为其内部的局部变量分配空间,通常是通过调整栈指针来在运行时栈上开辟空间来实现。
  5. 被调用函数来实现他的功能,并可能产生一个结果,这个结果通常会被放到一个特定的寄存器中(例如EAX),或者是在函数返回后调用方可以立即访问的寄存器。
  6. 释放为局部变量开辟的栈空间。
  7. 恢复第(3)步中调用方希望保持不变的寄存器的值,其中包括调用方的指针寄存器。
  8. 将控制权交给调用方。(使用RET指令或者MIPS中的JR指令,这一过程中根据函数调用约定,会从程序栈中删除若干参数)
  9. 调用方获得控制权后,可能需要阐述栈中的参数,这是可能需要对栈进行调整,将栈指针恢复到第一步以前的值。

二、函数调用约定总结

1.函数调用约定

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值