Nand2Tetris - A寄存器被覆盖?

问题描述 投票:0回答:1

当我们写入@address时,A寄存器会被覆盖吗?例如,我正在尝试编写 pop local 2 的程序集,但我不确定这是一个好方法:

@LCL
D=M
@2 
A=D+A
@13
M=A // LOCAL[2] IS INSIDE REGISTER 13
D=A
@SP
AM=M-1
D=M
@13
A=M//GOING LOCAL[2]
M=D//STORE WHAT WAS AT THE TOP OF THE STACK
assembly optimization virtual-machine nand2tetris
1个回答
1
投票

是的,@是立即加载到A寄存器中。处理物理硬件中有限数量的实际寄存器是挑战的一部分。

一些可能对您有用的技巧:

  • 存储到多个目的地的能力(就像在 AM=M-1 中所做的那样)特别方便;我想你错过了将 M=A,D=A 折叠成 MD=A 的机会。

  • 将 2 添加到 D 时,D=D+1,D=D+1 与 @2,D=D+A 一样快,但保留 A。(旁注:在您的代码中,您正在执行 A=D +A 然后立即用 @13 覆盖它;这是正确的吗?)。根据具体情况,可能值得使用更长的 D=D+1 序列来避免重新加载 A。A=A+1 序列也是如此;他们保留了 D。

  • 重新排序操作有时可以节省指令,特别是如果您可以在 D 中存储某些内容并完全在 A 中计算地址。

如果我没记错的话(很可能是这样,现在是半夜,我失眠了),你可以用 8 个指令实现 POP Local 2。

© www.soinside.com 2019 - 2024. All rights reserved.