Presentation is loading. Please wait.

Presentation is loading. Please wait.

第十章 目标代码生成  目标代码 ( 单寄存器 )  临时变量的存储空间分配  寄存器的分配和释放.

Similar presentations


Presentation on theme: "第十章 目标代码生成  目标代码 ( 单寄存器 )  临时变量的存储空间分配  寄存器的分配和释放."— Presentation transcript:

1 第十章 目标代码生成  目标代码 ( 单寄存器 )  临时变量的存储空间分配  寄存器的分配和释放

2 目标代码  虚拟目标代码:虚拟机上的目标程序。 在本地机器上具备虚拟机的解释器。  实际目标代码:实际机器上的指令序列 绝对地址机器代码: 可重定位的机器代码: 汇编代码:

3 三种硬件地址模式  指令格式: Op #C R (立即 ----- 寄存器) Op d(R1) R2 (存储器 ----- 寄存器) Op R1 R2 (寄存器 ----- 寄存器)  几个常见指令的含义 : Load Source R 从 Source 读出送入 R Op Source R Source op R 结果 送入 R Store Target R R 的内容送入 Target.

4 目标代码的生成(单寄存器)  形如( Op , A , B , T ): Load A R ; Op B R  形如 (ASSIG,A,B) : Load A R ; Store R B  例: Z:= X*(a+b)* Y* (a+b) ( +,a,b,t1) Load a R; Add b R (*,X,t1,t2)Store R t1; Mult X R (*,t2,Y,t3)Mult Y R (*,t3,t1,t4)Mult t1 R

5 标号和 Jump 的代码  标号到代码地址的对应表( flag, L, Addr )  形如 (Label L): 当对应表中没有 L 项时:填写表项 (1,L, Pc) , Pc 表示 下一条目标代码的地址。 当有 L 项 (0, L, P’) 时:从 P’ 顺着链回填地址 Pc  形如 (Jump L): 对应表中没有 L 项时构造链头 P:(Jump , nil) : 填写表项 (0, L, P) ; 当有表项 (0,L,P’) 时:拉链 P:(Jump P’) ,修改表项为 (0,L,P) ; 当有表项 (1,L,P) 时: 取出 L 的地址 P 生成代码。

6 过程 / 函数调用的代码  主要工作: 过函调用时:申请新 AR 空间 参数传递 转向 过程体 过函入口:填写 AR 的相关内容。 过函返回时: 释放 AR 区 恢复信息 返回值  参数传递的代码: 值参: (VALACT,a,off,1) : Load a(sp) R Store off(top) R (VALACT,A,off,1) : Load @A(sp) R Store off(top) R

7 变参: (VARACT,a,off,1) : LoadA a(sp) R Store off(top) R (VARACT,A,off,1) : Load A(sp) R Store off(top) R 过函形参: (PROCACT,p,off,1) : Load Enter(p) R Store off(top) R (PROCACT,P,off,1) : Load P(sp) R Store off(top) R

8  过函调用 Call :传参; (Call,g,True) : Jump Enter(g) (Call,G,False) : Jump @G(sp)  入口 (Entry,Label,size,Level) : 填写 AR 信息; Load top sp ADD top size  出口 (ENDPROC,---) : 恢复调用前的信息和寄存器内容; 保存返回值; Load sp top ; Load DyL(sp) sp ; Jump Re_A(top)

9 临时变量  特点: 寿命短; 一次定义一次使用  存储空间:尽可能采用共享办法 随用随分配的动态分配: 调用一个过程时,分配一个新的 AR 空间 ( 不包括临 时变量部分 ) ,每当要保存一个临时变量时,动态 分配到栈区的可用单元中 按共享法静态分配: 先计算出临时变量的空间,在过程调用时和源变量 一起申请空间。即调用时将临时变量安排在 AR 中。

10 临时变量的静态分配  定值点:如果 i 中间代码给临时变量 T 定值, 则称 i 为临时变量 T 的定值点。  引用点:如果 j 中间代码使用 T ,则称 j 为 T 的 引用点。  活动区间:如果 i 是 T 的定值点, j 是 T 的最后 引用点,则称 [i, j] 是 T 的活动区间。  活动区间 [i, j] 和 [m, n] 不严格相交: 如果 m  j 或 i  n 。  空间分配: 如果两个临时变量的活动区间不严格相交,则可以 共享单元

11 T1T1 T2T2 T3T3 T4T4 T5T5 Offset = m Offset = m+1 Offset = m 例:

12 寄存器  寄存器的分类: 可分配寄存器 保留寄存器 零用寄存器  寄存器的使用准则: 寄存器先行准则 寄存器活跃准则 寄存器多载准则  变量的状态描述:

13 寄存器的分配  分配原则:选择代价最小的寄存器  寄存器状态描述:  寄存器的选择代价: Store 代价 Load 代价


Download ppt "第十章 目标代码生成  目标代码 ( 单寄存器 )  临时变量的存储空间分配  寄存器的分配和释放."

Similar presentations


Ads by Google