实验指导书-实验四-目标代码生成1

preview
需积分: 0 4 下载量 67 浏览量 更新于2022-08-08 收藏 26KB DOCX 举报
实验四的目的是让学生深入理解编译器的工作流程,特别是代码生成阶段,这涉及到汇编指令的构造、寄存器分配以及简单的程序优化。在实验中,学生需要将三地址码序列转换成目标汇编指令,这有助于理解如何将高级语言转化为机器能理解的指令。 1. **汇编指令的理解与生成**:实验要求学生熟悉不同类型的汇编指令,例如数据转移指令(如MOV)、算术逻辑操作指令(如ADD、SUB)等,并能根据三地址码序列生成相应的汇编指令序列。例如,给定的赋值语句 `d:=(a-b)+(a-c)+(a-c)` 需要转换为对应的三地址码,再进一步转换为目标汇编指令。 2. **寄存器分配与getreg函数**:`getreg` 函数是实验的关键部分,它负责决定计算结果应存储的位置。当处理 `x:=y op z` 这样的表达式时,首先通过 `getreg` 函数找到一个可用的寄存器或内存位置 `L` 来保存运算结果。函数可能需要考虑寄存器压力,避免过多的寄存器使用和不必要的数据移动。 3. **地址描述符与数据位置**:在确定变量 `y` 的位置时,需要查看其地址描述符来确定其当前状态,是存在于内存还是寄存器中。如果 `y` 同时存在于两者,优先选择寄存器作为 `y'`。若 `y` 的值不在 `L` 中,需要通过 `MOV` 指令将 `y` 的值加载到 `L`。 4. **指令生成**:生成 `op z', L` 指令来执行实际的操作,其中 `z'` 是 `z` 当前所在的位置之一。这一步确保了操作数正确参与运算。 5. **寄存器管理**:在操作完成后,如果 `y` 和/或 `z` 的值不再被后续引用,且在块出口处也不活跃,可以释放它们占用的寄存器资源,更新寄存器描述符表示这些寄存器不再包含 `y` 和/或 `z` 的值。 6. **优化与程序开销**:实验还鼓励进行部分优化,减少指令数量和程序的运行时间。优化后,需要比较优化前后的程序开销,并进行量化评估。 7. **实验报告**:报告应包括生成的汇编代码序列,优化效果的分析,以及代码生成器的流程图,以展示对整个过程的理解。 8. **附加功能**:将四个实验整合成一个完整的编译器程序,能够完成词法分析、语法分析、语义分析到目标代码生成的全过程,这是一项高级任务,需要深入理解编译器的每个阶段,并编写相应的文档说明。 这个实验不仅锻炼了学生的编程技能,更加强了他们对编译器工作原理的理论理解,为未来深入学习系统级编程和软件开发奠定了坚实的基础。