mips栈帧详解

通过文档上逐步深入的四个例子,我对栈帧有了更全面的理解:

栈帧是运行时逐步产生的,而不是在调用其他函数那一刻产生的,对于以下例子

复制代码
 int g( int x, int y ) { 
  int a[32]; 
  ... (calculate using x, y, a); 
  a[1] = f(y,x,a[2],a[3],a[4]); 
  a[0] = f(x,y,a[1],a[2],a[3]); 
  return a[0]; 
 }

现在研究g的栈帧,

蓝色区域用来存此函数的局部变量,如a,会占32个word,也就是128个byte

深绿色区域存储当前函数的返回地址,如果当前函数没有调用其他函数,此区域可以没有

浅绿色区域,当函数g内部逻辑要用到 $s 寄存器时,才会在用之前存储好之前的寄存器值(保留现场)

黄色区域,当第一次调用f时,存储参数,无论用不用寄存器传递,都要在栈帧中存。只要调用其他函数,黄色区域必有四个word,但这四个word是空的,只是为了后序f中可能用到而预留的。

灰色区域,用于padding,使得栈帧大小是8的倍数。

当调用完第一次f之后,会重新构建黄色区域的arg4,重新构建四个 $a 寄存器。

容易混淆的点是:

  1. 栈帧不是调用时的,而是运行时的

  2. 栈帧在调用结束时销毁,指的是被调用的函数的栈帧,如上例子,调用f后f会有自己的栈帧,f运行结束自己的栈帧会销毁,而g的栈帧在最后g运行结束才会销毁

相关推荐
Joy T5 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
专注仿真8 小时前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
Best-Wishes9 小时前
科来网络分析系统(技术交流版)使用说明书
开发语言·junit·php
代码不停9 小时前
自动化测试(java)
java·开发语言·selenium·自动化
滕州市燕猫虎计算机科技工作室个体工商户9 小时前
《Rust程序设计》学习笔记八:结构体
笔记·学习·rust·rust程序设计
别动我齐刘海10 小时前
Linux 系统调试学习1
linux·运维·服务器·c++·学习·机器学习·机器人
鬼手点金11 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
爱上网的小舟11 小时前
星际战士2启动错误怎么办?5种游戏报错解决方法
开发语言·php
xier_ran12 小时前
【infra之路】AI 编译器学习笔记(二):重拾 C++——移动语义与 LLVM 风格的类型转换
人工智能·笔记·学习
阿里嘎多学长12 小时前
2026-10-12 GitHub 热点项目精选
开发语言·程序员·github·代码托管