首页 > 其他分享 >6. 活动记录 | 1. 栈帧

6. 活动记录 | 1. 栈帧

时间:2024-03-15 19:44:07浏览次数:16  
标签:函数 记录 Tr access 寄存器 活动 栈帧 指针

  tips


  栈 栈指针 帧 帧指针   Frame 模块: 栈帧相关信息   F_frame             :    栈帧
F_access           :    表示 寄存器 / 栈帧 的地址偏移, 即位置 Symbol Temp_label        :    标识符       F_newFrame(label, boolList)    :    生成 符号 label 对应的新栈帧 F_formals()        :    返回形参的 access F_allocLocal()    :    返回局部变量的 access   Translate 模块: 关联 栈帧 和 语义分析 , 相比 F_access, 添加了  level  信息 Tr_access                :    函数层 (标识嵌套信息) 与 栈帧信息 F_frame { Tr_level, F_access} Tr_level                    :    嵌套层, 函数嵌套关系   Tr_allocLocal()         :    带 level 信息的局部变量 Tr_access  Tr_formals()             :    带 level 信息的形参 Tr_access  Tr_newLevel()          :    创建新的函数层    
Tr_newLevel(
    level_包围层,  ( 函数 f 的包围层, 即调用者 )
    f_当前层函数, 
    [ 标记形参是否逃逸的 Bool 数组 (第一个元素对应静态链)]
)
Tr_outermost()    :    最外层函数标识   transDec() transExp() transVar()   LIFO:  递归函数调用   ->    存储  高阶函数:  支持递归调用, 支持以函数做为返回值, 不能用简单的 栈来存储,(在15章讨论)   栈 + 栈指针: 指针右侧: 垃圾回收 指针左侧: local 变量 活动记录: activity record ,  栈帧: stack frame 标准结构 :   可以实现 跨语言调用 栈地址    :   从高到低   栈帧  Stack Frames
      帧指针  Frame Pointer & 栈指针 Stack Pointer 
  Stack Frame:  栈帧 SP:    Stack Pointer    栈指针 FP:    Frame Pointer    帧指针
f( ... ) {
   ...
   g(x,y,....)
   ...
}

 

  执行 函数 f()时,栈指针SP 在位置A,  执行到  g(x,y,... )时发现要调用函数 g, 则SP -= FRAME_SIZE,   新的FP指向 SP 的地址。 新 FP ~ 新SP 的 FRAME_SIZE 个地址则保存调用过程中的所有数据, 以备后来之用。   参数传递
前 k 个放在寄存器中  (一般中 k=4 或 k=6)   f(g()): 临时变量 x 在函数 f() 调用以后不再需要: 放入一个调用者保护的寄存器中, 调用 g() 时不保护它 局部变量 i (f()内部)在函数 g( ) 调用前后都需要: f() 入口 放入被 调用保护 寄存器 ri 一次 , f()出口取回一次    返回地址
call 指令地址 + 1   =>  放入 寄存器   =>  非叶过程 后面还有指令要跑, 所有结束后 还要等, 需要把地址存在自己的栈帧里面    寄存器 or 栈帧 ?
  寄存器中: 参数:寄存器中 返回地址:寄存器中 函数结果:寄存器中 返回 局部变量,中间结果:寄存器中   栈帧(存储)中:     1.  传址变量:变量为一地址  ( &p )     2.  该变量被嵌套在当前过程(函数)内的过程(其他函数)访问     3.  变量值太大,不能放在单个寄存器中 ( 32位,4字节 或 64位, 8字节 )     4.  变量是一个数组,元素需要地址运算(C语言)     5.  需要使用存放该变量的寄存器     6.  太多局部变量 临时变量, 无法全部放入寄存器中     7.  函数参数大于k个 (k一般为 4 到 5个)      

标签:函数,记录,Tr,access,寄存器,活动,栈帧,指针
From: https://www.cnblogs.com/wuoshiwzm/p/18076094

相关文章

  • 一体机 配置记录2024
    用于数据采集  鲁大师详细报表软件版本鲁大师6.1024.3970.311模块版本5.1024.1705.130检测时间2024-03-1518:48:12官方网站http://www.ludashi.com概览电脑型号X64兼容台式电脑操作系统Windows10专业版64位(Version21H2/DirectX12)处理器英特尔第三代酷......
  • 工作中遇到的tab提升问题,简单记录一下
    Tabenhancement;应用场景当tab足够多时,进行Tab功能提升。由上图实现下图。前期css简单处理下,例如:tab最大宽度,tab超出文本省略号。开始处理逻辑:当tab不够多不足以出现滚动条时:此时也不需要过多的逻辑,只有删除tab后的选中逻辑;当tab足够多足以出现滚动条时:我们新建一个......
  • 2024-03-14 leetcode写题记录
    目录2024-03-14leetcode写题记录829.连续整数求和题目链接题意解法2024-03-14leetcode写题记录829.连续整数求和题目链接829.连续整数求和题意给定一个正整数\(n\),返回连续正整数满足所有数字之和为\(n\)的组数。示例1:输入:n=5输出:2解释:5=2+3,共有两......
  • 超轻量级的c#版基于文件的日志记录工具,可定制输出格式,可指定日志文件
    这是我自己个人编写的日志记录,主要使用在只需要记录日志,偶尔到文件中查看一下日志记录的情况。我自己写的一些服务之类的是使用了这个的,代码很少,使用很简单。第一步搜索和安装我的Nuget包搜索和安装zmjtool这个包,我写的,如下图:第二步引入namespace和创建logger对象1/**引......
  • 记录一次 nginx 代理调试 ie7
    worker_processes1;events{worker_connections1024;}http{includemime.types;default_type"text/html;charset=utf-8";sendfileon;keepalive_timeout65;server{listen80;server_namelocalh......
  • 移动端的汉服交流推广活动报名系统 微信小程序
    对于小程序汉服推广的开发对硬件的要求并不高,正常的电脑配置就可以完成打开系统进行使用及管理,对于系统的打开最主要的一个方面是系统所使用的服务器方便,系统所用的服务器将直接影响往系统是否打开及系统的打开速度,要选择安全性、稳定性强的服务器。小程序Android端运行软件......
  • LoggerMessageAttribute 高性能的日志记录
    .NET6引入了LoggerMessageAttribute类型。使用时,它会以source-generators的方式生成高性能的日志记录API。source-generators可在编译代码时,可以提供其他源代码作为编译的输入。LoggerMessageAttribute依赖于ILogger接口和LoggerMessage.Define功能。在partial日......
  • JAVA学习记录01
    String为什么是不可变的?保存字符串的数组被 final 修饰且为私有的,并且String 类没有提供/暴露修改这个字符串的方法。String 类被 final 修饰导致其不能被继承,进而避免了子类破坏 String 不可变。如何创建线程?一般来说,创建线程有很多种方式,例如继承Thread类、实现......
  • 3月14日第一次面试记录(安全实习生)
    3月14日第一次面试记录(安全实习生)线上面试首先调试设备,保证通话质量。经历和经验自我介绍(没有提前准备,回答的很蒙)谈一谈你在护网中做了些什么?永恒之蓝漏洞原理,怎样防御log4g漏洞怎么修复linux对linux了解吗?查看内存操作是什么?怎样部署一个jdk?平时用linu......
  • angr使用记录
    由于毕设需要,这几天在使用angr符号执行自动化挖掘格式化字符串漏洞,但是对angr的了解不多,导致在使用的时候屡屡碰壁,在此记录一下。本来写了一个简单的通用检测脚本,但是在使用脚本对CWE-134的一个样例(SARD)进行分析时,发现无法找出漏洞点。检测脚本测试格式化字符串漏洞的逻辑很简单......