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

LMC十进制转二进制程序问题:输入8时出现无限循环

LMC十进制转二进制程序错误分析与修正

你的代码存在三个关键问题,导致无限循环和初始值异常:

1. 错误的常量加载导致REMAIN初始值为901

LMC中LDA 0的作用是加载内存地址0的内容,而非直接加载数值0。你的程序开头地址0是INP指令,其操作码为901,因此执行STA REMAIN后,REMAIN被赋值为901,完全不符合预期。
要加载数值0,必须先定义一个存储0的变量(如ZERO DAT 0),再通过LDA ZERO加载。

2. NUM未更新引发无限循环

在LOOP循环中,你执行SUB TWO后没有将结果存回NUM,导致NUM始终保持输入的初始值8。每次计算8-2=6,结果永远非负,BRP CONTINUE会持续触发,循环永远无法终止。
必须在SUB TWO后添加STA NUM,让NUM的值随循环递减。

3. 核心逻辑偏离需求

当前代码只是统计NUM能被2减多少次(即求商),完全没有实现“除以2取余并输出余数”的核心需求。正确的逻辑应该是:

  • 每次判断NUM是否为0,不为0则计算除以2的余数(0或1)并输出
  • 将NUM更新为除以2后的商(即整数除法结果)
  • 重复上述步骤直到NUM为0

修正后的可运行代码

INP
         STA NUM
LOOP     LDA NUM
         BRZ END       ; NUM为0时终止循环
         LDA NUM
         SUB TWO
         BRP EVEN      ; 减2后非负,说明是偶数,余数为0
         ; 奇数处理:余数为1,输出后将NUM减1转为偶数
         LDA ONE
         OUT
         LDA NUM
         SUB ONE
         STA NUM
         BRA DIVIDE
EVEN     ; 偶数处理:余数为0,直接输出
         LDA ZERO
         OUT
DIVIDE   ; 将NUM除以2(通过减2实现整数除法)
         LDA NUM
         SUB TWO
         STA NUM
         BRA LOOP
END      HLT

NUM      DAT
ZERO     DAT 0
ONE      DAT 1
TWO      DAT 2

输入8时,程序会依次输出0、0、0、1,完全符合要求。

内容的提问来源于stack exchange,提问作者user22484615

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:05:13