编译原理【运行时环境】—什么是活动记录、 活动记录与汇编代码的关系

news2024/11/24 10:59:08

系列文章戳这里👇

  1. 什么是上下文无关文法、最左推导和最右推导
  2. 如何判断二义文法及消除文法二义性
  3. 何时需要消除左递归
  4. 什么是句柄、什么是自上而下、自下而上分析
  5. 什么是LL(1)、LR(0)、LR(1)文法、LR分析表
  6. LR(0)、SLR(1)、LR(1)、LALR(1)文法之间的关系
  7. 编译原理第三章习题
  8. 词法分析、构建DFA、上下文无关文法、LL(1)分析、提取正规式
  9. 证明LL(1)、SLR(1)、LALR(1)文法
  10. 翻译方案、属性栈代码
  11. 【运行时环境】什么是活动记录、 活动记录与汇编代码的关系

编译原理【运行时环境】—什么是活动记录、 活动记录与汇编代码的关系

  • 系列文章戳这里👇
    • 什么是活动记录?
      • 活动记录-AR (Activation Record)
      • 活动记录的内容
    • 举个栗子
      • 再举个栗子
    • 再再举个栗子

什么是活动记录?

相信大家也和我一样,觉得编译原理在运行环境这部分比较难理解,由于机器是栈式运行的,所以里面很多操作并不利于我们理解,下面分享一下我自己对活动记录这一块的部分理解,也有一些x86汇编的内容

活动记录-AR (Activation Record)

  • 是一连续存储区域,用于管理与存放和程序单元执行相关的重要信息。
  • 下图就是活动记录的内容,简单来说,活动记录是用来记录一段函数信息的地方,
    • 很好理解,当我们在写C程序时,如果我们要用一个函数调用另一个函数,那么在调用结束后怎么回到原来的函数呢?
      • 就是活动记录在帮忙,他帮我们把调用者的地址记录下来,并用控制链相连。
    • 而访问链是记录当前函数可以访问的函数地址,这个是可选择的,意思就是活动记录中可以没有它。
    • 返回值自然就是该函数return的值,实在参数其实就是函数的参数,也就是int fun(int a,int b)里面的ab
    • 局部数据就是函数体里面定义的局部变量
    • 机器状态就是活动记录的一个指针,它是活动记录的基地址,x86汇编中一般表示为%ebp,我们可以用它来找到活动记录里面参数的位置,比如8(%ebp)就是ebp+8
  • 在这里插入图片描述
  • 问题来了,如何获取活动记录里的内容呢?上面说了,可以通过%ebp,如下图所示,bp进行偏移就可以取得的对应位置的值!在这里插入图片描述

活动记录的内容

  • 下图是栈式分配下的活动记录内容布局,其中返回值往下即为高地址到低地址,所以我们要调用参数就需要用bp+xx去取,而局部参数就是bp-xx,还不懂也没关系,后面会举个栗子,应该会更好理解在这里插入图片描述

  • 临时区域。用以保存临时计算结果

  • 局部数据区。源程序中程序单元声明的局部变量对应在此区域。

  • 机器状态保存区。存有机器的寄存器,程序指令计数器 ip(返回地址)等。

  • 访问链(静态链)。当前程序单元可以访问的(静态程序中)外围程序单元的活动记录链。

  • 控制链(动态链)。程序单元的活动记录按它们的生成(或调用)次序串成链。

  • 实在参数

  • 返回值

举个栗子

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

再举个栗子

  • 在这里插入图片描述

  • 这是一个非常简单的c函数程序,你能画出它的活动记录图,并标明各个参数对应bp的偏移吗?如果我们要取参数则上移,要取局部变量则下移,这里是int,占4个字节,所以分别是bp+8bp-4在这里插入图片描述

  • 更深一步,让我们一起看一看这段程序的汇编代码是怎么样的吧!x86汇编是典型的栈式机,首先pushl %ebp将当前bp压栈,movl %esp,%ebp将这个位置作为活动记录的基址,即把esp送入ebp,subl $8, %esp为局部数据分配空间,有两个整型变量,所以esp-8movl 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的每一位都相同,所以相当于清零。
  • 最终结果如下:在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/366131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

专利撰写 为什么要申请专利 申请专利对个人有什么利益关系 专利申请实例 如何申请专利 专利申请办理流程

专利撰写 专利是对发明者或创造者所创造的发明或设计提供一定期限的独占权的法律保护。撰写专利需要考虑到多方面的因素,包括发明或设计的技术性、可行性、独创性、保密性等等。以下是一些关于专利撰写的常见问题和注意事项:专利类型:专利包括…

记一次后端生成Zip文件通过浏览器下载后文件损坏,无法打开,不可预知的末端错误,下载后文件比源文件增大

记一次后端生成Zip文件问题前言问题出现排查一、流没有关好二、写入了空白字节三、没有flush定位环节一、生成二、通过SwaggerUI、PostMan进行下载三、结论解决方法前言 在项目上线前夕,临时添加了个数据导出的接口,需求是导出压缩包,选择了项…

SpringCloud - Feign远程调用

目录 Feign的远程调用 RestTemplate方式调用存在的问题 介绍与初步使用 Feign的自定义配置 Feign运行自定义配置来覆盖默认配置,可以修改的配置如下: 配置Feign日志有两种方式: Feign性能优化 Feign底层的客户端实现: 连…

MATLAB R2020a 与PreScan8.5.0 详细安装教程(图文版)

目录MATLAB安装PreScan安装每文一语MATLAB安装 MATLAB是一款数学软件,用于科学计算、数据分析和可视化等任务。以下是MATLAB的几个优势: 丰富的工具箱:MATLAB拥有多种工具箱,包括信号处理、图像处理、优化、控制系统等&#xff0…

深度学习论文: EdgeYOLO: An Edge-Real-Time Object Detector及其PyTorch实现

深度学习论文: EdgeYOLO: An Edge-Real-Time Object Detector及其PyTorch实现 EdgeYOLO: An Edge-Real-Time Object Detector PDF: https://arxiv.org/pdf/2302.07483.pdf PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://github.com/shangli…

SQL的四种连接-左外连接、右外连接、内连接、全连接

SQL的四种连接-左外连接、右外连接、内连接、全连接 内连接inner join…on… / join…on… 展现出来的是共同的数据 select m.Province,S.Name from member m inner join ShippingArea s on m.Provinces.ShippingAreaID; 相当于:select m.Province,S.Name from m…

Mybatis一对多查询 ,以及会遇到的各种问题解答

Mybatis一对多查询 ,以及会遇到的各种问题解答业务场景实体类,数据库方法1:连表查询,用ResultMap映射方法2:子查询进行映射业务场景 有时候前端需要表格里面嵌套表格的情况,用以展示更加详细的信息&#xf…

前端历史 --- 从HTML静态文件到前后端分离

前端历史 --- 从HTML静态文件到前后端分离1. 静态HTML2. 动态HTML --- 服务器端渲染CGI --- Common Gateway InterfaceservletASP, JSP, PHP服务器端渲染(SSR)3. 前后端分离 --- 客户端渲染JavaScriptAjax --- Asynchronous Javascript And Xml.客户端渲染1. 静态HTML 在上个世…

回溯问题(子集型回溯、组合型回溯、排列型回溯)【零神基础精讲】

来源0x3f:https://space.bilibili.com/206214 回溯分为【子集型回溯】【组合型回溯】【排列型回溯】 文章目录回溯基本概念[17. 电话号码的字母组合](https://leetcode.cn/problems/letter-combinations-of-a-phone-number/)子集型回溯(分割问题也可以看…

按键中断,红外、光电、火焰传感器中断控制LED等并打印信息

需求:按键中断,红外、光电、火焰传感器中断控制LED等并打印信息重写函数部分:void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin) {switch(GPIO_Pin){case GPIO_PIN_9:HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_10);if(HAL_GPIO_ReadPin(GPIO…

浅析高速服务区交互一体机设备管理系统的建设与方向

很多高速公路服务区均缺乏现代化的服务思维、理念和手段,信息系统功能薄弱,服务区的自助服务终端存在功能单一、人机交互体验差、设备维护管理成本高、联动效率低、运营难等问题,这不仅无法支撑服务区的精细化服务和智能化管理需求&#xff0…

【视频】海康摄像头、NVR网络协议简介

1、软硬件整体架构 2、涉及的网络协议 3、协议简介 3.1 海康私有协议 设备发现SADP:进行设备的发现、激活、修改网络参数、忘记密码等; SDK:4200、系统平台的接入前端设备,协议不对外开放,但对外提供接口库; ISAPI:Intelligent Security API(智能安全API),基于HTTP传输…

C/C++每日一练(20230223)

目录 1. 数据合并 2. 回文链表 3. 完美矩形 1. 数据合并 题目描述 将两个从小到大排列的一维数组 (维长分别为 m,n , 其中 m,n≤100) 仍按从小到大的排列顺序合并到一个新的一维数组中,输出新的数组. 输入描述 第 1 行一个正整数 m , 表示第一个要合并的一维…

【数据结构】AVL树

AVL树一、AVL树的概念二、AVL的接口2.1 插入2.2 旋转2.2.1 左单旋2.2.2 右单旋2.2.3 左右双旋2.2.4 右左双旋三、验证四、源码一、AVL树的概念 当我们用普通的搜索树插入数据的时候,如果插入的数据是有序的,那么就退化成了一个链表,搜索效率…

纵然是在产业互联网的时代业已来临的大背景下,人们对于它的认识依然是短浅的

纵然是在产业互联网的时代业已来临的大背景下,人们对于它的认识依然是短浅的。这样一种认识的最为直接的结果,便是我们看到了各式各样的产业互联网平台的出现。如果一定要找到这些互联网平台的特点的话,以产业端为出发点,无疑是它…

嵌入式:UCOS移植+简单创建任务

目录 一、UCOS操作系统 二、UCOS移植 1、文件介绍 2、UCOS || 源码分析 3、打开Software文件 三、UCOS任务创建 一、UCOS操作系统 C/OS 是 Micrium 公司出品的实时操作系统, C/OS 目前有两个版本: C/OS-II 和 C/OS-III。 C/OS 是一种基于优先级…

Linux GPIO 开发指南

文章目录Linux GPIO 开发指南1 概述1.1 编写目的1.2 适用范围1.3 相关人员2 模块介绍2.1 模块功能介绍2.2 相关术语介绍2.3 总体框架2.4 state/pinmux/pinconfig2.5 源码结构介绍3 模块配置3.1 kernel menuconfig 配置3.2 device tree 源码结构和路径3.2.1 device tree 对 gpio…

Python计算 -- 内附蓝桥题:相乘

计算 ~~不定时更新🎃,上次更新:2023/02/23 🗡常用函数(方法) 1. 求一个整数的最末位 举个栗子🌰 n int(input()) end n % 10蓝桥例题1 - 相乘✖️ 题目描述 本题为填空题,…

MySQL 11:MySQL锁

锁是一种机制,计算机通过这种机制协调多个进程或线程对资源的并发访问(以避免争用)。在数据库中,除了传统的计算资源(如CPU、RAM、I/O等)的争夺外,数据也是一种被众多用户共享的资源。如何保证并…

叠氮炔点击化学634926-63-9,Propargyl-PEG1-NHBoc,氨基叔丁酯PEG1丙炔基相关性质分享

●外观以及性质:Propargyl-PEG1-NHBoc产物呈固体或粘性液体,取决于PEG分子量,包含1个丙炔基和一个氨基叔丁酯,炔丙基可通过铜催化的叠氮炔点击化学与含叠氮化合物或生物分子反应,以产生稳定的三唑键,带有 P…