四元式的翻译以及寄存器分配

1.四元式的翻译

1. (Program,Pro_id,,)
MAIN SEGMENT:
ASSUME CS:MAIN,DS:MAIN,ES:MAIN
2. (sys,_,_,_)
终止程序的运行返回OS
3. (+,A,B,T)
MOV AX,A;
ADD AX,B;
MOV T,AX;
4. (=,B,_,A)
MOV AX,B;
MOV A,AX;
5. (jnz,A,_,P)
MOV AX,A;
CMP AX,0;
JNZ P;
6. (j,_,_,P)
JMP P;
7. (jrop,A,B,P)
MOV AX,A;
CMP AX,B:
JROP P;

2.寄存器分配

2.1活跃变量和引用信息

eg:
(p) A=B+C; A在p点是活跃的
(r) E=A+F; r是变量A的引用信息
(q) D=A+V;

所有的非临时变量都看作是出基本块后的活跃变量
所有的临时变量均看作是出基本块后的非活跃变量

2.1.1基本块内的引用信息链和活跃信息链

序号 四元式 结果 左变量 右变量
1 (-,A,B,T) (5,y) (2,y) (2,y)
2 (+,A,B,A) (3,y) (n,n) (5,y)
3 (-,A,C,U) (n,y) (n,y) (4,y)
4 (+,C,D,V) (n,n) (n,y) (n,y)
5 (+,T,B,V) (n,y) (n,y) (n,y)

对该表的解释以及解题技巧:
- 表中(a,b)二元组,a表示是否引用,若引用,则标示位置;b表示是否活跃;
- 如果有引用信息的话,一定是活跃的;
- 如果某一变量数值被覆盖的话,是没有引用和活跃的(如:2中的A,以及4,5中的V)

2.2DAG对基本块进行优化

题目如下:
1. T1=A/B;
2. T2=3*2;
3. T3=T2+T1;
4. M=T3;
5. C=4;
6. T4=A/b;
7. C=3;
8. T5=12-C;
9. T6=T4+T5;
10. N=T6;

2.2.1做出DAG图


对比之前的各个表达式很容易得到这个图。具体的过程就是左子树节点是表达式左变量、右子树节点是表达式右变量。
其实DAG具体作用感觉是更容易理解化简过程,而不是真正的使用,考试起来似乎是不太需要做出DAG图的,利用其思想可能会更好更快

2.2.2优化后语法

  1. T1=A/B;
  2. T2=6;
  3. T3=3+T1;
  4. M=T3;
  5. T4=T1;
  6. C=3;
  7. T5=9;
  8. T6=T1+9;
  9. N=T6;

其实,优化后只是删除了C=4这一个句子。显然优化是需要删除的,根本没有看出需要什么DAG图。

2.2.3继续优化

如果题目有有说基本块之外临时变量不再使用,则可以删除所有不参加计算的临时变量,只保留和非临时变量有关的指令。

  1. T1=A/B;
  2. M=6+T1;
  3. C=3;
  4. N=T1+9;

2.3寄存器分配

一般在四元式代码中,通常把左操作数放入寄存器R中,再和C进行操作,R中保存结果。

老师所给示例如下:

四元式的翻译以及寄存器分配相关推荐

  1. C++实现的利用LR(1)分析表对赋值表达式进行语法制导翻译生成四元式及汇编代码

    赋值语句的语法制导翻译 后续已完善算术运算文法.赋值文法.布尔运算文法.if.while.do-while和复合语句文法,编译器项目已上传GitHub,https://github.com/sleep ...

  2. 【视频联动】编译原理:写出布尔表达式A or (B and not(C or D)) 的四元式序列。说明:按照控制语句中的布尔表达式翻译

    编译原理:写出布尔表达式A or (B and not(C or D))  的四元式序列.说明:按照控制语句中的布尔表达式翻译 这里是总结的知识点.如果有问题可以下方留言提问,视频已经放到Bilibi ...

  3. [编译原理]DO-WHILE循环语句的翻译程序设计(LR(1)方法、输出四元式)C++实现

    题目: DO-WHILE循环语句的翻译程序设计(LR(1)方法.输出四元式) 1 课设任务概述 初始条件: ​ 理论:完成编译原理,数据结构.高级编程语言.汇编语言等相关课程的学习,基于计算机专业知识 ...

  4. 编译原理 赋值语句翻译成四元式

    赋值语句及算数表达式的翻译 将赋值语句翻译成四元式的语义描述: (1) S-> id:=A (2) A->id (3) A->int (4) A->real (5) A-> ...

  5. 【编译原理】:如何将控制语句翻译成四元式

    如图: 解决这个问题的方法是: 翻译成三元式(逻辑就能翻译) 三元式转换为四元式 四元式结果 Op arg1 arg2 存储变量 知道这个思路之后,我们就能够很快的做出这道题了

  6. 【编译原理】WHILE循环语句的翻译程序设计与实现(递归下降法、输出四元式)(赋值语句的词法分析、语义分析)

    注:本文记录 WHUT-计算机学院-编译原理 课程 课内实践 >>点击查看武汉理工大学计算机专业课程资料汇总 项目下载地址:https://download.csdn.net/downlo ...

  7. 【编译原理】 如何将控制语句翻译成四元式

    如图: 解决这个问题的方法是: 翻译成三元式(逻辑就能翻译) 三元式转换为四元式 四元式结果 Op arg1  arg2  存储变量 知道这个思路之后,我们就能够很快的做出这道题了

  8. 期末考试:编译原理——如何将控制语句翻译成四元式.

    一 例题 二 总结 1. 将原式翻译成三元式(逻辑就能翻译) 2. 三元式转换为四元式(Op arg1 arg2 存储变量) 3. 常见的变化规则 1. 判断语句 2. 赋值语句

  9. LR(1)分析表-语法树-四元式

    这学期的编译原理终于学完了,不愧是号称最难的科目.要用C++从头到尾实现一下小型编译器,还真不容易啊.不过总算是做完了. 首先上文法,这个文法是根据上一篇博客简化的,但还是有一点问题的,暂时发现有一个 ...

  10. java pl0 四元式,【编译原理】c++实现自下而上语法分析及中间代码(四元式)生成...

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

最新文章

  1. Opengl-深度测试模板测试
  2. PostgreSQL字符串截取替换
  3. 速卖通代运营靠谱吗?招人做对比代运营,找代运营经验分享
  4. LeetCode--Search in Rotated Sorted Array
  5. python类型转换异常捕捉_Java中的异常
  6. 居然之家:核心业务系统全面上云,采用PolarDB替代传统商业数据库
  7. strcpy与strdup
  8. sql server 分区_SQL Server:锁定设置以用于增强分区功能
  9. java tcp demo_详解Java使用TCP实现数据传输实例
  10. 最简单的视音频播放示例8:DirectSound播放PCM
  11. Struts入门学习(三)---自定义类型转换器
  12. Matlab 2016a 安装及破解方法
  13. 电子元器件选型——电容
  14. Android 6.0 sensor 框架详解 (application层)
  15. 白盒测试-条件组合覆盖
  16. 前台获取服务器端的值
  17. allegro加泪滴方法
  18. 唐伯虎的诗,可能是改编的
  19. Skywalking系列博客6-手把手教你编写 Skywalking 插件
  20. 写一个函数判断输入的数字是否为素数 (js)

热门文章

  1. JavaScript 教程+代码(下)
  2. 编译原理实验一:单词的词法分析程序设计
  3. 华为P7开启USB调试方法
  4. 2016域服务器自助修改密码,自助密码重置工具
  5. 【单片机笔记】PWM信号与PPM信号简单理解
  6. SPSS进行问卷量表信度检验【SPSS 082期】
  7. vue Fullcalendar鼠标放上展示悬浮框 (tippyjs插件的简单使用)
  8. numpy.median()
  9. 【前端面经】面试:最快最全面的渗透应聘者真实水平
  10. 新零售智慧供应链架构