我知道如何从堆栈中弹出一个值以将其放入 D
@SP
M=M-1
A=M
D=M
我知道如何选择内存位置“this 2”
@2
D=A
THIS
A=A+D
问题是我在两个步骤中都使用 D 所以显然只是使用
M=D
不会有想要的结果。我想我以后需要第二个寄存器来保存一些值,或者我在这里遗漏了什么?
我知道如何从堆栈中弹出一个值以将其放入 D
@SP
M=M-1
A=M
D=M
我知道如何选择内存位置“this 2”
@2
D=A
THIS
A=A+D
问题是我在两个步骤中都使用 D 所以显然只是使用
M=D
不会有想要的结果。我想我以后需要第二个寄存器来保存一些值,或者我在这里遗漏了什么?
在这些情况下,您将不得不将内存位置用作临时寄存器。请注意,正如为您预定义了 @SP 一样,其他一些临时内存位置(如 R0、THIS、THAT 等)也是如此。
因此,通常最好将您的程序编写为一系列独立的代码块,执行“POP into THIS”、“ADD THAT to THIS”、“MOVE THAT into R15”等操作。包括注释以解释 nugget 是什么做。这将使调试变得容易得多。
一种思考方式是,实际的 HACK 指令实际上是微码,而较大的块是真正的机器指令。
稍后,如果您愿意,您可以查看是否可以合并这些指令对(例如,如果第一个以在位置 X 中存储一个值结束,而下一个立即再次加载它,您通常可以省略加载,有时还有商店)。但是,如果您不小心,这种聪明可能会咬到您,因此最好让一些更容易理解的工作,然后尝试对其进行优化。
玩得开心!