You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MIPS架构binomial函数栈帧大小与寄存器存储位置咨询

MIPS函数栈帧相关问题解答

问题1:栈帧大小是分配的40字节还是实际使用的空间?

  • 代码里addiu sp, sp, -40分配的40字节就是该函数的栈帧大小,和实际使用的空间无关。
  • 编译器在编译阶段就会计算好栈帧所需的总空间,包含以下几部分:
    • 需要保存的被调用者保存寄存器(s0-s7、ra等)的存储空间
    • 局部变量的存储空间
    • 函数调用时需要传递的额外参数(溢出到栈上的参数)的空间
    • 满足MIPS栈对齐要求的填充空间(通常是8字节或16字节对齐)
  • 哪怕实际只用到了其中一部分空间,编译器也会一次性分配好计算后的总空间,所以这里40字节就是栈帧的固定大小。

问题2:s0、s1等保存寄存器在栈帧中的存储位置

  • 根据MIPS调用约定,s0-s7属于被调用者保存寄存器,函数在使用这些寄存器前必须把它们的原值保存到栈上,退出时恢复。
  • 它们的存储位置通常在栈帧的高地址区域(靠近函数进入前的栈指针位置),具体偏移可以看汇编中的sw指令:
    • 比如如果汇编里有sw s0, 36(sp),就表示s0被存在栈指针sp加上36字节的位置;sw s1, 32(sp)则表示s1存在sp+32的位置。
  • 典型的MIPS栈帧结构(从高地址到低地址,即靠近旧sp到新sp的顺序)大致是:
    • 返回地址ra的保存位置
    • 被调用者保存寄存器s7到s0的保存位置(依次向下排列,每个占4字节)
    • 局部变量、临时变量空间
    • 函数调用溢出参数空间(如果有)

内容的提问来源于stack exchange,提问作者Zuja Plays

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 03:22:37