目标代码生成
目标代码生成
代码生成器 根据中间表示(R)生成代码 代码生成器的三个任务 指令选择:选择适当的指令实现R语句 寄存器分配和指派:把哪个值放在哪个寄存器中 指令排序:按照什么顺序安排指令执行 ·生成的目标程序应满足:保持源程序语义、高效 源程序 前端 中间 代码优L中间 代码 目标 代码 --代码 化器 生成器「程序 图8-1代码生成器的位置
代码生成器 • 根据中间表示(IR)生成代码 • 代码生成器的三个任务 • 指令选择:选择适当的指令实现IR语句 • 寄存器分配和指派:把哪个值放在哪个寄存器中 • 指令排序:按照什么顺序安排指令执行 • 生成的目标程序应满足:保持源程序语义、高效
要考虑的问题 代码生成器的输入 由前端生成的源语言的中间表示和符号表信息 ·中间表示形式,在本书中主要是三地址代码、DAG等 目标程序 目标机器的指令集体系结构 常见:RsC(精简指令集计算机),CSC(复杂指令集计 算机),基于堆栈的结构 本章中,采用一个非常简单的类RSC计算机作为目标 机,加入一些类CSC的寻址方式 生成汇编代码
要考虑的问题 • 代码生成器的输入 • 由前端生成的源语言的中间表示和符号表信息 • 中间表示形式,在本书中主要是三地址代码、DAG等 • 目标程序 • 目标机器的指令集体系结构 • 常见:RISC(精简指令集计算机),CISC(复杂指令集计 算机),基于堆栈的结构 • 本章中,采用一个非常简单的类RISC计算机作为目标 机,加入一些类CISC的寻址方式 • 生成汇编代码
要考虑的问题 指令选择 R的层次 指令集体系结构中本身的特性 生成代码的质量,要考虑到目标代码的效率 L d ro, b /R0=b ADd RO, RO, c / RO= R0 + c a =b+c IST a. RO // a=RO ILD RO, a RO ADD RO, Ro, e //Ro =RO+e st d. ro // d= RO LD RO a=a+1 ADD RO, RO, #1 //RO = RO +1 st a. ro /a=R0 INc a / if it's a valid instr
要考虑的问题 • 指令选择 • IR的层次 • 指令集体系结构中本身的特性 • 生成代码的质量,要考虑到目标代码的效率 INC a // if it’s a valid instr
要考虑的问题 寄存器分配和指派 有效地利用寄存器(最“小而快”的存储) 源程序的每个时刻,选择一组将被存放在寄存器中的变量 ·指定一个变量被放在哪个寄存器中 还需要考虑目标机器或操作系统对特定指令使用哪些 寄存器的规则
要考虑的问题 • 寄存器分配和指派 • 有效地利用寄存器(最“小而快”的存储) • 源程序的每个时刻,选择一组将被存放在寄存器中的变量 • 指定一个变量被放在哪个寄存器中 • 还需要考虑目标机器或操作系统对特定指令使用哪些 寄存器的规则
本书的目标语 指令格式:一个运算符,一个目标地址,一个源 运算分量的列表 ·内存按照字节寻址 ·n个通用寄存器RO,R1
本书的目标语言 • 指令格式:一个运算符,一个目标地址,一个源 运算分量的列表 • 内存按照字节寻址 • n个通用寄存器R0, R1, …
本书的目标语言的指令集 加载: ld dst,src dst为寄存器 LDr.x dro. r1 Dr,#100 保存: st dst,src STx.r STx.#100 运算: oP dst,srcu,src2 SUBr1 r2 r3 无条件跳转:BRL 条件跳转: Bond r,L ·当r里的值小于0时跳转L:BLTz,L
本书的目标语言的指令集 • 加载:LD dst, src • dst为寄存器 • LD r, x LD r0, r1 LD r, #100 • 保存:ST dst, src • ST x, r ST x, #100 • 运算:OP dst, src1 , src2 • SUB r1, r2, r3 • 无条件跳转:BR L • 条件跳转:Bcond r, L • 当r里的值小于0时跳转L:BLTZ r, L
指令中的dst和src 变量名x(内存中的位置) ·寄存器r a(r),其中a是一个变量,r是一个寄存器 a(r)的内存位置:a的地址加上存放在寄存器r中的值 LDR1,a(R2)表示赋值R1= contents(a+ contents(R2) n(r),其中n是一个整数,r是一个寄存器 LDR1,100(R2)表示赋值R1= contents(100+ content(R2) *r,表示r的内容所表示的位置上存放的内存位置 n LD R1, *100(R2)/R1=content(contents(100+content(R2) #n,表示一个直接常数 LDR1,#100ADDR1R1,#100
指令中的dst和src • 变量名x(内存中的位置) • 寄存器r • a(r),其中a是一个变量,r是一个寄存器 • a(r)的内存位置:a的地址加上存放在寄存器r中的值 • LD R1, a(R2)表示赋值R1 = contents(a+contents(R2)) • n(r),其中n是一个整数,r是一个寄存器 • LD R1, 100(R2)表示赋值R1 = contents(100+content(R2)) • *r,表示r的内容所表示的位置上存放的内存位置 • *n(r) • LD R1, *100(R2)表示R1 = content(contents(100+content(R2))) • #n,表示一个直接常数 • LD R1, #100 ADD R1,R1,#100
目标机指令序列示例 Ld R1, y //R1 LD R2. Z //R2 =y-2 SUB R1. R1. R2 //R1=R1-R2 ST x, R1 //x=R1 对于实数数组a, Ld R1, i b=al i /R1=i MUL R1. R1. 8 /R1=R1* Ld R2, a (r1) // R2= contents(a contents(r1)) ST b, R2 //b=R2 LD R1. c /R1=c a LD R2, j //R2= MUL R2, R2, 8 R2=R2*8 sT a(R2), R1 // contents(a contents(R2))=R1 LD R1,p //R1 x=求p LDR2,0(R1) // R2 contents(o+ contents(r1)) sT x R2
目标机指令序列示例 对于实数数组a
目标机指令序列示例(续) LD R1, p //R1=p 米p=y LD R2,y //R2= ST0(R1),R2 // contents(o+ contents(R1))=R2 Ld R1. x //R1=x if x< y goto L LD R2, y /R2 SUB R1, R1, R2 // R1 R1-R2 BLTZ R1. M // if R1 0 jump to M
目标机指令序列示例(续)