编译原理复习---目标代码生成

适用于电子科技大学编译原理期末考试复习。

1. 目标代码

是目标机器的汇编代码或机器码,在本课程中指的是类似于汇编代码的一种形式,由一条条的指令构成目标代码。

抽象机指令格式:OP  目的操作数,源操作数

我们要做的,就是将三地址码翻译为等价的一条条的指令。

考试时主要涉及三种指令:

  • MOV:将原操作数赋值给目的操作数。

  • ADD:将原操作数的值加给目的操作数。

  • SUB:目的操作数减去原操作数的值。

按照寻址方式,又有如下分类:

  • 寄存器型(R代表寄存器)

    OP   Ri , Rj		 /* (Ri) OP (Rj) => Ri */
  • 直接地址型

    OP   Ri , M			/* (Ri) OP (M) => Ri */
  • 变址型

    OP   Ri , C(Rj)		/* (Ri) OP ((Rj) + C) => Ri */
  • 间接型

    OP   Ri , *Rj	   /* (Ri) OP ((Rj)) => Ri */
    OP   Ri , *M	   /* (Ri) OP ((M)) => Ri */
    OP   Ri , *C(Rj)	 /* (Ri) OP (((Rj) + C)) => Ri */
    
  • 转移型

    J	X		       /* goto X */

2. 目标代码的生成方法

三地址码: x = y OP z
目标代码: MOV  Ri , y
         OP   Ri , z
         MOV  x , Ri
  • ADD和SUB的目的操作数一定是寄存器。

  • 条指令中都至少要有一个寄存器。

记住上面这两条就可以根据中间代码的含义,用三种指令来翻译了。

3. 循环中的寄存器分配

对于循环中频繁使用的变量,引用时需要从内存读入寄存器,修改后需要从寄存器保存回内存。

为这些频繁使用的寄存器分配固定的寄存器可以使访问内存的次数减少,进而提高效率。

但寄存器的数量是有限的,我们希望尽可能多的提高效率,就需要讨论寄存器分配的策略。

3.1 指令执行的代价

指一条指令访问内存的次数。

寄存器型    	op Ri, Rj  		  执行代价为1
直接地址型    op Ri, M		  执行代价为2
变址型      	op Ri, C(Rj)  	  执行代价为2
间接型      	op Ri, *Rj        执行代价为2
            op Ri, *M         执行代价为3
            op Ri, *C(Rj)     执行代价为3

 下面假设循环中的目标代码指令全部采用寄存器型。

3.2 被引用的变量

没有为变量 x 固定分配寄存器时,变量 x 每被引用一次,就需要访问内存一次。

  • USE(x, B):x在基本块B中的引用次数。

  • \sumUSE(x, B):在循环各基本块中的引用次数之和。

  • 寄存器固定分配给 x 后,可节省\sumUSE(x, B)

3.3 被赋值的变量

没有为变量 x 固定分配寄存器时,变量 x 每被赋值依次,就需要先从内存中读出来,运算之后保存回内存,共需访问两次内存。

  • LIVE(x, B):x在基本块B中的被赋值次数。

  • \sumLIVE(x, B):在循环各基本块中的被赋值次数之和。

  • 寄存器固定分配给 x 后,可节省2*\sumLIVE(x, B)

3.4 固定分配寄存器共可节省的效率\sum ( USE(x,B) + 2*LIVE(x,B) ) 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JaxaFx学习(三)

目录: (1)JavaFx MVVM架构实现 (2)javaFX知识点 (3)JavaFx的MVC架构 (4)JavaFx事件处理机制 (5)多窗体编程 (6)数据…

Type-C 接口电热毯:开启温暖智能新时代

在当今科技迅猛发展的时代,智能家居产品如同璀璨繁星般点缀着我们的生活,从智能灯光的温馨到温控系统的精准,处处都彰显着科技赋予生活的便捷与舒适。而在这股追求高效与智能化的洪流之中,一款极具创新的电热毯——Type-C 接口电热…

解决vscode ssh远程连接服务器一直卡在下载 vscode server问题

目录 方法1:使用科学上网 方法2:手动下载 方法3 在使用vscode使用ssh远程连接服务器时,一直卡在下载"vscode 服务器"阶段,但MobaXterm可以正常连接服务器,大概率是网络问题,解决方法如下: 方…

WSL Ubuntu

文章目录 1. 概述1.1 什么是适用于 Linux 的 Windows 子系统1.2 什么是 WSL 21.3 WSL 2 中的新增功能1.4 比较 WSL 2 和 WSL 1 2. 参考资料3. 修改存储位置4. 网络访问 1. 概述 1.1 什么是适用于 Linux 的 Windows 子系统 适用于 Linux 的 Windows 子系统可让开发人员按原样运…

clickhouse-数据库引擎

1、数据库引擎和表引擎 数据库引擎默认是Ordinary,在这种数据库下面的表可以是任意类型引擎。 生产环境中常用的表引擎是MergeTree系列,也是官方主推的引擎。 MergeTree是基础引擎,有主键索引、数据分区、数据副本、数据采样、删除和修改等功…

如何使用Python进行音频片断合成

以下是几种使用 Python 进行音频合成的方法: 使用 synthesizer 库 通过 pip install synthesizer 安装后,利用其提供的合成器类,可自定义振荡器类型,如锯齿波、方波或正弦波,并调制振幅来创造不同音色,还…

【SH】在Ubuntu Server 24中基于Python Web应用的Flask Web开发(实现POST请求)学习笔记

文章目录 Flask开发环境搭建保持Flask运行Debug调试 路由和视图可变路由 请求和响应获取请求信息Request属性响应状态码常见状态码CookieSession 表单GET请求POST请求 Flask 在用户使用浏览器访问网页的过程中,浏览器首先会发送一个请求到服务器,服务器…

CLION中运行远程的GUI程序

在CLION中运行远程GUI程序,很有可能会遇到下面错误 Gtk-WARNING **: cannot open display: 这是因为远程的GUI程序不能再本地机器上显示。这个问题一般有两种解决方法 通过SSH的ForwardX11的方法,就是将远程的GUI程序显示到本地机器上,一般在…

Unity 圆形循环复用滚动列表

一.在上一篇垂直循环复用滚动列表的基础上,扩展延申了圆形循环复用滚动列表。实现此效果需要导入垂直循环复用滚动列表里面的类。 1.基础类 using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using …

中国人工智能学会技术白皮书

中国人工智能学会的技术白皮书具有多方面的重要作用,是极具权威性和价值的参考资料。 看看编委会和编写组的阵容,还是很让人觉得靠谱的 如何下载这份资料呢?下面跟着步骤来吧 步骤一:进入中国智能学会官网。百度搜索“中国智能学…

maui开发成生安卓apk,运行提示该应用与此设备的CPU不兼容

在生成.NET MAUI安卓应用时遇到“该应用与此设备的CPU不兼容”的问题,确保你的.NET MAUI应用支持的Android目标框架与设备CPU架构相匹配。例如,如果你的应用是为ARM64架构编译的,而你的设备是x86架构,就会出现不兼容的问题。 一、…

二叉树 -- 堆(详解)

目录 1、堆的概念及结构 2、堆的实现(附代码) 2.1、向下调整算法建堆 3、堆的应用(附代码) 3.1、堆排序 3.2、TOP-K问题 1、堆的概念及结构 如果有一个关键码的集合K { k0,k1 ,k2 ,…,k(n-1) },把它的所有元素…

windows环境下pytorch安装踩坑

目录 1 前言2 安装Anaconda3 安装CUDA4 创建Python3.9环境5 安装Pytorch环境5.1 conda方式5.2 pip方式 6 验证是否安装成功7 注意事项7.1 no module named torch问题7.12 torch.cuda.is_available()返回False问题 8 最佳实践9 总结 1 前言 这两天由于要使用Genesis,…

Linux系统命令基础

Linux命令⾏ [pypylinux ~]$ 普通⽤户py,登陆后 [rootpylinux ~]# 超级⽤户root,登录后root代表当前登录的⽤户 分隔符pylinux 主机名~ 当前的登录的位置,此时是家⽬录# 超级⽤户身份提示符 $ 普通⽤户身份提示符操作系统⽬录分隔符 Linux目录…

PHP木马编写

一、最简单的一句话木马 <?php eval($_REQUEST[cmd]); ?> 1. <?php 和 ?> <?php 和 ?> 是 PHP 代码的开始和结束标记&#xff0c;表示 PHP 代码块的范围。 2. eval() eval() 是 PHP 中的一个内建函数&#xff0c;用来执行字符串类型的 PHP 代码。…

[Unity]【图形渲染】【游戏开发】Shader数学基础4-更多矢量运算

在计算机图形学和着色器编程中,矢量运算是核心的数学工具之一。矢量用于描述空间中的位置、方向、速度等各种物理量,并在图形变换、光照计算、纹理映射等方面起着至关重要的作用。本篇文章将详细讲解矢量和标量之间的乘法与除法、矢量的加法与减法、矢量的模与单位矢量、点积…

基于JSP动漫论坛的设计与实现【源码+文档】

目录 摘 要 Abstract 1. 绪论 1.1 课题背景 1.2 国内外现状 1.3 动漫论坛系统特点 1.4 发展前景 1.5 所做的主要工作 2. 可行性分析及需求分析 2.1 可行性分析 2.1.1 经济可行性 2.1.2 技术可行性 2.1.3 运行可行性 2.2 需求分析 2.2.1 功能需求 …

VCU--新能源汽车VCU电控开发

课程目标 信号采集的原理 使用simulink处理信号 做一个MIL仿真测试 零、参考 构建Simulink模型——CAN通信 | chans Bloggerrrrr基于Simulink实现CAN报文解析(unpack)与打包(pack)任务_RichardsZ_-开放原子开发者工作坊 一、功能概述 1.硬线信号 定义&#xff1a;通过物…

nodejs搭配express网站开发后端接口设计需要注意事项

nodejs搭配express网站开发后端接口设计需要注意事项&#xff01;为了回避一些常见的误区&#xff0c;今天和大家汇总一下&#xff0c;最近我遇到的一些错误信息&#xff0c;虽然都是小问题&#xff0c;但是还是需要分享一下&#xff0c;以免大家再次犯错。 1&#xff1a;第一个…

【时间之外】IT人求职和创业应知【71】-专利费

目录 2025 ICT产业趋势年会召开&#xff0c;2024年度ICT十大新闻重磅揭晓 海纳致远数字科技申请定制化插件驱动的数据分析专利 阿波罗智联取得语音数据的处理方法、装置、设备和存储介质专利 心勿贪&#xff0c;贵知足。 感谢所有打开这个页面的朋友。人生不如意&#xff0…