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

Nand2Tetris:Hack汇编乘法程序硬件模拟器比较失败错误

Hack乘法程序错误排查与修正

你的代码里有两个明显的逻辑问题,是导致测试失败的主要原因:

1. 循环执行顺序错误

当前代码会先执行累加操作,再检查计数是否终止。这会导致当R1(乘数)为0时,程序仍会执行一次M=D+M,把R0的值加到R2中,而正确结果应该是0(0乘任何数都为0)。这种边界场景的错误会直接导致大量测试用例失败。

2. 减1操作的写法存在隐患

你写的D=D-A虽然在当前场景下(@R1后A的值是1)刚好实现了减1,但这是依赖R1的地址为1的巧合写法,不是正确的通用减1方式。正确的写法应该显式处理计数递减,避免依赖寄存器地址的隐含值。

排查与修正方向

  • 优先测试边界用例:先跑R1=0、R0=0、R1=1这类简单场景,快速验证核心逻辑是否正确,定位问题点。
  • 逐行跟踪寄存器状态:在硬件模拟器中单步执行代码,观察R0、R1、R2、D、A的每一次变化,确认累加和计数步骤是否符合预期。
  • 调整循环逻辑顺序:把计数判断放在循环开头,确保只有当计数大于0时才执行累加。修正后的代码示例:
@R0 
D=M // 加载被乘数到D寄存器

@R2 
M=0 // 初始化结果寄存器R2为0

(LOOP)
@R1
D=M // 加载当前乘数计数到D
@END
D;JLE // 计数<=0时直接跳出循环

@R0
D=M // 重新加载被乘数
@R2
M=D+M // 累加被乘数到结果

@R1
M=M-1 // 乘数计数减1

@LOOP
0;JMP // 回到循环开头

(END)
@END // 无限循环终止
0;JMP

这个修正后的代码会先判断乘数是否大于0,再执行累加,同时用显式的M=M-1来减少计数,逻辑更清晰也更可靠。

内容的提问来源于stack exchange,提问作者Sam Perry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:22:46