You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 11:36:11