基于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时:
- 进入
LOOP,D=1-1=0,D;JLT(0 < 1?不成立),继续执行。 R0被设为0,R2从0变成1。- 回到
LOOP,再次计算D=0-1=-1,D;JLT成立,跳转到END。 - 最终
R2=1,符合预期。
额外优化提示
如果想让逻辑更严谨,还可以先处理除数为0的情况(不过题目里明确b是正整数,所以可以忽略);或者调整减法顺序(比如先判断再减法,避免R0存储负数,但Hack汇编支持负数,不影响最终结果)。
内容的提问来源于stack exchange,提问作者Pape Sow Traore
相关产品推荐
相关产品推荐

