编译原理第10章-目标代码生成
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
从Source 读出送入R Source op R结果 送入R R的内容送入Target
三种硬件地址模式
硬件地址模式:#c d(R) R
指令格式:
Op #C R
----立即式 ----变址式 ----寄存式
(立即-----寄存器)
Op d(R1) R2 (存储器-----寄存器)
Op R1 R2
(寄存器-----寄存器)
ST T, R 赋值语句四元式:形如(ASSIG,A,-,B):
汇编指令:LD R,A; ST B,R
例:Z:= X*(a+b)* Y* (a+b)
(ADDI,a,b,t1)
LD R,a; Add R,b; ST t1,R
(MULTI,X,t1,t2) LD R,t1; MUlT R,X; ST t2,R
几个常见指令的含义 :
Load Source R
从Source 读出送入R
Op Source R Source op R结果 送入R
Store Target R R的内容送入Target.
临时变量
特点: 寿命短; 一次定义一次使用 存储空间分配:尽可能采用共享办法
随用随分配的动态分配:
调用一个过程时,分配一个新的AR空间(不包括临 时变量部分),每当要保存一个临时变量时,动态 分配到栈区的可用单元中
循环语句的翻译
(WHILE,_,_,_)不产生目标代码,只用来标记 while语句的入口地址,将地址A入栈S;
(DO , t ,_ ,_)产生的目标代码为: LD R , t JUMP0 R , _
Load A,B Op B,R 时: 把T(L, NS) 加入R的状态表中,从R中删除A项 申请寄存器时R的状态表为空,释放时表也为空 (可能生成一些store指令)。
寄存器的分配
分配原则:选择代价最小的寄存器 寄存器的选择代价:Store代价、Load代价
把寄存器中的现行值回送内存的Store指令总代价; 由于寄存器被剥夺,下次重新装入寄存器的Load指令 的总代价; 如果申请到的是未分配过的新寄存器,则代价为0。 释放代价: X (D, NS) ----0 X(D, S) ----0 X(L, NS) ----2 X(L, S) ----4 分配算法: 选择最小释放代价,下次引用距离最远
按共享法静态分配:
先计算出临时变量的空间,在过程调用时和源变量 一起申请空间。即调用时将临时变量安排在AR中
临时变量的静态分配
定值点:如果i中间代码给临时变量T定值, 则称i为临时变量T的定值点。
引用点:如果j中间代码使用T,则称j为T的 引用点。
活动区间:如果i是T的定值点,j是T的最后 引用点,则称[i, j]是T的活动区间。
第十章 目标代码生成
目标代码 临时变量的存储空间分配 寄存器的分配和释放 基于三地址中间代码的目标代码生成
目标代码生成概述
目标代码生成器的输入和输出
输入:中间代码/TokenList+[符号表] 输出:
• 绝对机器代码:执行速度快,缺乏灵活性 • 可重定位机器代码:可分模块编译,需连接和装入 • 汇编代码:必须经过汇编程序汇编
的寄存器
四元式到目标代码的翻译
翻译过程:从头到尾逐条扫描四元式,每扫描完一条四元式就把它 翻译成对应的目标代码(一条四元式可能会对应若干条目标指令)
限定条件:目标机只有一个寄存器、不考虑效率、当前地址为A
表达式和赋值语句的翻译
表达式四元式:形如(Op,A,B,T): 汇编指令:LD R,A; Op R,B;
活动区间[i, j]和[m, n]不严格相交:如果mj或i n。 空间分配:
如果两个临时变量的活动区间不严格相交,则可以 共享单元
例:
T1 T2
T3 T4
T5
Offset = m Offset = m+1
Offset = m+1 Offset = m Offset = m+1
变量的状态描述
变量:源变量和临时变量 描述内容:
输出语句四元式形如:(WRITE,A,-,-) 汇编指令:LD R , A; OUT R
条件语句四元式的翻译
(THEN, t,_ , _)生成的汇编代码为: LD R,t JUMP0 R,__
(ELSE,_,_,_)生成的汇编代码为: JMP __ 同时回填JUMP0指令的目的地址
(ENDIF,_,_,_)不产生目标代码,只负责完成ELSE子句的地址 回填工作 。
衡量目标代码质量的标准
在保证语义相等的情况下,生成的目标指令的条数越少和执行速度越快
虚拟机
指令格式为:op destination source
其中destination和source不能同为存储字
虚拟机的寻址方式和相应的汇编语言表示形式
虚拟机的指令系统
LD R,Source Op R,Source ST Target,R
变量是否在寄存器中: 变量的现行值是否在内存中:
变量的值在其后是否还使用: 变量的下次引用距离:
状态描述形式(DL, SNS)
DL: 如果从下一位置开始,到变量A重新被赋值或基本 块结束,没有A的当前值的引用,则定义当前该变量的 DL为D;否则定义为L。表示此后变量的状态。 SNS: 如果A的值在寄存器但不在内存,而且当该寄存 器被剥夺时需要保存变量的值,则当前该变量的SNS的 值为S(Store),否则取NS。
(MULTI,t2,Y,t3) LD R,t2; MUlT R,Y; ST t3,R
(MULTI,t3,t1,t4) LD R,t3; MUlT R,t1;ST t4,R;
(ASSIG,t4,-,Z) LD R, t4; ST Z,R
输入/输出语句的翻译
输入语句四元式形如:(READ, A,-,-) 汇编指令:IN R; ST A , R
寄存器
寄存器的分ຫໍສະໝຸດ Baidu:
可分配寄存器 保留寄存器 零用寄存器
寄存器的使用准则:
寄存器先行准则 寄存器活跃准则 寄存器多载准则
寄存器的状态描述:
占有该寄存器的所有变量状态描述的集合。
寄存器的状态变化
如果现行值已在内存中,则不需回送 现行值不在内存,但该值没有下次引用。不需回送
生成代码 Load B, R 时:构造R:{B(L/D, NS)} 生成(Op , A, B, T)的目标代码为: