当前位置: 首页 > news >正文

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

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

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 , yOP   Ri , zMOV  x , Ri
  • ADD和SUB的目的操作数一定是寄存器。

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

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

3. 循环中的寄存器分配

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

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

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

3.1 指令执行的代价

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

寄存器型    	op Ri, Rj  		  执行代价为1
直接地址型    op Ri, M		  执行代价为2
变址型      	op Ri, C(Rj)  	  执行代价为2
间接型      	op Ri, *Rj        执行代价为2op Ri, *M         执行代价为3op 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) ) 

 

http://www.lryc.cn/news/507405.html

相关文章:

  • Winnows基础(2)
  • 酒蒙子骰子小程序系统
  • 网络安全防范
  • 重拾设计模式--组合模式
  • 红米Note 9 Pro5G刷小米官方系统
  • 渗透测试-前端加密分析之RSA加密登录(密钥来源服务器)
  • 踩准智能汽车+机器人两大风口,速腾聚创AI+机器人应用双线爆发
  • YOLOv8全解析:高效、精准的目标检测新时代——创新架构与性能提升
  • 【Python】使用Selenium 操作浏览器 自动化测试 记录
  • GDPU软件工程习题(挖空版)
  • 【活动邀请·深圳】深圳COC社区 深圳 AWS UG 2024 re:Invent re:Cap
  • Hutool工具包的常用工具类的使用介绍
  • C++简明教程(文章要求学过一点C语言)(2)
  • 防火墙技术与网络安全
  • html 中 表格和表单的关系与区别
  • 基于Java的购物网站毕业论文
  • Redis——缓存预热+缓存雪崩+缓存击穿+缓存穿透
  • wxWidgets使用wxStyledTextCtrl(Scintilla编辑器)的正确姿势
  • 【ETCD】【实操篇(二)】如何从源码编译并在window上搭建etcd集群?
  • 服务器数据恢复—V7000存储中多块磁盘出现故障导致业务中断的数据恢复案例
  • 冯诺依曼架构与哈佛架构的对比与应用
  • Hive其四,Hive的数据导出,案例展示,表类型介绍
  • CMake function使用
  • 【AI学习】Huggingface复刻Test-time Compute Scaling技术
  • 前端导出PDF的组件及方法
  • Mac升级macOS 15 Sequoia后,无法ssh连接本地虚拟机
  • Pytorch | 利用MI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
  • linux 无网络安装mysql
  • 自毁程序密码—阿里聚安全(IDA动态调试)
  • 【华为OD-E卷-寻找关键钥匙 100分(python、java、c++、js、c)】