Nand2Tetris:写入@address时A寄存器是否会被覆盖?附汇编代码疑问
关于@address指令与pop local 2汇编代码的问题解答
一、@address指令会覆盖A寄存器吗?
是的,每次执行@address指令时,A寄存器都会被直接覆盖为指定的address值——不管address是符号(比如@LCL)还是数字(比如@2),该指令的核心作用就是将目标地址加载到A寄存器,原有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
代码问题点
逻辑上这段代码能实现功能,但存在冗余操作:
- 中间的
D=A完全多余,你把计算好的LCL+2赋值给D后,后续没有用到这个D值,属于无效步骤。
简化后的正确写法
保留暂存地址到R13的思路,去掉冗余步骤即可,标准的pop local 2写法如下:
// pop local 2:将栈顶元素存入local[2] @LCL D=M // 把local段的基地址存入D @2 D=D+A // 计算local[2]的地址:基地址+2 @13 M=D // 把目标地址暂存到R13 @SP AM=M-1 // SP自减1,同时A指向栈顶元素的地址 D=M // 取出栈顶元素的值存入D @13 A=M // 让A指向暂存的local[2]地址 M=D // 将栈顶元素存入local[2]
内容的提问来源于stack exchange,提问作者Adam z
相关产品推荐
相关产品推荐

