购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.6 分配变量存储

assign_homes编译遍将x86 Var 程序编译为不再使用程序变量的x86 Var 程序。因此,assign_homes编译遍负责将所有程序变量放入寄存器或栈中。为了提高运行时效率,最好将变量放在寄存器中,但由于只有16个寄存器,一些程序必须将一些变量放在栈中。在本章中,我们将重点讨论在栈上放置变量的机制。在第4章中,我们研究了一个在寄存器中放置变量的算法。

再次考虑2.4节中的 L Var 程序:

select_instructions编译遍的输出在左边,assign_homes遍的输出在右边。在本例中,我们将变量a分配给栈位置-8(%rbp),将变量b分配给位置-16(%rbp)。

assign_homes编译遍应该用栈位置替换变量的所有使用。计算出帧的大小(以字节为单位),并将其存储在X86Program节点的字段stack_space中,这将便于把变量赋值到栈位置的处理,稍后需要以此生成main过程的收尾部分。x86-64汇编的标准要求帧大小是16字节的倍数。

习题2.4 在compiler.py中实现assign_homes编译遍,为x86 Var 语法中的每个非终结符定义辅助函数。我们建议辅助函数接受一个额外的参数,将变量名映射到存储中(现在是栈位置)。运行run-tests.py脚本,检查输出程序是否产生与输入程序相同的结果。 KHHK0YRD8pZuCwDP7Bej05mRmNg9NAhpnb50ZnJz2ulnbsTSIaXUEEKkL/UfV58Y

点击中间区域
呼出菜单
上一章
目录
下一章
×