LC-3汇编程序结束数字输入提示持续循环问题排查咨询
故障排查与修复建议
核心根因
结束数字输入后,将输入值从R0存入R4的指令位置放错了,导致校验时读取的始终是初始化为0的R4,永远无法通过校验触发循环退出。
你写的ADD R4, R0, #0指令放在了HALT语句和END .STRINGZ的后面,LC-3是按地址顺序执行指令的,结束输入GETC/OUT之后,程序直接运行校验逻辑,根本不会执行到后面的存R4的指令,校验用的R4永远是初始化的0值,输入任何值都过不了校验,自然进入死循环。
具体修复步骤
- 调整结束数字相关代码的执行顺序:
在RESTARTE块的GETC+OUT之后,立刻加存储R0到R4的指令,不要放在后续逻辑后面。
正确的顺序应该是:
RESTARTE LEA R0, END PUTS GETC OUT ; 输入完成后立刻把输入值存到R4 ADD R4, R0, #0 ; 再执行校验逻辑 LD R5, NASCII ADD R6, R4, R5 BRn RESTARTE LD R5, ADSCII ADD R1, R4, R5 BRp RESTARTE
- 删除原来放在
HALT后面的冗余ADD R4, R0, #0指令,那个位置的指令永远不会被执行到。
其他可优化的问题点
- 起始数字校验部分的注释有误:
LD R5, NASCII加载的是#-48不是注释写的#-57,后续注意注释和实际逻辑对齐 - 目前的校验逻辑只能覆盖0-9的单数字输入,你需求里写的是0-16,10到16的两位数输入现在没有处理逻辑,后续如果需要支持两位数输入要额外加代码处理
- 不要把字符串定义放在指令流中间,LC-3会把字符串的ASCII值当成指令执行,起始数字部分的
START .STRINGZ建议挪到程序末尾的常量区,和NASCII、ADSCII放在一起
内容的提问来源于stack exchange,提问作者Tre
相关产品推荐
相关产品推荐

