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
相关产品推荐
相关产品推荐

