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
相关产品推荐
相关产品推荐

