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的主要内容,如果未能解决你的问题,请参考以下文章

VMEmulator Nand2Tetris

Nand2Tetris C 指令组合中的“a”是啥意思?

预期 Nand2Tetris 跳转指令

Nand2tetris 中的减法实现

nand2tetris 16bit PC 使用 8bit 寄存器

内存芯片实现中的无限循环问题 (Nand2Tetris)