当我们写入@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
是的,@是立即加载到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。