转载于CSDN:http://blog.csdn.net/do2jiang/article/details/5404566

  在计算机科学中,Call stack是指存放某个程序的正在运行的函数的信息的栈。Call stack和stack frames组成,每个stack frame对应于一个未完成运行的函数。

  在当今流行的计算机体系架构中,大部分计算机的参数传递,局部变量的分配和释放都是通过操纵程序栈来实现的。栈用来传递函数参数,存储返回值信息,保存寄存器以供恢复调用前处理机状态。每次调用一个函数,都要为该次调用的函数实例分配栈空间。为单个函数分配的那部分栈空间就叫做stack frame,也就是说,stack frame这个说法主要是为了描述函数调用关系的。

  Stack frame组织方式的重要性和作用体现在两个方面:

  第一:它使调用者和被调用者达成某种约定。这个约定定义了函数调用时函数参数的传递方式,函数返回值的返回方式,寄存器如何在调用者和被调用者之间进行共享。

  第二:它定义了被调用者如何使用它自己的stack frame来完成局部变量的存储和使用。

  1. 上图描述的是一种典型的(MIPS 32)嵌入式芯片的stack frame组织方式。
  2. 这张图中,计算机的栈空间采用的是向下增长的方式。
  3. sp(stack pointer)就是当前函数的栈指针,它指向的是栈底的位置。
  4. Current Frame所示即为当前函数(被调用者)的frame。
  5. Caller's Frame是当前函数的调用者的frame。
  6. 每个frame中所存放的内容和存放顺序,则由目标体系架构的调用约定(calling convention)定义。
  7. MIPS O32调用约定规定了所占空间不大于4个比特的参数应该放在从$4到$8的寄存器中,剩下的参数应该依次放到调用者stack frame的参数域中,并且在参数域中需要前四个参数保留栈空间。
  8. 如果被调用者需要使用$16到$23这些保留寄存器(saved register),就必须先将这些保留寄存器的值保存在被调用者stack frame的保留寄存器域中,当被调用者返回时恢复这些寄存器值。
  9. 当被调用者不是叶子函数时,即被调用者中存在对其它函数的调用,需要将RA(return address)寄存器($31)值保存到被调用者stack frame的返回值域中。
  10. 被调用者所需要的局部变量,应保存在被调用者stack frame的本地变量域中。
  1. 在没有BP(base pointer)寄存器的目标架构中,进入一个函数时需要将当前栈指针向下移动n比特,这个大小为n比特的存储空间就是此函数的stack frame的存储区域。此后栈指针便不再移动,智能在函数返回时再将栈指针上这个偏移量恢复栈现场。由于不能随便移动栈指针,所以寄存器压栈和出栈都必须指定偏移量。
  1. 在RISC计算机中主要参与计算的是寄存器,saved registers就是指在进入一个函数后,如果某个保存原函数信息的寄存器会在当前函数中被使用,就应该将此寄存器保存到堆栈上,当函数返回恢复此寄存器值。而且由于RISC计算机大部分采用定长指令或者定变长指令,一般指令长度不会超过32个位。而现代计算机的内存地址范围已经扩展到32位,这样在一条指令里就不足以包含有效的内存地址,所以RISC计算机一般借助于一个返回地址寄存器RA来实现函数的返回。几乎在每个函数调用中都会使用到这个寄存器,所以在很多情况下RA寄存器会被保存在堆栈上以避免被后面的函数调用修改,当函数需要返回时,从堆栈上取回RA然后跳转。移动SP和保存寄存器的动作一般处在函数的开头,叫做function prologue;恢复这些寄存器状态的动作一般放在函数的最后,叫做fuction epilogue。

MIPS架构上函数调用过程的堆栈和栈帧的更多相关文章

  1. c函数调用过程原理及函数栈帧分析

    转载自地址:http://blog.csdn.net/zsy2020314/article/details/9429707       今天突然想分析一下函数在相互调用过程中栈帧的变化,还是想尽量以比 ...

  2. C函数调用过程原理及函数栈帧分析(转)

    在x86的计算机系统中,内存空间中的栈主要用于保存函数的参数,返回值,返回地址,本地变量等.一切的函数调用都要将不同的数据.地址压入或者弹出栈.因此,为了更好地理解函数的调用,我们需要先来看看栈是怎么 ...

  3. 在C语言中函数及其调用过程

    目录 函数 C语言中的变参函数 函数的本质是什么 内存区域的区分技巧 函数的调用过程 栈帧的概念 调用过程细节 按照约定传参 函数 如果一个函数有声明没实现,那么就会出现链接错误: 以上代码会出现链接 ...

  4. 第5篇-调用Java方法后弹出栈帧及处理返回结果

    在前一篇 第4篇-JVM终于开始调用Java主类的main()方法啦 介绍了通过callq调用entry point,不过我们并没有看完generate_call_stub()函数的实现.接下来在ge ...

  5. Dubbo学习(六) dubbo 架构图 以及调用过程

    一.Dubbo结构图   duubo结构图 我们解释以下这个架构图:Consumer服务消费者,Provider服务提供者.Container服务容器.消费当然是invoke提供者了,invoke这条 ...

  6. 代码 or 指令,浅析ARM架构下的函数的调用过程

    摘要:linux程序运行的状态以及如何推导调用栈. 1.背景知识 1.ARM64寄存器介绍: 2.STP指令详解(ARMV8手册): 我们先看一下指令格式(64bit),以及指令对于寄存机执行结果的影 ...

  7. MIPS指令 MIPS架构

    华中科技大学 - 计算机组成原理 华中科技大学 - 计算机硬件系统设计 Microprocessor without Interlocked Pipleline Stages 无内部互锁流水级的微处理 ...

  8. 如何在linux主机上运行/调试 arm/mips架构的binary

    如何在linux主机上运行/调试 arm/mips架构的binary 原文链接M4x@10.0.0.55 本文中用于展示的binary分别来自Jarvis OJ上pwn的add,typo两道题 写这篇 ...

  9. Hbase的WAL在RegionServer基本调用过程

    版权声明:本文由熊训德原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/221 来源:腾云阁 https://www.qclo ...

随机推荐

  1. ubuntu安装网易云音乐

    1直接安装sudo dpkg -i netease-cloud-music_1.0.0_i386_ubuntu16.04.deb 2修复并自动安装所有依赖包 sudo apt-get install ...

  2. Python 2和Python 3的编码问题

    在Python2中,字符串无法完全地支持国际字符集和Unicode编码.为了解决这种限制,Python2对Unicode数据使用了单独的字符串类型.要输入Unicode字符串字面量,要在第一个引号前加 ...

  3. Django-website 程序案例系列-16 modle.form(表单验证)

    案例程序: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  4. C# 后台访问webapi

    具体在哪看见的忘记了. 异步: public static class CallWebAPI { public static async Task<string> APIPost(stri ...

  5. MT【241】红蓝两色染色

    用红蓝两色给$3*3$的格子染色,要求每行每列每种颜色都有,则不同的染色方法_____ 分析:按红色格子数分类,1)红色3或者6个有6种.2)红色4或者5个有45种.故一共有2*(6+45)=102种 ...

  6. 自学Python1.3-centos内python3并与python2共存

    自学Python之路 自学Python1.3-centos内python3并与python2共存 1. 查看是否已经安装Python 测试机系统CentOS 7 默认安装了python2.7, 使用 ...

  7. Internet Explorer 10 administration IE10管理

    http://4sysops.com/archives/internet-explorer-10-administration-part-1-overview/ http://4sysops.com/ ...

  8. 姿态角(Euler角):yaw pitch roll

    姿态角(Euler角):yaw pitch roll  

  9. Luogu 1083 借教室(二分,差分)

    Luogu 1083 借教室(二分,差分) Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不 ...

  10. [IOI2018] seats 排座位

    [IOI2018] seats 排座位 IOI2018题解 压缩状态思想很不错的 每次把原来的贡献减掉,新来的再加上 最多涉及10个点 注意: 1.去重 2.下标从0开始 3.线段树初始的最小值个数都 ...