zoukankan      html  css  js  c++  java
  • IDA Pro 权威指南学习笔记(十)

    栈帧(stack frame)是在程序的运行时栈中分配的内存块,用于特定的函数调用

    如果一个函数没有执行则不需要内存,当函数被调用时就需要用到内存

    1.传给函数的参数的值需要存储到函数能够找到它们的位置

    2.函数在执行过程中可能需要临时的存储空间,通过声明局部变量来分配这类临时空间,这些变量在函数内部使用,函数调用完后,就无法再访问它们

    在将控制权转交给函数之前,编译器会插入代码,将函数参数放入栈帧内,并分配足够的内存,以保存函数的局部变量

    函数的返回地址也存储在新的栈帧内

    使用栈帧使得递归成为可能,因为每个递归函数调用都有它自己的栈帧,这恰好将当前调用与前一次调用分隔开来。

    调用一个函数时的步骤:

    (1) 调用方将被调用函数所需的参数放到该函数的调用约定指定的位置,如果参数被放到运行时栈上,该操作可能导致程序的栈指针发生改变

    (2) 调用方将控制权转交给被调用的函数,这个过程通常由 x86 CALL 或 MIPS JAL 等指令执行,然后,返回地址被保存到程序栈或 CPU 寄存器中

    (3) 如有必要,被调用的函数会配置一个栈指针,并保存调用方希望保持不变的任何寄存器值

    帧指针是一个指向栈帧位置的寄存器,栈帧内的变量根据它们与帧指针所指向的位置的相对距离来引用

    (4) 被调用的函数为它可能需要的任何局部变量分配空间,一般通过调整程序栈指针在运行时栈上保留空间来完成

    (5) 被调用的函数执行其操作,可能返回一个结果,该结果通常被放置到一个特定的寄存器中,或者放置到函数返回后调用方可立即访问的寄存器中

    (6) 函数完成其操作后,任何为局部变量保留的栈空间将被释放,通常逆向执行第(4)步中的操作就可以完成这个任务

    (7) 如果某个寄存器的值还为调用方保存(第(3)步)着,就会把它恢复到原始值,包括恢复调用方的帧指针寄存器

    (8) 被调用的函数将控制权返还给调用方,实现这一操作的主要指令是 x86 RET 和 MIPS JR,该操作可能还会从程序栈中清除一个或多个参数

    (9) 调用方重新获得控制权后,可能需要删除程序栈中的参数,这时可能需要对栈进行调整,来将程序栈指针恢复到第(1)步以前的值

    第(3)步和第(4)步通常在进入函数时执行,它们共同称为该函数的序言

    第(5)步则代表函数的主体,是调用一个函数时执行的全部操作

    第(6)步到第(8)步一般在函数结束时执行,它们共同构成该函数的尾声

  • 相关阅读:
    MySQL_Sql_打怪升级_进阶篇_进阶1:基础查询
    [20210218]shared latch spin count 5.txt
    springboot逻辑删除
    springboot整合mybatis-plus的两种分页查询方式--自定义的结果集分页返回浏览器
    spring图片上传并返回绝对路径
    springboot+mybatisplus 逻辑删除
    mybatisplus枚举类
    Could not find resource com/meng/dao/UserMapper.xml
    jsp页面表单提交后mysql未更新原因
    springMVC拦截器的使用
  • 原文地址:https://www.cnblogs.com/sch01ar/p/9512847.html
Copyright © 2011-2022 走看看