我在我的本科课程中学习了关于编译器的课程,其中我们编写了一个编译器,该编译器将类似于Java的玩具语言的源程序编译为玩具汇编语言(为此我们提供了解释器)。在项目中,我们对与“真正的”本机可执行文件密切相关的目标计算机做出了一些假设,包括:
- 运行时堆栈,由专用堆栈指针(“ SP”)寄存器跟踪
- 用于动态对象分配的堆,由专用堆指针(“ HP”)寄存器跟踪
- 专用程序计数器寄存器(“ PC”)
- 目标机器有16个寄存器
- 对数据的操作(与例如跳转相反)是寄存器到寄存器的操作
当我们到达使用寄存器分配作为优化的单元时,我感到很奇怪:这种机器的理论最小寄存器数量是多少?通过我们的假设,您可以看到我们在编译器中使用了五个寄存器(SP,HP,PC,另外两个用作二进制操作的存储)。尽管诸如寄存器分配之类的优化当然可以利用更多的寄存器,但有没有办法在保持堆栈结构(如堆栈和堆)的同时减少使用?我想通过寄存器寻址(寄存器到寄存器操作)我们至少需要两个寄存器,但是我们需要两个以上吗?