预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共51页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

§8目标代码生成§8目标代码生成本章主要内容8.1代码生成器设计中的问题一、代码生成器的输入二、代码生成器的输出三、存储管理例如:中间代码与目标代码的对应四、指令选择五、寄存器分配六、计算顺序的选择8.2目标机器寻址方式举例三地址语句a:=b+c的代码过程的语义决定了运行时名字如何与存储单元相联系。 存储分配策略 静态存储分配 存储器中活动记录的位置在编译时刻已经确定 栈式存储分配 当开始执行一个过程时,一个新的活动记录压入栈顶 当该过程的活动结束时,其活动记录从栈中弹出 活动记录的内容 参数、返回值 控制链、访问链、机器状态 局部数据、临时变量静态存储分配情况三地址语句call的目标机器指令: MOV指令:存放返回地址 GOTO指令:将控制转移到被调用过程的目标代码 MOV#here+20,callee.static_area GOTOcallee.code_area 静态存储分配举例栈式存储分配情况代码结构程序说明100:MOV#600,SP 108:action1 128:ADD#ssize,SP 136:MOV#152,*SP 144:GOTO300 152:SUB#ssize,SP 160:action2 180:HALT … 200:action3 220: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,y CJ<z小结小结(续)作业