LC3中如何输入多位正整数?现有双自然数输入代码故障排查
LC3 输入自然数代码的错误排查
核心错误
R2初始化代码不可达
你的AND R2, R2, #0语句放在了INPUT1循环的BRnzp INPUT1之后,而INPUT1循环的逻辑是:要么通过BRnzp INPUT1无限循环接收数字字符,要么通过BRn INPUT2/BRp INPUT2直接跳转到第二个输入阶段。这导致初始化R2的代码永远不会被执行,R2会保留寄存器中的随机初始值,最终第二个自然数的计算完全错误。修复方案:将
AND R2, R2, #0移动到INPUT2标签的开头,确保进入第二个输入循环前先重置R2。
次要问题与优化点
乘法循环逻辑冗余
你通过循环9次累加原数实现乘以10的操作,逻辑上是正确的,但可以简化:乘以10等价于R1 = (R1 << 1) + (R1 << 3)(即2倍值加8倍值),用ADD R1, R1, R1(左移1位)可以减少循环次数,提升执行效率。例如:; 替换原有的MULT1循环 ADD R1, R1, R1 ; R1 *= 2 ADD R3, R1, R1 ; R3 = 4*R1 ADD R3, R3, R3 ; R3 = 8*R1 ADD R1, R1, R3 ; R1 = 2*R1 +8*R1 =10*R1控制字符处理不完善
TRAP x20会读取所有键盘输入,包括退格、回车等控制字符。如果用户输入退格键(ASCII x08),会被判定为非数字直接跳转到INPUT2,导致第一个数的输入意外中断。如果需要支持输入修正,需额外处理退格字符并回退已累积的数值。
修复后的关键代码片段
START LD R6, ASCII ; load ascii offset for printing numbers NOT R6, R6 ADD R6, R6, #1 AND R1, R1, #0 INPUT1 TRAP x20 ADD R5, R0, R6 BRn INPUT2 ; 输入非数字,进入第二个数输入 ADD R3, R5, #-9 BRp INPUT2 ; 输入非数字,进入第二个数输入 ; 输入是数字,将R1乘以10并加上当前数字 AND R3, R3, #0 ADD R3, R3, #9 ADD R4, R1, #0 MULT1 ADD R1, R4, R1 ADD R3, R3, #-1 BRp MULT1 ; 完成乘以10的操作 ADD R1, R1, R5 ; 加上当前输入的数字 BRnzp INPUT1 INPUT2 AND R2, R2, #0 ; 移动到此处,确保R2初始化为0 TRAP x20 ADD R5, R0, R6 BRn PREP ; 输入非数字,结束第二个数输入 ADD R3, R5, #-9 BRp PREP ; 输入非数字,结束第二个数输入 ; 输入是数字,将R2乘以10并加上当前数字 AND R3, R3, #0 ADD R3, R3, #9 ADD R4, R2, #0 MULT2 ADD R2, R4, R2 ADD R3, R3, #-1 BRp MULT2 ; 完成乘以10的操作 ADD R2, R2, R5 ; 加上当前输入的数字 BRnzp INPUT2
内容的提问来源于stack exchange,提问作者Florian
相关产品推荐
相关产品推荐

