Nand to Tetris 如何将“pop this 2”编译成asm
Posted
技术标签:
【中文标题】Nand to Tetris 如何将“pop this 2”编译成asm【英文标题】:Nand to Tetris how to compile "pop this 2" into asm 【发布时间】:2021-08-10 20:18:12 【问题描述】:我知道如何从堆栈中弹出一个值并将其放入 D
@SP
M=M-1
A=M
D=M
而且我知道如何选择内存位置“this 2”
@2
D=A
THIS
A=A+D
问题是我在两个步骤中都使用 D,所以显然只是使用
M=D
不会有预期的结果。我想我以后需要第二个寄存器来保存一些值,还是我在这里遗漏了什么?
【问题讨论】:
【参考方案1】:在这些情况下,您将不得不将内存位置用作临时寄存器。请注意,就像为您预定义了 @SP 一样,其他一些临时内存位置也是如此,例如 R0、THIS、THAT 等。
因此,通常最好将您的程序编写为一系列独立的代码块,执行诸如“POP into THIS”、“ADD THAT to THIS”、“MOVE THAT into R15”等操作。包括解释掘金做什么。这将使调试变得容易得多。
一种理解方式是,实际的 HACK 指令实际上是微码,而较大的块是真正的机器指令。
稍后,如果您愿意,您可以查看是否可以合并这些指令对(例如,如果第一个以在位置 X 中存储一个值结束,而下一个立即再次加载它,您可以通常省略加载,有时也省略存储)。但是,如果您不小心,这样的聪明可能会咬到您,因此最好让一些更容易理解的工作,然后尝试对其进行优化。
玩得开心!
【讨论】:
使用一些临时内存位置(对我来说是 R13)确实是缺少关键部分。以上是关于Nand to Tetris 如何将“pop this 2”编译成asm的主要内容,如果未能解决你的问题,请参考以下文章