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
相关产品推荐
相关产品推荐

