编译原理实验报告
实验题目: x86 目标代码生成
学号:
日期:2024.6.28
班级:
姓名:
Email:
实验目的:
本实验要做的是实现一个可以把四元式翻译成 x86 目标代码的代码生成器。代
码生成器求解待用信息、活跃信息和寄存器描述符地址描述符等,根据它们分配
寄存器,并逐条把四元式翻译成汇编代码,注意代码生成器需要在一个基本块范
围内考虑如何充分利用寄存器,而全局代码的生成则是简单地将各个基本块代码
串联。
实验环境介绍:
硬件环境:
11th Gen Intel(R) Core™ i7-1165G7 @ 2.80GHz
软件环境:
Windows11
sduoj
vscode
解决问题的主要思路:
主要是根据提供的伪代码进行编写的。
1. 定义一系列结构体来表示待用信息、活跃信息、四元式、符号表、基本块等
相关的数据结构。
- dyhy 结构体用于表示待用和活跃信息。
- sys 结构体表示四元式的各项信息。
- zj 结构体表示符号表中的变量信息。
- jbk 结构体表示基本块的相关信息。
2. 初始化了一些全局变量和容器,如 R0、R1、R2 用于存储寄存器中的变量,
fuhaobiao 用于存储符号表,siyuanshi 用于存储四元式,jibenkuai 用于存储
基本块信息等。
3. 在 main 函数中:
- 首先读取符号表的数量、符号表的信息、临时变量个数和四元式的数量。
- 然后通过循环读入四元式,并进行解析。
- 调用 divideBlock 函数划分基本块。
- 对每个基本块调用 solveUse 函数求解待用信息。
- 最后调用 solve 函数生成代码。
4. 定义了一系列函数来实现不同的功能:
- stringtoint 函数用于将字符串转换为整数。
- parseQuadruple 函数用于解析输入的四元式字符串。
- divideBlock 函数用于划分基本块。
- findul 函数用于根据变量名在符号表中查找位置。
- findjbkliveout 函数用于判断基本块的活跃变量集合中是否包含某个变
量。
- cmpliveOut 函数用于对活跃变量进行排序。