如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
§8目标代码生成§8目标代码生成本章主要内容8.1代码生成器设计中的问题一、代码生成器的输入二、代码生成器的输出三、存储管理例如:中间代码与目标代码的对应四、指令选择五、寄存器分配六、计算顺序的选择8.2目标机器寻址方式举例三地址语句a:=b+c的代码过程的语义决定了运行时名字如何与存储单元相联系。存储分配策略静态存储分配存储器中活动记录的位置在编译时刻已经确定栈式存储分配当开始执行一个过程时,一个新的活动记录压入栈顶当该过程的活动结束时,其活动记录从栈中弹出活动记录的内容参数、返回值控制链、访问链、机器状态局部数据、临时变量静态存储分配情况三地址语句call的目标机器指令:MOV指令:存放返回地址GOTO指令:将控制转移到被调用过程的目标代码MOV#here+20,callee.static_areaGOTOcallee.code_area静态存储分配举例栈式存储分配情况代码结构程序说明100:MOV#600,SP108:action1128:ADD#ssize,SP136:MOV#152,*SP144:GOTO300152:SUB#ssize,SP160:action2180:HALT…200:action3220:GOTO*0(SP)…程序执行及栈的变化情况运行时名字的地址用display表存取非局部名字,该表存放在寄存器中x局部于一个活动记录,该活动记录的display表指针在寄存器R3中将语句x:=0翻译成为如下三地址语句:t1:=12+R3*t1:=08.4基本块和流图举例流图举例8.5下次引用信息计算下次引用信息算法举例计算B2中变量的下次引用信息变量下次活跃i无活prod无活a无活b无活t1无活t2无活t3无活t4无活t5无活t6无活t7无活t8无活t9无活8.6简单的代码生成器考虑引用信息数据结构寄存器分配函数getreg代码生成算法特殊情况处理:使用MOV指令把那些在块出口是活跃的、且当前值还不在存储单元中的名字的值存储到它们的存储器地址中。方法:使用寄存器描述器确定哪些名字的当前值仍保留在寄存器中使用地址描述器确定其中哪些名字的当前值还不在存储单元里使用活跃变量信息来确定是否需要存储其当前值在没有进行数据流分析的情况下,需要假定用户定义的所有变量在基本块出口处都是活跃变量在计算下次引用信息的算法中,第一步要把活跃信息域置为“活跃”举例翻译过程为索引赋值语句生成目标代码为指针赋值语句生成目标代码ifx<ygotoz实现:x-y的结果送入寄存器R判断R的值为正、负、还是零若为负,则转移到z利用条件码表示计算结果或存入寄存器R的值为正、负、还是零如:ifx<ygotoz目标代码:CMPx,yCJ<z小结小结(续)作业