编译原理【运行时环境】—什么是活动记录、 活动记录与汇编代码的关系
系列文章戳这里👇
- 什么是上下文无关文法、最左推导和最右推导
- 如何判断二义文法及消除文法二义性
- 何时需要消除左递归
- 什么是句柄、什么是自上而下、自下而上分析
- 什么是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技术轻松解决。近年来,全球供应链的脆弱性已经多次得到证明。无论是油轮被困在苏伊士运河,阻塞海峡…...

一口吃不成ChatGPT,复旦版MOSS服务器被挤崩后续
ChatGPT 是目前最先进的 AI,由于 ChatGPT 的训练过程所需算力资源大、标注成本高,此前国内暂未出现对大众开放的同类产品。 适逢ChatGPT概念正火,2 月 21 日,复旦团队发布首个中国版类 ChatGPT 模型「MOSS」,没想到瞬时…...

html初识
HTML认知 文章目录HTML认知语法规范注释标签组成和关系标签的关系标签学习排版系列标签**标题标签****段落标签**换行标签水平线标签文本格式化标签媒体标签图片标签src 目标图片的路径alt 替换文本title 图片的标题width 宽度 / height 高度路径绝对路径相对路径(常…...

BFC的概念与作用
本篇详细介绍FC的概念,以及BFC的作用:FC的全称是Formatting Context,元素在标准流里面都是属于一个FC的.块级元素的布局属于Block Formatting Context(BFC) -也就是block level box都是在BFC中布局的; 行内…...

谷歌留痕代发技术指南_谷歌留痕怎么霸屏的?
本文主要分享谷歌留痕技术的一些常见问题,霸屏的原理是什么。 本文由光算创作,有可能会被修改和剽窃,我们佛系对待这种行为吧。 谷歌留痕也叫谷歌搜索留痕,那么谷歌搜索留痕的霸屏原理是什么? 答案是:利…...

SCG failure information
我们知道5G网络有独立组网和非独立组网,独立组网中不论是核心网还是接入网都是5G,但是部署成本高;非独立组网也就是双连接(MRDC)也是目前比较流行的一种方式,其中的ENDC,即E-UTRA-NRDual Connectivity,是将…...

Idea修改Git账号及密码的方法
IDEA修改git账号及密码的方法:1、file->settings->passwords2、重启IDEA3、执行一次提交或更新当执行提交或更新之后,idea会自动提示输入账号、密码,如下:4、以上如果还修改不了,请尝试如下方式解决办法…...

leaflet 设置右键菜单,配置相应的功能(090)
第090个 点击查看专栏目录 本示例的目的是介绍如何在vue+leaflet中设置右键菜单,配置相应的功能。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共109行)安装插件相关API参考:专栏目标示例效果 配置方式 1)…...

怎么维护Linux VPS 服务器?简单7个步骤
维护VPS的目的是为了确保服务器网络始终畅通无阻。请注意,此列表中的任务并不是服务器维护所需完成的唯一任务。以下是 Linux VPS 服务器所有者可以做些什么来维护他们的服务器。 1.监控磁盘空间 服务器是个人服务器还是具有多个用户帐户的服务器并不重要࿰…...

[NOIP1999 提高组] 旅行家的预算(C++,贪心)
题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离 D1D_1D1、汽车油箱的容量 CCC(以升为单位)、每升汽油能行驶的距离 D2D_2D2、出发点每升汽油价格PPP和沿途…...

Array.apply(null,{length: 99}) 逻辑解析
一、基础概述 vue 教程中有一段 demo code,如下: render: function (createElement) {return createElement(div,Array.apply(null, { length: 20 }).map(function () {return createElement(p, hi)})) }这个表达式Array.apply(null, { length: 20 })有…...