第十章目标代码生成 ●目标代码(单寄存器) ●临时变量的存储空间分配 寄存器的分配和释放
第十章 目标代码生成 目标代码(单寄存器) 临时变量的存储空间分配 寄存器的分配和释放
目标代码 虚拟目标代码:虚拟机上的目标程序。 在本地机器上具备虚拟机的解释器。 实际目标代码:实际机器上的指令序列 绝对地址机器代码: 可重定位的机器代码: 汇编代码:
目标代码 虚拟目标代码:虚拟机上的目标程序。 在本地机器上具备虚拟机的解释器。 实际目标代码:实际机器上的指令序列 绝对地址机器代码: 可重定位的机器代码: 汇编代码:
三种硬件地址模式 指令格式: Op #c R (立即—寄存器) 0pd(R1)R2(存储器寄存器) Op D 1R2 (寄存器——-寄存器) ●几个常见指令的含义: Load Source r 从 Source读出送入R 0 o Source r Source op R结果送入R Store Target R R的内容送入 Target
三种硬件地址模式 指令格式: 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
目标代码的生成(单寄存器 ●形如(0p,A,B,T): Loada r;0BR 形如(ASSG,A,B): Loada r; Storer B 例:z:=米*(a+b)*Y*(a+b) (+ a, b, t1)Load a R; Add b R (*,X, t1, t2) StoreR t1: Mult X R (* t2, Y, t3)Mult Y R (*,t3, t1, t4)Mult t1R
目标代码的生成(单寄存器) 形如(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
标号和Jump的代码 鲁标号到代码地址的对应表(nag,L,Addr) 鲁形如 Labell 当对应表中没有L项时:填写表项(1,L,Pe),Pc表示 下一条目标代码的地址。 当有L项(0,L,P)时:从P顺着链回填地址Pc 鲁形如( Jump l 对应表中没有L项时构造链头P(Jump,ni): 填写表项(0,L,P); 当有表项(0,L,P)时:拉链P(JmpP),修改表项为 当有表项(1,L,P)时:取出L的地址P生成代码
标号和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生成代码