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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 01:15:22