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

基于Nand2Tetris的Hack汇编除法程序问题:R0=R1=1时结果异常

排查Hack汇编除法程序的相等值问题

这个问题很典型——你大概率是在循环的条件判断里只处理了被除数大于除数的情况,漏掉了两者相等的场景,导致当R0=R1=1时,程序直接跳过了商的累加步骤。

常见错误代码示例

比如你可能写了类似这样的逻辑:

// 错误版本:仅判断a > b时才执行循环
@R2
M=0     // 初始化商为0
(LOOP)
@R0
D=M     // D = a
@R1
D=D-M   // D = a - b
@END
D;JGT   // 只有当a > b时才继续循环,等于的情况直接退出
@R0
M=D     // a = a - b
@R2
M=M+1   // 商加1
@LOOP
0;JMP
(END)

当R0=1、R1=1时,a-b=0,D;JGT判断不成立,直接跳转到END,商R2始终是初始的0,自然不符合预期。

修正后的正确实现

只需要把判断条件从JGT(大于)改成JGE(大于等于),就能覆盖相等的场景。另外调整一下判断顺序,让逻辑更清晰:

// 正确版本:覆盖a >= b的所有情况
@R2
M=0     // 初始化商为0
(LOOP)
@R0
D=M     // 取出当前被除数a
@R1
D=D-M   // 计算a - b
@END
D;JLT   // 如果a < b,直接退出循环(不够减了)
// 能走到这里说明a >= b,执行减法并累加商
@R0
M=D     // 更新a为a - b
@R2
M=M+1   // 商加1
@LOOP
0;JMP   // 回到循环继续判断
(END)

测试验证

当R0=1、R1=1时:

  1. 进入LOOP,D=1-1=0,D;JLT(0 < 1?不成立),继续执行。
  2. R0被设为0,R2从0变成1。
  3. 回到LOOP,再次计算D=0-1=-1,D;JLT成立,跳转到END。
  4. 最终R2=1,符合预期。

额外优化提示

如果想让逻辑更严谨,还可以先处理除数为0的情况(不过题目里明确b是正整数,所以可以忽略);或者调整减法顺序(比如先判断再减法,避免R0存储负数,但Hack汇编支持负数,不影响最终结果)。

内容的提问来源于stack exchange,提问作者Pape Sow Traore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:55:13