Nand to Tetris如何将"pop this 2"编译成asm
Nand to Tetris how to compile "pop this 2" into asm
我知道如何从堆栈中弹出一个值并将其放入 D
@SP
M=M-1
A=M
D=M
而且我知道如何 select 内存位置“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”等操作。包括注释这解释了金块的作用。它将使调试更容易。
一种想法是,实际的 HACK 指令实际上是微代码,而较大的块是真正的机器指令。
稍后,如果您愿意,您可以看看是否可以合并成对的这些指令(例如,如果第一个指令以在位置 X 存储一个值而结束,而下一个立即再次加载它,您通常可以省略负载,有时也可以省略存储)。但是,如果您不小心,这种聪明会咬到您,所以最好让一些更容易理解的东西工作,然后尝试优化它。
玩得开心!
我知道如何从堆栈中弹出一个值并将其放入 D
@SP
M=M-1
A=M
D=M
而且我知道如何 select 内存位置“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”等操作。包括注释这解释了金块的作用。它将使调试更容易。
一种想法是,实际的 HACK 指令实际上是微代码,而较大的块是真正的机器指令。
稍后,如果您愿意,您可以看看是否可以合并成对的这些指令(例如,如果第一个指令以在位置 X 存储一个值而结束,而下一个立即再次加载它,您通常可以省略负载,有时也可以省略存储)。但是,如果您不小心,这种聪明会咬到您,所以最好让一些更容易理解的东西工作,然后尝试优化它。
玩得开心!