编译原理【运行时环境】—什么是活动记录、 活动记录与汇编代码的关系
系列文章戳这里👇
- 什么是上下文无关文法、最左推导和最右推导
- 如何判断二义文法及消除文法二义性
- 何时需要消除左递归
- 什么是句柄、什么是自上而下、自下而上分析
- 什么是LL(1)、LR(0)、LR(1)文法、LR分析表
- LR(0)、SLR(1)、LR(1)、LALR(1)文法之间的关系
- 编译原理第三章习题
- 词法分析、构建DFA、上下文无关文法、LL(1)分析、提取正规式
- 证明LL(1)、SLR(1)、LALR(1)文法
- 翻译方案、属性栈代码
- 【运行时环境】什么是活动记录、 活动记录与汇编代码的关系
编译原理【运行时环境】—什么是活动记录、 活动记录与汇编代码的关系
- 系列文章戳这里👇
- 什么是活动记录?
- 活动记录-AR (Activation Record)
- 活动记录的内容
- 举个栗子
- 再举个栗子
- 再再举个栗子
什么是活动记录?
相信大家也和我一样,觉得编译原理在运行环境这部分比较难理解,由于机器是栈式运行的,所以里面很多操作并不利于我们理解,下面分享一下我自己对活动记录这一块的部分理解,也有一些x86汇编的内容
活动记录-AR (Activation Record)
- 是一连续存储区域,用于管理与存放和程序单元执行相关的重要信息。
- 下图就是活动记录的内容,简单来说,活动记录是用来记录一段函数信息的地方,
- 很好理解,当我们在写C程序时,如果我们要用一个函数调用另一个函数,那么在调用结束后怎么回到原来的函数呢?
- 就是活动记录在帮忙,他帮我们把调用者的地址记录下来,并用控制链相连。
- 而访问链是记录当前函数可以访问的函数地址,这个是可选择的,意思就是活动记录中可以没有它。
- 返回值自然就是该函数
return的值,实在参数其实就是函数的参数,也就是int fun(int a,int b)里面的a和b - 局部数据就是函数体里面定义的局部变量
- 机器状态就是活动记录的一个指针,它是活动记录的基地址,x86汇编中一般表示为
%ebp,我们可以用它来找到活动记录里面参数的位置,比如8(%ebp)就是ebp+8,
- 很好理解,当我们在写C程序时,如果我们要用一个函数调用另一个函数,那么在调用结束后怎么回到原来的函数呢?

- 问题来了,如何获取活动记录里的内容呢?上面说了,可以通过
%ebp,如下图所示,bp进行偏移就可以取得的对应位置的值!
活动记录的内容
-
下图是栈式分配下的活动记录内容布局,其中返回值往下即为高地址到低地址,所以我们要调用参数就需要用
bp+xx去取,而局部参数就是bp-xx,还不懂也没关系,后面会举个栗子,应该会更好理解
-
临时区域。用以保存临时计算结果
-
局部数据区。源程序中程序单元声明的局部变量对应在此区域。
-
机器状态保存区。存有机器的寄存器,程序指令计数器 ip(返回地址)等。
-
访问链(静态链)。当前程序单元可以访问的(静态程序中)外围程序单元的活动记录链。
-
控制链(动态链)。程序单元的活动记录按它们的生成(或调用)次序串成链。
-
实在参数
-
返回值
举个栗子

- 那么这个C程序的活动记录安排你能画出来吗?试试看?
- 函数
g被调用时,活动记录栈的(大致)内容如下:
- 可以看到主函数中调用了
h,而h调用了g,他们的old bp就是控制链,分别指向调用者,他们都有一个局部变量a,并且此时bp在函数g的活动记录中,sp是栈顶指针(始终指向栈顶)
再举个栗子
-

-
这是一个非常简单的
c函数程序,你能画出它的活动记录图,并标明各个参数对应bp的偏移吗?如果我们要取参数则上移,要取局部变量则下移,这里是int,占4个字节,所以分别是bp+8和bp-4
-
更深一步,让我们一起看一看这段程序的汇编代码是怎么样的吧!x86汇编是典型的栈式机,首先
pushl %ebp将当前bp压栈,movl %esp,%ebp将这个位置作为活动记录的基址,即把esp送入ebp,subl $8, %esp为局部数据分配空间,有两个整型变量,所以esp-8,movl 8(%ebp), %eax取参数a的值放入寄存器%eax,再movl %eax,-4(%ebp)将其赋给局部变量,后两句同理将b赋给d,最后leave和ret回收活动记录,恢复原先保存的机器状态,leave相当于mov bp,sp ;pop bp//恢复调用者的bp -

再再举个栗子
int punc(int** &a,int b, int c,int &d)
{
a[b][c] = d;return 0;
}//C/C++程序,int 变量占 4 字节。
(1)准确画出该函数的活动记录内容安排。
- 同理,也很简单就能画出来

(2)补全 5 处带有下划线的汇编代码。

那么这里的汇编代码怎么填呢?
- 可以看到参数分别为
(int** &a,int b, int c,int &d),如果你不清楚指针引用的话,可以先看一下这篇文章《C语言指针、引用》,那么其中a是一个引用,它是指向某一个指针的指针的引用,也就是有一个指针x,它指向另一个指针y,而a就是指针x的引用,也就是x的另一个名字。知道这个以后就可以补充汇编代码了! movl 8(%ebp), %eax显然是将参数a送入%eax,那么前面说了a是一个指针的指针的引用,也就是说此时的a是一个地址,那么①就应该是movl (%eax),%ebx,(%eax)相当于取指针a指向的地址,可以作为一个数组的首地址,然后把a这个地址先放到一个寄存器%ebx里面%12(ebp)对应的就是参数b了,那接下来就应该计算a[b]的值了,数组地址的计算也很简单,a+b*4对应汇编就是(%ebx,%eax,4),再把它送入%ebx就得到了a[b]的地址- 然后取d的值
20(%ebp),送入%eax,再存到寄存器%edx中 - 然后再计算
a[b][c]的地址,前面已经计算了a[b]为(%ebx,%eax,4),所以a[b]+c*4=(%ebx, %eax ,4),那么最后将d送入这个地址就可以了movl %edx,(%ebx,%eax,4) - 最后
return 0即对应xorl %eax, %eax:按位异或,相同的位置为0,不同的位置为1,eax和eax的每一位都相同,所以相当于清零。 - 最终结果如下:

相关文章:
编译原理【运行时环境】—什么是活动记录、 活动记录与汇编代码的关系
系列文章戳这里👇 什么是上下文无关文法、最左推导和最右推导如何判断二义文法及消除文法二义性何时需要消除左递归什么是句柄、什么是自上而下、自下而上分析什么是LL(1)、LR(0)、LR(1)文法、LR分析表LR(0)、SLR(1)、LR(1)、LALR(1)文法之间的关系编译原理第三章习…...
【Windows Server 2019】发布服务器 | 远程桌面服务的安装与配置 Ⅰ——理论,实验拓扑和安装基于RemoteAPP的RDS
目录1. 理论1.1 什么是远程桌面服务2. 实验拓扑2.1 拓扑说明3. 安装基于RemoteAPP的RDS1. 理论 1.1 什么是远程桌面服务 远程桌面服务 (RDS) 是一个卓越的平台,可以生成虚拟化解决方案来满足每个最终客户的需求,包括交付独立的虚拟化应用程序、提供安全…...
Bootstrap入门到精通(最全最详细)
文章目录前言一、Bootstrap是什么?二、Bootstrap安装方式一:将压缩包下载到本地引入使用方式二:使用Bootstrap官方cdn二.Bootstrap容器下面是屏幕宽度在不同大小时不同容器的显示状态三.Bootstrap栅格系统bootstrap网格系统有以下六个类网格系…...
C/C++每日一练(20230223)
目录 1. 数据合并 2. 回文链表 3. 完美矩形 1. 数据合并 题目描述 将两个从小到大排列的一维数组 (维长分别为 m,n , 其中 m,n≤100) 仍按从小到大的排列顺序合并到一个新的一维数组中,输出新的数组. 输入描述 第 1 行一个正整数 m , 表示第一个要合并的一维…...
c语言中const 是什么意思?(面试)
const关键字使用非常的灵活,在c中,const因位置不同有不同的作用,因情景不同有不同的角色,使用起来也是非常的灵活。 可以定义const常量,具有不可变性。 例如:const int Max100; Max会产生错误; 便于进行类…...
网络工程(三)ensp配置静态路由
配置静态路由 这里选择的路由器是AR2220 因为有三个GE接口 下面说拓扑图 一、定义AR路由ip地址和下一条 AR1system-viewsysname AR1interface g0/0/0ip address 10.0.0.254 8interface g0/0/1ip address 50.0.0.1 8下一条代码[AR1]ip route-static 0.0.0.0 0 50.0.0.2AR2 s…...
深入浅出C++ ——手撕红黑树
文章目录一、红黑树的概念二、红黑树的性质三、红黑树节点的定义四、红黑树的插入操作五、红黑树的验证五、红黑树的删除六、红黑树与AVL树的比较七、红黑树的应用八、红黑树模拟实现一、红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存…...
Linux服务:Nginx服务重写功能
目录 一、重写功能 1、重写功能作用 2、rewrite指令 ①if指令 ②return指令 ③ set指令 ④break指令 3、rewrite标志 ①redirect标志 ②permanent标志 ③break标志 ④last标志 ⑤rewrite标志实验 一、重写功能 1、重写功能作用 重写功能(rewrite)用于实现URL的重…...
3.知识图谱概念和相关技术简介[知识抽取、知识融合、知识推理方法简述],典型应用案例介绍国内落地产品介绍。一份完整的入门指南,带你快速掌握KG知识,芜湖起飞!
1. 知识图谱(KG)的概念 知识图谱(KG)得益于Web的发展(更多的是数据层面),有着来源于KR、NLP、Web、AI多个方面的基因。知识图谱是2012年后的提法,基础还是语义网和本体论。 知识图谱的本质包含: 知识表示——Knowledge Representation基于知识表示的知识库——Knowledge…...
iOS 绿幕技术
绿幕(green screen)技术,又称 chroma key effect,实际上是将图片上指定颜色设置为透明的图形处理技术,这些透明区域也可以被任意背景图片替换。 这种技术在 视频合成中被广泛使用。iOS 中,通过 CoreImage …...
git 的使用方法(上 - 指令)
目录前言:一、Git 是什么?二、SVN与Git的最主要的区别?三、Git 安装四、git 配置1. 创建仓库 - repository2. 配置3. 工作流与基本操作五、Git 的使用流程1. 仓库中创建 1.txt文件2. 查看工作区的文件状态3. 添加工作区文件到暂存区4. 创建版…...
Windows 平台 oracle11g 单机 打补丁(33883353)
一、从oracle官网下载最新补丁包和打包工具 二、 对数据库及软件作全备 略 三、解压p33883353_112040_MSWIN-x86-64.zip 在33883353文件夹中打开README.html 2.1 OPatch Utility You must use the OPatch utility version 11.2.0.3.34 or later to apply this patch. 必须…...
1个寒假能学会多少网络安全技能?
现在可以看到很多标题都声称三个月内就可以转行网络安全领域,并且成为月入15K的网络工程师。那么,这个寒假的时间能学多少网络安全知识?是否能入门网络安全工程师呢? 答案是肯定的。 虽然网络完全知识是一门广泛的学科ÿ…...
六、肺癌检测-训练指标和数据增强
上一篇文章讲了训练过程和tensorboard可视化,这一篇文章记录下训练指标和数据增强的东西。 五、肺癌检测-数据集训练 training.py model.py_wxyczhyza的博客-CSDN博客 一、目标 1. 记录精度、召回率、F1分数 2. 样本均衡和样本随机化 3. 数据增强 二、要点 1…...
儿童饰品发夹发卡出口美国办理什么认证?
亚马逊美国站上传新产品,很多时候都是需要类目审核的,后台给出要求提供认证,产品类目不同,所需要提供的认证证书是不一样,儿童产品需要提交的是CPC认证,玩具,母婴用品,儿童书包&…...
Hive---Hive语法(一)
Hive语法(一) 文章目录Hive语法(一)Hive数据类型基本数据类型(与SQL类似)集合数据类型Hive数据结构数据库操作创建库使用库删除库表操作创建表指定分隔符默认分隔符(可省略 row formatÿ…...
微信小程序日记、微信小程序个人空间、个人日记
一.简述 个人比较喜欢微信小程序,因为小程序所追求的用户体验、代码质量、美观的样式,简单方便丰富的api、样式封装等,同时又与普通的前端开发非常相似,让人很容易就上手。 这篇博客介绍的是一款记录个人/家庭日常记录的微信小程…...
CentOS 8利用Apache安装部署下载服务器
1:部署的目的是做一个类似下面开源镜像网站,把一些软件或者资料上传到服务器上面,减少用户在互联网上下载资料,提高效率,减少病毒。 2:使用下面的命令配置本机的IP地址主机名等信息。后期使用IP地址进行访问…...
【数据结构与算法】顺序表增删查改的实现(动态版本+文件操作)附源码
目录 一.前言 二.顺序表 1.概念及结构 2.顺序表结构体的定义 3.初始化顺序表,销毁顺序表和打印 3.接口 a.尾插 SepListpushback 头插 SepListpushfront b.尾删 SepListpopback 头删 SepListpopfront c.查询 SepListsearch d.修改 SepListmodify 三…...
【虹科】基于Lidar的体积监控实现高效的库存管理
迄今为止,很多物料厂家测量库存的结果数据仍然不准确,会存在很大的误差,导致供应链效率低下——这个问题可以通过Lidar技术轻松解决。近年来,全球供应链的脆弱性已经多次得到证明。无论是油轮被困在苏伊士运河,阻塞海峡…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
