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

2.7 修补指令

patch_instructions编译遍将从x86 Var 语言翻译到x86 Int 语言,确保每条指令都遵守一条指令最多只能有一个参数是内存引用的限制。

我们再回到下面的例子。

assign_homes编译遍将产生以下翻译结果:

第二个movq指令是有问题的,因为两个参数都是栈的位置。我们建议通过从源位置移动到寄存器rax,然后从rax移动到目标位置来解决此问题,如下所示。

还有一个类似的极端情况也需要处理。如果一个参数是大于2 16 的立即整数,而另一个参数是内存引用,则该指令无效。可以这样解决此问题,例如,首先将立即整数移动到rax中,然后使用rax代替整数。

习题2.5 实现在compiler.py中的patch_instructions编译遍。创建三个新的示例程序,用于练习本节中全部有趣的案例。运行run-tests.py脚本,检查输出程序是否产生与输入程序相同的结果。 i0LGC5cF0XLUhSpnUavdLLu2VmaYOv3bl7iBjkCYqhOTYEsjgLa8EyTcb+7RP/jZ

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