LMC程序实现n位二进制转十进制:循环不终止及输出异常求助
二进制转十进制LMC程序循环错误分析
问题描述
我正在完成以下挑战:编写一个LMC程序,将n位二进制数转换为十进制数。程序终止前输出转换后的自然数。第一个输入确定n的值(假设n≥4)。例如,若第一个输入为8,则需输入后续8个值;若后续输入为1、0、0、1、0、0、0、0,输出应为9。注意:n个二进制位输入中,第一个是最低有效位(least-significant bit),第n个是最高有效位(most-significant bit)。
尝试代码
IN BRZ INVALID_N STO N LDA N SUB FOUR BRP VALID_N INVALID_N:HLT VALID_N:LDA ZERO STO RESULT LDA ONE STO POWER LOOP: BRZ OUTPUT STO COUNT IN BRZ NEXT LDA RESULT ADD POWER STO RESULT NEXT: LDA POWER ADD POWER STO POWER LDA COUNT SUB ONE BR LOOP OUTPUT: LDA RESULT OUT BR LOOP ZERO: HLT ONE: DAT 1 POWER: DAT 32 COUNT: DAT 1 RESULT: DAT 21 N: DAT 0 FOUR: DAT 4
代码错误分析
- ZERO标签定义错误:你把
ZERO定义成了HLT指令,而非存储0的DAT单元。执行LDA ZERO时程序会直接终止,根本无法进入转换逻辑。修正:将ZERO: HLT改为ZERO: DAT 0。 - 循环次数初始化错误:进入循环前未把输入的n值存入
COUNT,反而将累加器中的1存入,导致循环次数完全错误。修正:在VALID_N段末尾添加LDA N和STO COUNT,让COUNT初始值等于n。 - LOOP开头的BRZ逻辑无效:第一次进入LOOP时累加器值为1,
BRZ OUTPUT永远不会触发;后续循环的判断位置也不对,应该在COUNT减1后判断是否为0来终止循环。修正:删除LOOP开头的BRZ OUTPUT,改为在SUB ONE后用BRP LOOP或BRZ OUTPUT控制循环。 - 输出后无限循环:
OUTPUT段执行OUT后用BR LOOP跳回循环开头,导致程序反复输出结果且永不终止。修正:将BR LOOP改为HLT,让程序输出后直接终止。
修正后核心逻辑示例
调整后的关键代码段:
VALID_N:LDA ZERO STO RESULT LDA ONE STO POWER LDA N ; 初始化COUNT为n的值 STO COUNT LOOP: IN BRZ NEXT LDA RESULT ADD POWER STO RESULT NEXT: LDA POWER ADD POWER STO POWER LDA COUNT SUB ONE STO COUNT ; 保存减1后的COUNT值 BRP LOOP ; 若COUNT仍大于0,继续循环 OUTPUT: LDA RESULT OUT HLT ; 输出后终止程序 ZERO: DAT 0 ; 正确定义ZERO为0
内容的提问来源于stack exchange,提问作者Zappo
相关产品推荐
相关产品推荐

