/m的代码 例子 actior actio halt //m的代码 /p的代码 100:LDSP,#600 /初始化栈 action3 108: ACTION, / action的代码 return 128: ADD SP,SP,# insite1∥/调用指令序列的开始 /q的代码 136:ST*SP,#152 /将返回地址压入栈O(SP) action4 144:BR300 调用q call p 152: SUB SP,sP,# maize//恢复SP的值 actions 160: ACTION,2 call q 180: HALT action6 q /P的代码 return 200: ACTION 220:BR*0(SP) /返回 /q的代码 372: ADD 300: ACTIONA //包含有跳转到456380:BB+BP,#3 /将返回地址压入栈 320: ADD SP, SP, #gsize 388:BR300 /调用q 328:ST*SP,#344 //将返回地址压入栈396: SUB SP,SP,#qsie 336:BR200 调用P 404: ACtION6 SUB SP, SP, #gsize 424: ADD SP, SP, #gsize 352: ACTIONs 432:ST*SP,#440 /将返回地址压入栈 440:BR300 调用q 图86栈式分配时的目标代码|4 448: SUB SP, SP, R *O(SP) /返回 600: /栈区的开始处
例子 0(SP)
名字的运行时刻地址 三地址语句中的名字实际上是指向符号表中该名 字条目的指针 ·考虑语句x=0,偎设x的符号表条目包含了x的相 对地址12 如果x分配在静态区,且静态区开始位置为 Istatic,那 么x的实际运行时刻地址是 static+12 ST112,#∥/ static=100 如果x分配在栈区, ST12(SP),#0
名字的运行时刻地址 • 三地址语句中的名字实际上是指向符号表中该名 字条目的指针 • 考虑语句x = 0,假设x的符号表条目包含了x的相 对地址12 • 如果x分配在静态区,且静态区开始位置为static,那 么x的实际运行时刻地址是static+12 • ST 112, #0 // static = 100 • 如果x分配在栈区, • ST 12(SP), #0
代码生成怎么做? 过程调用和返回的代码生成,名字(过程名或变 量名)的运行时刻地址 将中间代码划分为基本块,形成流图 ·为单个基本块生成代码的简单的算法 ·窥孔优化:对目标代码进行优化 全局寄存器分配算法:图着色方法 基于树重写的指令选择
代码生成怎么做? • 过程调用和返回的代码生成,名字(过程名或变 量名)的运行时刻地址 • 将中间代码划分为基本块,形成流图 • 为单个基本块生成代码的简单的算法 • 窥孔优化:对目标代码进行优化 • 全局寄存器分配算法:图着色方法 • 基于树重写的指令选择
基本块和流图 ·为了更好的分配寄存器和完成指令选择,按照如 下方法组织中间代码: 把中间代码划为基本块。每个基本块是满足下列条件 的最大的连续三地址指令序列: ·控制流只能从基本块中的第一条指令进入该块。没有跳转 到基本块中间的转移指令 ·除了基本块的最后一个指令,控制流不会跳转或停止 流图中的结点是基本块,流图的边指明了哪些基本块 可能紧随一个基本块之后运行 流图可以作为优化的基础
基本块和流图 • 为了更好的分配寄存器和完成指令选择,按照如 下方法组织中间代码: • 把中间代码划为基本块。每个基本块是满足下列条件 的最大的连续三地址指令序列: • 控制流只能从基本块中的第一条指令进入该块。没有跳转 到基本块中间的转移指令 • 除了基本块的最后一个指令,控制流不会跳转或停止 • 流图中的结点是基本块,流图的边指明了哪些基本块 可能紧随一个基本块之后运行 • 流图可以作为优化的基础
划分基本块的算法 ·输入:一个三地址指令序列 输出:输入序列对应的一个基本块列表,其中每 个指令恰好被分配给一个基本块 ·方法: 确定基本块的首指令 中间代码的第一个三地址指令是一个首指令 任意一个条件或无条件转移指令的目标指令是一个首指令 紧跟在一个条件或无条件转移指令之后的指令是一个首指令 每个首指令对应一个基本块 从它自己开始,直到下一个首指令(不含)或者结尾指令之 间的所有指令
划分基本块的算法 • 输入:一个三地址指令序列 • 输出:输入序列对应的一个基本块列表,其中每 个指令恰好被分配给一个基本块 • 方法: • 确定基本块的首指令 • 中间代码的第一个三地址指令是一个首指令 • 任意一个条件或无条件转移指令的目标指令是一个首指令 • 紧跟在一个条件或无条件转移指令之后的指令是一个首指令 • 每个首指令对应一个基本块 • 从它自己开始,直到下一个首指令(不含)或者结尾指令之 间的所有指令